FANCOMI Ad-Tech Blog

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

機械学習しかしていなかった高専生がアドテクの会社に来てみた

こんにちは、1週間のインターンでお世話になっているk_arimuraです。
普段は熊本でバイクに乗ったり研究で少し機械学習をしてみたりしています。

そんな中、今まで全く触れたことのないアドテクの世界をインターンを通して少しだけ覗いてみました。

参加したきっかけ

なんとなく就活を早めに始めて色んな会社を見ようと思って、初めて就活イベントに参加したことがきっかけでした。
その時に参加したのが12月に京都で開催されたサポーターズのエンジニア向け1on1面談会。
supporterz.jp

色々な企業とお話しさせていただいた中、自分が全く触れたことがないのに生活の中に溶け込んでいるアドテク業界にすごく興味を惹かれ、今回のインターンシップを参加させていただきました。
(あとは、面談させていただいた方がバイク好きで話がめっちゃ盛り上がったのも大きかった。)

1週間で何をしたのか

データ分析・機械学習の基礎

とてもありがたいことに、データ分析・機械学習のテキストを用意してくださっており、初日はその流れに沿って基礎基本を叩き込みました。
今まで機械学習を少し触ったことがあったのですが、データ分析の部分からしっかりと勉強したのは初めてでした。
また、普段使わないライブラリにも触ることができ、ここまで丁寧にしていただいていいのだろうかと思いましたがとてもありがたかったです。

実際にデータを使ってCTR予測

正直、びっくりしました。
事前にインターンシップの内容としてデータ分析とか機械学習をしようか、というお話しはいただいていたのですが、まさか生のデータを使って行えるとは思ってもいませんでした。

全くアドテクに関する知識がなかったのでCTRって何?って状態からスタートしたのですが、その辺の話から詳しく教えていただけたので安心しました。
CTRって何?って方はクリック率(CTR)とは | SEO用語集:意味/解説/SEO効果など [SEO HACKS] こちらを参考にしていただければいいのですが、要は広告見た人がどれだけクリックするかってことらしいです。

ビッグデータの洗礼を受ける

ビッグデータの洗礼を受けました。二日間くらいまるまる受けました。

予測に用いたデータは数百万件程のデータでしたが、今までそこまででかいデータを扱ってこなかった私はまずその扱いで苦労しました。
数万件とか数十万件であればある程度メモリがどうこうは(あまりよろしくはないが)無視しても動くことが多いですが、数百万件とかになると話が違って来ます。
使い終わった変数どうするかとかそこまで普段から意識していればよかったのですが全くそんなこと意識したことなかったので何回もJupyterのカーネルが落ちました。

具体的に何をしたのか

現状のCTR予測では機械学習を使っているものの、すごくシンプルなモデルを使っているそうです。
なので、現在世の中に出ている機械学習方法を使ってCTR予測を行おうというのが今回メインで行った内容でした。

なお、前半1日を基礎の習得、その後二日をビッグデータの洗礼を受けて過ごしていたので実際に検証できたのは1.5日くらいでした。
短期インターンの辛いところですね。

ロジスティック回帰

線形回帰にシグモイド関数を当てて出力の幅を(0 ~ 1)の範囲に当てはめた回帰モデルです。
今回のCTR予測問題のような押すか押さないかといった値を2値分類問題として扱う際によく用いられます。
xを入力、wを重みと考えると数式で表すと、以下のように表されます。
h(w^{T}x)=σ(w^{T}x)=\frac{1}{1+e^{(-w^{T}x)}}

MLP

先ほどのロジスティック回帰では入力に対して出力が1つある、といった形でしたが、Multi Layer Perceptron(略称:MLP)では、入力に対して中間層、出力層を持ちます。
最近流行りのディープラーニングなんかもこれを元に発展していったモデルですね。
今回は期間も短く、また計算に使用できるのが手元のノートPCのみといった状況だったので、かなりシンプルなモデルで学習を行わせました。

ランダムフォレスト

こちらは上二つの物とはかなり性質の違う、少し特殊なモデルです。
決定木と呼ばれる物で、ビジネスなんかでは決定理論の分野なんかで使われたりするそうです。(Wiki調べ)
ランダムフォレストとは名前の通り森です。木が集まっています。

検証結果

今回は1日分のデータを用いて、その内の8割を学習に、2割をテストに使いました。
また、比較用として3日分のデータで学習させたもの、7日分のデータで学習させたものも用意しました。
以下に、各モデルの結果を示します。(空欄は計り忘れです)

AUC LogLoss NE
ロジスティック回帰(scikit-learn) 0.673 0.152 0.957
ロジスティック回帰(Keras) 0.672 0.152 0.957
MLP 0.671 0.152 0.961
ランダムフォレスト 0.649 0.266 1.679
MLP(3日) 0.688 0.148 0.950
ロジスティック回帰(7日) 0.685 0.951
MLP(7日) 0.693 0.946

表の中に出ているパラメータですが、

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

以上の結果からランダムフォレストはCTR予測には向かないのかなーといった結果になりました。
また、今回シンプルというか何も考えていない構造のMLPが教師データ量が増えるとともに精度を上げていたので検証の価値があるかなと思いました。
(ただ、同じ期間からデータをランダムでsplitしているので過学習になっている可能性あり。)

インターン全体を通して

感想

短期間でしたが、ここまで技術的に苦労しながら色々身についたのは初めてな1週間でした。
もともとデータサイエンスに興味があり色々やろうと思っていましたが、実際にどういった分析をしているのか、どういう情報が求められているのかが中に入って初めてわかったので、これからの方針を決められそうです。
それと、アドテクの分野の事も少し触れる事ができ、常に新しい技術で更新されていく素晴らしい世界だなとすごく心を惹かれました。

また、社員の方もとても優しく、メンターの方にも気にかけていただきアドバイスを色々といただけたので安心してチャレンジすることができました。
あとお昼ご飯めっちゃ美味しかったです。ごちそうさまでした。
趣味のバイクのことで盛り上がったり、ラーメンが好きということを伝えたらラーメンに連れていってくださったり、おかげ様で充実した1週間を過ごすことができました。