F@N Ad-Tech Blog

株式会社ファンコミュニケーションズ nend・nex8・viidleのエンジニア・技術ブログ

アドテクの会社でCTR予測をしてみた。

はじめまして!5日間インターンとして参加させて頂いた中島です。
データ分析のインターンは初めてだったのですが、簡単に紹介させて頂きます。
今回はCTR予測を行いました。

CTR予測

CTRとは「ユーザに広告を表示しクリックされる確率」を言います。
広告配信の最適化は、限られた広告予算の中でクリック率を最大化することであり、そのためにはCTRを正しく予測することが不可欠です。
この5日間で、より精度の高いCTR予測をするモデルの設計に取り組みました。

5日間の流れ

1日目 事務処理と大規模データベースへのアクセス

午前には事務手続きをし、その後アドテクについて教えて頂きました。

本格的に業務が始まったのは午後から。
まず、CTR予測をするためのデータの取得をします。Treasure Dataに接続し、SQLを用いて必要なデータを取り出しました。ここで、はじめてPrestoに触れました。

なんとなくSQLが書けるようになったら、今度はjupyter notebookから接続し、データをローカルの環境に引っ張ってきます。

広告のリクエスト数が1億以上あったため、
データをうまくサンプリングしないとカーネルが落ちて大変でした。

引っ張ってきたデータを眺めながら、広告のクリックされる確率の低さ(0.5%くらい?)に驚きつつ1日目を終えました。

2日目 データ整形とネガティブダウンサンプリング

この日は昨日とってきたデータの整形とネガティブダウンサンプリングを行いました。
ネガティブダウンサンプリングとは、意図的に負データを減らすことで、正データとの比を揃えることです。
今回のCTR予測ではクリックされない広告のリクエストを100分の1程度に減らしました。

その後欠損データの修正などデータハンドリングを行い、ロジスティック回帰を用いて学習しました。

モデルの評価に使うのはAUC, LogLoss, NEの3つ

AUC Area under the curve 予測した際のROC曲線の下側部分の割合。大きいほどよい。
LogLoss Logarithmic Loss 予測値と正解との距離を対数とった値。小さいほどよい。
NE Normalized Entropy モデルにより予測されたLogLossを、平均から予測されたCTRのLogLossで割った値。1より高いと平均から予測した方がまし。

それぞれの違いは今回メンターについてくださったsakaiさんの記事を参考にしてください。

tech-blog.fancs.com

3日目 特徴量の追加とグリッドサーチ

2日までは限られた特徴量のみを使っていたのですが、3日目から特徴量を増やしました。

そしてグリッドサーチを用いてロジスティック回帰モデルのパラメタチューニングを行いました。

が、大して成果が出ることはなくこの日は悲しみの帰宅。

4日目 他の学習モデルを試す

3日目まででロジスティック回帰に限界が見えてきた(個人的な特徴量エンジニアリング力不足)ので、他の手法を試してみることにしました。
今回試したのがLightGBMです。
Welcome to LightGBM’s documentation! — LightGBM documentation

LightGBMはXGBoostなどと同じ勾配ブースティングの一つです。
XGBoostと同程度の性能でありながら、より高速で機械学習コンペなどでもよく目にすることから使ってみました。

ワンホットエンコーディングなど色々勝手にやってくれるのでとても楽(特徴量エンジニアリングとは、、)

5日目 特徴量選択とパラメータチューニング

昨日試したLightGBMのモデルのスコアを上げるため、もう一度使用する特徴量を見直すことにしました。
LightGBMには訓練データのそれぞれの特徴量の重要度を測るメソッドがあるので、それを用いて特徴量の選別を行いました。

f:id:fan_k_nakashima:20180831182033p:plain
特徴量名は伏せてますが、こんな感じで可視化できます。

その後特徴量を選択し、簡単なパラメタチューニングを行った最終的な結果がこちら

f:id:fan_k_nakashima:20180831182110p:plain

訓練データ:2018年7月1日~31日のログ
テストデータ:2018年8月1日~7日のログ

学習モデル AUC LogLoss NE
XGBoost 0.71 0.0326 0.9557
LightGBM 0.74 0.0320 0.9391

同時に試したXGBoostのスコアも載せてあります。
スタッキングなどをすればもっと上がったんでしょうが、5日間ということもあってここでタイムアップ。
NEが0.9391なので平均から予測するよりは良いモデルになってくれました。

まとめと感想

  • LightGBMを用いてそこそこ精度の高いモデルができた
  • ビックデータのハンドリングはサンプリングが大事

まともにデータ分析を行ったのは初めてでしたが、メンターのsakaiさんが丁寧に教えてくださったおかげで全体の流れがみえました。
レベルに合わせて教えて頂けるので、聞きたいことを聞きつつ伸び伸びやらせて頂きました。
生データを使ってデータ解析をしたい人、自分のペースに合わせて進めたい人にはとても良いインターンなのではないかと思います!
5日間お世話になりました!