MicroAd Developers Blog

マイクロアドのエンジニアブログです。インフラ、開発、分析について発信していきます。

HTTP cookieを使って年齢と性別を推定する

背景

表題をみた皆様はこう思われたに違いない「何を今更そんな話、、、、」。

実はこれ、

developers.microad.co.jp

でサラリと触れられている”SPSS"に関係があるんです。

SPSSという壁

マイクロアドではSPSS Modeler(以下SPSS)を使って年齢と性別を推定していました。いま流行の機械学習でね。

皆さんのSPSSについての印象は大まかに次の3パターンに分かれるでしょう。

「Ⅰ. SPSSってなんぞや?(((゚д゚; )」
「Ⅱ. (∩゚д゚)Rの有償版?」
「Ⅲ. あぁ、察した、、、(そそくさと退散)彡(* ̄з ̄)」

「( ・ิω・ิ)SPSSのスペシャリストです。」 なんて人はみないですよね。 マイクロアドでは具体的に次の課題を抱えていました。  

* 使用方法を知っている人材が市場に少ないので教育から始めざるを得ない
* GUIで簡単に操れるためきれいな設計が難しく、保守も難しくなる
* SPSSはライセンス料が高価

など(勿論、他にも色々)....

SPSSは使わない

おっと、自己紹介が遅れました。
私(id:purucat)は、”大脳洋公開日記”やTJOじさん等を横目に見ながら、学生時代までは脳科学の研究者を目指していた系のソフトウェアエンジニアです*1

SPSSは、先に上げたように課題も多く、 また、次ような条件が揃っていたため、アイデアとコードをスクラッチから実装してみました。
Python3でscikit-learnを使いました。

  • マイクロアドは新しいシステムの導入に寛容である *2
  • 私が大学院で機械学習にも関係する研究室にいたこともあり、記憶をほじくり返せば対応できなくはなさそうであった。
  • scikit-learn等のライブラリの充実 *3

本題 ~ HTTP cookieを使って年齢と性別を推定する

広告を配信する際に閲覧者の年齢や性別が分かると何が嬉しいのでしょうか?

閲覧者の情報を持っていない場合、広告は闇雲に配信されてしまいます。このような状況では、男性に対して女性向けのバッグなどの広告が配信される事もありえます。
一般的には、女性向け商品に男性は余り興味を持たないと思われますので、広告を出す側も、閲覧する側も良い思いはしないでしょう。

一方、閲覧者の年齢や性別を利用して配信することができれば、広告を出す側はターゲットとする層に配信できる為、広告の費用対効果が改善されます。 又、閲覧者にとっても自分の興味に近い広告が出るようになります。(Win-Winの関係?)

ただ、年齢や性別の情報が紐付けられた閲覧者というのは、ごく一部です。 そのため、情報が存在しない閲覧者については、年齢や性別を推定する必要があります。

問題の設定

では、年齢や性別を推定する際に使用可能なデータは何でしょうか?

一例とはなりますが、 ホームページにアカウントを登録し、且つ、登録情報の広告利用への許諾をしていただいた閲覧者からは、 下記のような、データを提供していただいております。

使用可能なデータ 説明
広告閲覧者が訪問したURL https://www.microad.co.jp/about/?search=this-is&query=example マイクロアドのcookie を持っているBrowserに紐づいている 
年齢や性別の情報 年齢:68歳、性別:男 業務提携先から頂戴した

図で表すと下記の図のようになります。

f:id:purucat:20180427172437p:plain

以上のようなデータを「学習データ」として、ホームページ訪問履歴を持つ閲覧者の年齢と性別を推定するというのが問題設定となります。
下記が推定対象の具体例になります。

推定対象 推定対象の広告閲覧者の行動履歴の例
年齢 `競馬/top.htm`を1回、`OX新聞/page1.htm`を1回、`OX新聞/yyy/xxx.htm`を1回、`www.microad.co.jp/`を1回 訪問した
性別 `競馬/top.htm`を1回、`OX新聞/page1.htm`を1回、`OX新聞/yyy/xxx.htm`を1回、`www.microad.co.jp/`を1回 訪問した

f:id:purucat:20180427172520p:plain

使用可能なデータを使って「学習」をし、推定対象の広告閲覧者の行動履歴を使用して推定対象の値を決めるという問題です。

以降、主に性別推定についてお話しますが、実際には同じ枠組みで年齢推定もやっていました。

データを可視化してアプローチ方法を考える

何はともあれ、データの特性を把握しないと、どのような手法でアプローチすればよいかわかりません。 まずは定石の可視化をしてみました。

閲覧者が訪れたサイトがどういう性質のものかを分析するためにはHTMLのmeta tag (descriptionやkeywards)を 見るのが直感的に良さげと思われます。

ただし、使用可能な学習データの分布が不明であるなどの理由から、まずはFully Qualified Domain Name (FQDN)毎の被訪問数*4と、そのユニークな被訪問数を男女比率(男性が青。女性が赤)で表示するように、プロットしてみました。

f:id:purucat:20180427174005p:plain

いい感じに男女比率がFQDN毎にバラけているのがわかります。 また、サイト毎に1ユーザの訪問頻度が大きく異なることもわかりました。 取り敢えずは、FQDNレベルの粒度で「特徴量」を作成して良さそうです。 *5

ついでに、閲覧者毎の一日あたりのFQDN訪問頻度もみてみましょう。

visit to different FQDNs per unique audience id

横軸の"Unique audience id"は閲覧者毎に訪問頻度が多い順にソートしたものです。 閲覧者毎にサイトを訪問する頻度が違うという事実を踏まえて、機械学習の方法を考えるのが良さそうです。

モデリング

FQDN毎に閲覧者の性別が異なる傾向にあるのがわかりました。 又、訪問数も閲覧者毎に異なることがわかりました。

f:id:purucat:20180427180448p:plain

scikit-learnで機械学習をするためには、学習に利用する「特徴量」を数値化する必要があります。

今回、上図の女性と男性を次のような計算式を利用して、次のような数値ベクトルの特徴量で表現しました。

女性: ([0.9, 0.1] + [0.5, 0.5]) / 2 = [0.7, 0.3]
男性: ([0.2, 0.8]*2+[0.5, 0.5])/3= [0.3, 0.7]

特徴量のスケールを揃える観点*6と数値計算の収束という観点からL1ノルムを使いました。

学習モデルは多項ロジスティック回帰を使用しました。

結果

性別

性別の推定は正解率(accuracy)で67~75%ほどの精度でした。

年齢

「10歳から21歳までの年齢」である人に対して広告を出したい、、、という条件で広告を出すのは一般的であると思われますが、 年齢の推定を「点推定」、つまりピンポイントで推定してみるということもやってみました。

その結果、ちょっと興味深い結果が出たのでチラ見せしちゃいます。 あくまでも一例ですが、0歳から99歳の100分類問題として学習と推定をすると下図の様になりました。 f:id:purucat:20180427182846p:plain 横軸が正解で、縦軸が推定です。 対角線に分布しているデータは推定が正しかったことを表します。

ただFQDNだけを特徴量とするのは荒すぎのようで、閲覧者毎の年齢由来の特徴を完全には表現出来ていないようです。 今後はサイトのmetaタグから、特徴量を作り、実験してみるのも良さそうですね。

結果の総評

以上のような精度になった理由として、家族で共用のブラウザを利用しただけで、ある意味正解がない状態ができてしまうという事などが考えられます。 そこら辺を考えるとまずまずの精度ではないかとも思えてきます。

プロダクション環境に組み込む

プロダクション環境に組み込む前に10-分割交差検証などを実施しました。

結果、SPSSを使う時以上の推定の安定性や、計算速度の性能向上が確認できたため、SPSS版の推定処理を置き換える形で、プロダクション環境に組み込みこむ事が出来ました。

データ収集と主な加工はHiveで分散処理させています。 推定部分は諸事情により、Pythonをインストールした一台のサーバーで実行しているため分散処理はできてはおりません。 ただ、現在のデータサイズでは一台でも処理上の問題はありませんでした。

終わりに

ご拝読ありがとうございました。

マイクロアドでの仕事のイメージが少しは皆様に伝えられたならば光栄です。-=ニ_(´・∀・`)_/ニ=-イェーイ♪

*1:脳科学系に携わっていた方々は、アドテクがブームであった頃はよく広告系に流れていたものです。

*2:IT業界には変化を嫌うおじさんとおばさんの溜まり場があったりするけれども。

*3:始めるまでは、アルゴリズムも自分で実装する気持ちでいたのだけど。

*4:複数回訪問されている場合もカウント。

*5:あまり細かい粒度でみてしまうと、「過学習」してしまいますしね。ここには記載しませんが、その他考慮したことは色々あります。

*6:訪問頻度は何らかの特徴にはなりえそうですが各閲覧者は「閲覧者」という観点では平等ですので、訪問頻度が多い閲覧者ほど相対的に「強い」特徴であるべきではありません。