FANCOMI Ad-Tech Blog

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

インターンでCTR予測をしました

初めまして、9月2日から9月6日の5日間、ファンコミュニケーションズのインターンでお世話になった高専生4年の天野まゆです。今回はデータ分析ということでCTR予測というものに取り組みました。

CTR予測とは

CTR(Click Through Rate)はクリック率といい、動画や画像などの広告が表示された回数に対してどのくらいクリックされたかを割合で表します。
また、CTR予測を行うことによってユーザーのニーズがわかり効率的に広告を表示させることができます。

学習、テストデータの用意

CTR予測を行うために、必要なデータを用意します。しかし、そのままデータを出してしまうと不均衡データであったり、膨大な量のデータになってしまうのでハンドリングが大変になります。なので、今回は以下に示す2つの方法を使って学習、テストデータの用意をしました。

ランダムダウンサンプリング

データの中から等しく抽出(無作為抽出)し削除すること

ダウンサンプリング

不均衡なデータで偏った方のデータ削除すること

モデルの作成

テストデータが用意できたところでモデルを作成していきます。今回はscikit-learnというPythonの機械学習ライブラリを使ってモデルの作成を行いました。
まず、scikit-learnで学習するために先ほど作成したデータを数値化する必要があります。そのためにone-hot変換をしました。
one-hot変換が終わったところでモデルの作成に取り掛かります。今回は、ロジスティック回帰を使った予測モデルをインスタンス化し、fit関数で学習を行いました。

モデルの評価

今回のモデルの評価方法には、AUCとROC曲線を使いました。

ROC曲線

横軸をFalse Positive Rate(正解が負であるものを間違えて予測する割合)、縦軸をTrue Positive Rate(正解が正であるものを正しく予測した時の割合)とした時にできる曲線のこと。

AUC

ROC曲線下の面積。1に近くなればその予測モデルの精度は良く、0.5に近くなればランダムに予測して当たっていることになるので予測モデルの精度は悪いことがわかります。

これらを使って出た結果が以下のグラフのようになります。

f:id:fan_m_amano:20190905174348p:plain
ROC 曲線とAUC結果

※ グラフ内に書いてあるareaがAUCの値です。


AUCが1に近ければ近いほど精度が良いのですが、どこかで間違えてしまったのか非常に精度が悪い結果になってしまいました。

感想

データ分析は学校の授業でデータの取得から正規化、簡単な解析をやっていたのですが、生の膨大な量のデータを目の当たりにして最後までできるか不安でした。ですが、メンターの方がわからないことなど丁寧に教えてくださった甲斐もありなんとかモデルの評価までたどり着くことができました。今回は初めてのインターンということでとても緊張していましたが、食事会を開いてくださったり、社内も非常に過ごしやすく楽しい5日間を過ごせました。短い期間でしたがありがとうございました。

広告配信がどのように作られているのか

はじめに

はじめまして。 関西の大学院に通う博士前期課程1年の馬越です。 株式会社ファンコミュニケーションズさんにて9月2日〜9月6日の間インターンシップに参加させていただきました。 今回、私が参加させていただいたコースはScalaを利用した広告配信システムの開発でした。 それでは参加経緯、インターンシップ内容、感想、ファンコミュニケーションズさんについて書いていきたいと思います。

参加経緯

ファンコミュニケーションズさんを知ったのはサポータズさんの1on1面談イベントにて 社員さんとお話しをさせていただいたのがきっかけとなります。 そこでの会話をきっかけに、広告配信システムがどのように作られ、配信されるのか非常に気になっていました。 また、夏休み期間中に新しいことに挑戦したいと思い、何か新しい言語を学べるインターンはないかとWantedlyさんのサイト眺めていた際に ファンコミュニケーションズさんのインターンシップではScalaを利用して広告配信の裏側を知ることができると目に入り、応募いたしました。 応募からすぐに返信をいただき数日後に面談をさせていただきました。

インターンシップ内容

今回インターンシップの内容は、Scalaを利用してミニDSPを構築しようということでした。 アドテク業界は主にSSPとDSPというのに分かれております。 SSP、DSPとはなんぞや?という方は以下のサイトを参考にしてみてください。

kigyotv.jp

今回のインターンでは、メディア(アプリ等)からリクエスト(アプリIDや広告枠を売りたい最低金額)等が送られ、 その情報をもとに、広告主が買いたい金額を予測し(今回は実装していない)、最適な広告を決定し、メディアに返す処理を実装しました。

1日目

午前中は社内見学とSSP、DSPの解説がありました。 午後からはメンターに指導をいただきながら、どう開発を進めていくか話し合いました。 また、私がScalaが初心者なため、Scalaの基本的事項をおさらいしました。 その後、ミニDSPを構築するためのアーキテクチャ選定を行いました。 ここから少し技術的な内容になります。

まず、使用言語はScalaです。 Scalaはオブジェクト指向と関数型言語の両方を兼ね備えております。 (慣れまで少し時間がかかりそうだと感じました。) IDEはIntelli J Communityを利用しました。

