背景
表題をみた皆様はこう思われたに違いない「何を今更そんな話、、、、」。
実はこれ、
でサラリと触れられている”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歳、性別:男 | 業務提携先から頂戴した |
図で表すと下記の図のようになります。
以上のようなデータを「学習データ」として、ホームページ訪問履歴を持つ閲覧者の年齢と性別を推定するというのが問題設定となります。
下記が推定対象の具体例になります。
推定対象 | 推定対象の広告閲覧者の行動履歴の例 |
---|---|
年齢 | `競馬/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回 訪問した |
使用可能なデータ
を使って「学習」をし、推定対象の広告閲覧者の行動履歴
を使用して推定対象
の値を決めるという問題です。
以降、主に性別推定についてお話しますが、実際には同じ枠組みで年齢推定もやっていました。
データを可視化してアプローチ方法を考える
何はともあれ、データの特性を把握しないと、どのような手法でアプローチすればよいかわかりません。 まずは定石の可視化をしてみました。
閲覧者が訪れたサイトがどういう性質のものかを分析するためにはHTMLのmeta tag (descriptionやkeywards)を 見るのが直感的に良さげと思われます。
ただし、使用可能な学習データの分布が不明であるなどの理由から、まずはFully Qualified Domain Name (FQDN)毎の被訪問数*4と、そのユニークな被訪問数を男女比率(男性が青。女性が赤)で表示するように、プロットしてみました。
いい感じに男女比率がFQDN毎にバラけているのがわかります。 また、サイト毎に1ユーザの訪問頻度が大きく異なることもわかりました。 取り敢えずは、FQDNレベルの粒度で「特徴量」を作成して良さそうです。 *5
ついでに、閲覧者毎の一日あたりのFQDN訪問頻度もみてみましょう。
横軸の"Unique audience id"は閲覧者毎に訪問頻度が多い順にソートしたものです。 閲覧者毎にサイトを訪問する頻度が違うという事実を踏まえて、機械学習の方法を考えるのが良さそうです。
モデリング
FQDN毎に閲覧者の性別が異なる傾向にあるのがわかりました。 又、訪問数も閲覧者毎に異なることがわかりました。
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分類問題として学習と推定をすると下図の様になりました。 横軸が正解で、縦軸が推定です。 対角線に分布しているデータは推定が正しかったことを表します。
ただFQDNだけを特徴量とするのは荒すぎのようで、閲覧者毎の年齢由来の特徴を完全には表現出来ていないようです。 今後はサイトのmetaタグから、特徴量を作り、実験してみるのも良さそうですね。
結果の総評
以上のような精度になった理由として、家族で共用のブラウザを利用しただけで、ある意味正解がない状態ができてしまうという事などが考えられます。 そこら辺を考えるとまずまずの精度ではないかとも思えてきます。
プロダクション環境に組み込む
プロダクション環境に組み込む前に10-分割交差検証などを実施しました。
結果、SPSSを使う時以上の推定の安定性や、計算速度の性能向上が確認できたため、SPSS版の推定処理を置き換える形で、プロダクション環境に組み込みこむ事が出来ました。
データ収集と主な加工はHiveで分散処理させています。 推定部分は諸事情により、Pythonをインストールした一台のサーバーで実行しているため分散処理はできてはおりません。 ただ、現在のデータサイズでは一台でも処理上の問題はありませんでした。
終わりに
ご拝読ありがとうございました。
マイクロアドでの仕事のイメージが少しは皆様に伝えられたならば光栄です。-=ニ_(´・∀・`)_/ニ=-イェーイ♪