今回の開発はDSPの仕様からサーバとデータベースが必要となります。 また、SSPからDSPへのリクエストの応答時間が100msであることが必須条件となっているので そこを考慮しメンターに相談しながらアーキテクチャを選定していきました。 サーバはWebアプリケーションフレームワークであるFinatraを利用しました。

以下のサイトを参考にしました。 qiita.com

qiita.com

FinatraでWebアプリケーションの雛形を作って1日目は終了しました。

2日目

2日目からは主にAPIの実装に入りました。 APIにリクエストがきた場合の処理を実装しました。 今回はSSPからの情報を元に、最適な広告を返す処理として、

  • データベースから広告のデータを取得
  • メディア(アプリ等)ごとに表示する広告をフィルタリング
  • 機械学習にリクエストを送信し各広告の入札金額の取得
  • メディアからの希望入札金額に下回っている広告をフィルタリング
  • 一番高い広告を決定し、SSPに送信

という流れになっております。

ここで、受け入れ条件として応答時間が100msであることが必須のため、 データベースを作る際にsqlを毎回利用していると トラフィックが増えた際に仕様を満たせないため、Redisを利用することになりました。 Redisは以下のサイトを参考にしてください。

qiita.com

今回はScalaでRedisを利用したいため、scala-redisを利用しました。

github.com

サーバとRedisを繋ぐ時は、コネクションプールを利用し接続しています。

https://wa3.i-3-i.info/word12762.html

3日目

3日目は2日目の続きです。 サーバとRedisを接続できたので、実際に広告データ(ダミー)を取得しました。 そのデータを元に、フィルター処理を実装しました。 メンターに指導をいただき、fillter関数やMap関数を利用しScalaっぽい書き方で実装できました。 if文を利用せずに関数を実装できたのがとても感動しました。 次にサーバから機械学習APIにリクエストを送信し 返ってきた値をフィルタ処理し、SSPに返信しました。 ここまでで、ミニDSPのメインの機能を完成させることができました。 実際にcurl等でAPIにリクエストを送信すると実際にデータを返すことができました。

4日目

4日目はリクエストがきた際にログ保存を行う処理を実装しました。 Scalaで何かログを保存しやすいのはないかと調べると、logstash-logback-encoder というものを発見し、こちらを利用することにしました。

labs.septeni.co.jp

一通りシステムが完成したので、実際に応答時間を調べてみました。 今回はローカル環境なのであまり意味がありませんが、形だけどのくらいか調べました。 はじめはHttpieを使用してtime curlで応答時間を調べていましたが、300ms程度で かなり遅いことに悩まされました。 原因がHttpieであることを発見し、terminal等で確認すると100ms以内で実行できました。

また、Apace Benchを利用してWebサーバの負荷テストも実施してみました。 こちらもローカル環境なのであまり意味がありませんが、以下のサイトを参考にしました。

qiita.com

最後にメンターに自分の書いたソースコードのレビューをいただき、 コードのリファクタリングを行いました。 実装するために処理を長く書いてしまい見辛いコードになっていたのを 1クラス1機能に分類し、不要なコード等を除去しました。 フィードバックがあったことにより今後どのようにコードを書いていけば良いか理解することができました。

5日目

5日目は午前中は退職手続き等を済ませ、午後から成果発表を行いました。 発表が終わり、このブログを書いて終了です。

時間が余ったのでSSPを作成して自分のDSPにリクエスト送信することになりました。

感想

今回のインターンシップで広告配信の裏側を理解することができました。 アドテク業界ではユーザ、メディア(アプリ等)、広告主の関係があり、今回はメディアと広告主を繋ぐDSPを開発しました。 その中で、実際にアドテク業界が使っている技術などをメンターに教えていただき大変勉強になりました。 また、メンターにソースコードのレビューをしていただき、どのように書いたら綺麗になるのかを教えていただきました。 インターンシップを通して様々な技術と触れることができたので大変良かったです。 今回の開発を通して、ソースコードの書き方やオブジェクト指向の概念等曖昧な部分があったので、 今後はこの経験を活かして自分なりにスキルアップを目指したいと思います。 インターンシップに受け入れていただき、そして、5日間ご指導いただき本当にありがとうございました。

ファンコミュニケーションズさんについて

最後になりますがファンコミュニケーションズさんについて少し書きたいと思います。 インターンを始める前は、どのような雰囲気で開発されているのか全く想像がつきませんでした。 いざ、インターンシップに参加してみると社内全体がほんわかしていると感じました。 自社開発のため殺伐とした環境ではないためリラックスした状態で開発ができると実感しました。

【インフラインターン2019(1)】 本番サーバを作る Redis

はじめまして

ファンコミュニケーションズさんで2週間のインターンに参加させていただきました熊田です。

今回のインターンでは、3つのメニューをこなさせていただきました。 本記事ではその1つ目である「本番サーバを作る Redis」について書かせていただきます。

続きを読む