Gunosyデータ分析ブログ

Gunosyで働くデータエンジニアが知見を共有するブログです。

エンジニア向けデータ分析サマーインターンシップに参加して

こんにちは、来年度からデータ分析部に所属する山田です。 今はまだ学生です。 一足先にGunosy Summer Internship 2017 データ分析コースのメンターアルバイトとして参加したので、その様子や知見を記していきたいと思います!

Gunosy Summer Internship 2017 について

Gunosy Summer Internship 2017とは、株式会社Gunosyが2017年夏に開催した短期インターンシップです。

の2つのコースが実施されました。

「経営企画・戦略コース」では2日間で講義や新規企画課題などをこなす内容で、 課題の優勝者には豪華ディナーや1次選考免除等の特典がありました。

「データ分析コース」では3日間で講義やデータ分析コンペを行い、 コンペ優勝者には賞金10万円(!!!)、2位3位の人にもお肉のギフトカタログが贈呈されます。

「データ分析コース」の様子

データ分析コースのインターンシップは今年が2年目です。 去年は私も学生として参加しましたが、 その時は2日間・1回のみだったのに比べ今年は3日間・2回(8/30-9/1・9/11-9/13)と、大幅にグレードアップしています!

スケジュールは以下のような感じでした。

時間 内容
1日目 10:00 集合
10:30-11:00 講義①
「データ分析部とプロダクト開発の関わり方」
13:00-13:30 課題発表
13:30-18:30 ワーク
2日目 9:30 集合
9:30-18:30 ワーク
3日目 9:30 集合
9:30-16:30 ワーク
16:30-17:30 講義②
「Gunosyの歩みについて」
17:00-18:00 成績発表等

講義

1日目と3日目には共同創業者である吉田と関から、「データ分析部とプロダクト開発の関わり方」と「Gunosyの歩みについて」の講義がそれぞれ行われました。

私も一聴講者として講義を聴いていましたが、

  • 思い込みでサービスを作るのではなく、まずユーザの行動ログから何が必要とされているのかを分析する
  • 失敗することは当然。賢く失敗すればその後の分析や開発にも活かせる

といったデータ分析やプロダクト開発において重要なことや、 Gunosyがこれまでどのようなことに挑戦してきたのかを学ぶことができ、非常に為になる講義でした!

ランチ・新卒トーク

1日目、3日目はグループごとに六本木のお店でランチを摂りました。

2日目はスキップヒル*1で弁当を食べながら、今年度からデータ分析部で働き始めた米田、荻原が新卒トークをしました。 二人とも入社経緯や、入社してからどのような仕事をしているのかわかりやすく話してくれました!

インターン参加者は全員学生なので、年齢の近い二人の話はとても身近な例として参考になったのではないかと思います。

ワーク

1日目の講義&ランチの後はいよいよ本インターンのメインとなるワークの課題発表です! 今回のテーマは「グノシーアプリ内の広告CTR予測」

グノシーアプリ内で広告が表示された時の「ユーザの性別・年齢」や「広告の種類」が与えられるので、その広告がクリックされたかどうかを予測するという課題です!

データ分析インターンでは「データとアルゴリズムの企業」らしく、予測結果に対して「実データによる評価」が行われ、予測精度に基づくスコアを算出します。 Kaggleのコンペ等と似た方式ですね。

また、このインターンでは「できるだけ実務に近い経験」をしてもらいたいので、予測の処理に時間制限を設けています。 というのも、実際の環境では非常に短い時間で予測結果を返すことを要求されるので、 結果を返すまでに何秒もかかってしまうようなプログラムではいくら予測精度が高くても使い物になりません。

つまりこの課題では「予測精度」と「処理時間」の二つの要素が同時に問われることになりますね。

ベンチマークシステム

Gunosyではこれらの要素を計るために、インターン用ベンチマークシステムを開発しています。 インターン生には一人一人AWSインスタンスが与えられているので、 そのインスタンス内でベンチマークプログラムを叩けばいつでもスコアを算出できるので、予測精度や実行時間を見ながら何度でもトライすることができます!

また、実行したベンチマーク結果は自動でダッシュボードに反映され、誰でも確認することができます。

f:id:mtjune:20170929133527p:plain

全員のベストスコア、順位などが確認できるので僕自身も非常にモチベの高まる環境で作業することができました!

作業環境

作業は4つのグループで机を分けて行い、それぞれのグループには社員のメンターが付いているので詰まったところなどがあればすぐに質問できます。

私もメンターとして控えていましたが、忙しい時はずっと誰かしらの相談に乗っている状態だったりで、 それだけ真剣に取り組んでいただけていると思うと非常に嬉しい気持ちになりますね!

結果発表

3日目のワークが終わると、いよいよ結果発表......の前に、社員がインターン生全員のベンチマークを走らせ、最終スコアを算出します。

実はスコア算出用のテストデータは2分割されており、ワーク中のベンチマークではそのうちの片方だけを使ってたんですね。 最終スコアではもう片方のデータを使うので、ワーク中のデータに特化してチューニングして最終スコアでガクンと悪くなってしまった......となる可能性もあり、 実はそこもポイントの一つです。

さて、最終スコアの計算も終わり、発表直前の会場......

f:id:mtjune:20170929143056j:plain

まずメンターの石塚がこの課題の狙いや要点について説明します!

f:id:mtjune:20170929143203j:plain

発表が始まります!

f:id:mtjune:20170929143445j:plain

1位の方には賞金10万円、2位と3位の方にはお肉のギフトカタログが贈られました!

f:id:mtjune:20170929150004j:plain

また、1位〜3位の人がどのような手法を使ったのかを簡単に説明していただきました!

f:id:mtjune:20170929150335j:plain

優秀な上位陣の話は、メンターの私にとっても非常に参考になる話でした。

このインターンでは実データを使って実務に近いタスクをこなしてもらうものでした。 3日間と短い期間ではありましたが、参加者にはぜひこの経験を今後に活かしてほしいと願っています!

インターンでの気付き(メンター山田)

メンターをしていて、重要だと感じたのは

  • データを可視化して傾向を把握すること
  • 手段を選ばないこと
  • 試行回数を増やすこと

あたりで、このへんをちゃんとしている人はどんどんスコアが伸びている印象でした。

今回の場合、とりあえず年代や性別ごとにCTR集計してそれを出すだけでそこそこのスコアにはなるので、 いきなり機械学習に挑戦したが上手くいかずに結局そのスコアを超えられない......という例もあり、 まずは素朴な手法から試すのが良いのではないかと思います。

また、素朴な手法ほどデータをつぶさに観察する必要が出てくるので、結局そのあたりは後に機械学習するにしても役立ちますし無駄になることは少ないでしょう。

試行回数に関しては今回の出力形式(json)が少々扱いづらかったこともあり、それで詰まって時間を消費している人も多かったように感じます。

インターン参加者の感想 第一回

f:id:mtjune:20170929151027j:plain

京都大学大学院 澤田さん

こんにちは。サマーインターンシップに参加した澤田です。ハッカソンでは、優勝という望外の結果を得られ、嬉しく思います。この経験を通して気づいたこと・学んだことをまとめようと思います。

手法について

私が最終的に提出したモデルは、ルールベースによる予測値とロジスティック回帰による予測値を加重平均するという単純なものです。ライブラリの使用に不慣れなため、データの前処理の実装などで苦労したところはありますが、やっていることはごく初歩的なことです。時間があれば、もっとモデルを吟味してスコアを上げる余地はあるだろうと思います。

限られた時間で形にすること

このように単純な手法ですが、3日間という短期間で、曲がりなりにも優勝するような手法にたどり着いたプロセスにこそ大きな学びがあったと感じます。 初日の失敗談から話しますが、私はいきなりSVMを全データの8割で回そうとして、「全然終わらないな〜」とかやっていました。その時は知らなかったのですが、SVMはデータ数Nに対してO(N2)の時間計算量なので、終わるわけがなかったのです。そんなことがあったので、小さく単純なモデルから始めようと方針を改めました。ほら、「Done is better than perfect.」って言うじゃないですか。 というわけで、性別・年齢によるルールベースのモデルから始めて、少しずつ特徴量を増やしていくとその時点でのリーダーボード上でトップのスコアを取れました。このスコアはのちに更新されるのですが、モデル作成の過程で得られた、データの構造に関する理解や手元でスコアを計算する環境(スコアサーバーに投げると5分もかかる!)なんかは後々とても役に立ちました。 ルールベースでの試行錯誤から、複数の特徴量を複雑に組み合わせずとも、単純なモデルだけでスコアが伸ばせそうだと感じたので、より多くの特徴を使うためにロジスティック回帰に移行しました。最終的には同じようにロジスティック回帰をした参加者と1,2位を競い合うことになったので、悪くない選択だったのかなと思います。2位のモデルとわずかに差が出たのが、ルールベースでの予測値と加重平均をとった分だったとしたら、ルールベースくんこそが影の立役者なのかも?

教訓みたいなもの

じゃあ、なにを学んだのかと言われると - 試行錯誤のサイクルをなるべく短くすること - 簡単・確実なことから一歩ずつ進むこと こんな感じです。今更そんなことかよ、というくらい聞き飽きたことだと思いますが、慣れないタスクについてこれを実践するのは意外と難しいですね。SVMに突っ込んで「全然おわらねェ」とかやりがちです。

以上、3日間でしたがとても充実していて多くを学ぶことができました。社員の方ともよく話すことができて大満足です。ちなみに昼ごはんはしゃぶしゃぶと寿司でした!!

東京大学 原田さん

用いた手法について

私は最初の1日を与えられたデータの素性一つ一つとクリック率との関係を調べていき、どの素性がクリック率に大きな影響を及ぼすのだろうかと探っていました。 ある程度当たりをつけたら計算速度が速くて検証が多くできるだろうという理由からロジスティック回帰を用いました。 モデル生成してテストデータに適用するときにtrainデータに存在していたカテゴリー値がtestデータに無く、エラーを起こしてしまいましたが、one hot dictvectorizerを用いた処理をメンターの方に教えて頂き、無事適用することができました。 もっと色々な特徴量で試してみたかったのですが時間切れになってしまいました。

参加してみての感想

インターン最終日の懇親会で、他の参加者がユーザーに関わる素性に注目しているが広告の素性を吟味した方は少ないように思えたので、1日目にしたデータの特徴を一つ一つ丁寧に見るという作業をこれからも大事にしていきたいです。 大学の授業でデータサイエンス・機械学習について一通り学んでいましたが実践の場は初めてで、自分の知識不足を実感すると同時にやはりデータ分析は面白くもっといい分析ができるようにしたいと思いました。

東京大学 丹羽さん

Gunosyのサマーインターンシップに参加させていただいた丹羽と申します。少し時間が経ちましたが、改めて今回のインターンシップについて振り返りたいと思います。

用いた手法、時間の使い方

課題は広告・ユーザーの様々な種類のデータから広告のCTRを予測するというものでしたが、1日目に大まかにデータの傾向を見た段階で、実はユーザーの属性のみでも十分CTRの傾向を説明できるのではという大胆な仮説を立てました。そこで、2日目は与えられた教師データのうちユーザーの情報のみを使用して様々なモデルを学習させその比較を繰り返し、最終的にはScikit-learnの勾配ブースティングを用いて比較的いいスコアが出せました。ですが、最上位の人のスコアが抜き出ていてやはり広告のデータも用いないと追いつけないと感じたので、最終日の3日目は広告のデータの傾向を再吟味し用いるデータの種類を絞った上で、モデルの学習とファインチューニングを行いスコアを改善させていきました。

学びと感想

終わった後改めて最上位の人の話を聞いたところ、広告の方も多くの種類のデータをしっかり学習させていたようで、自分の仮説は不十分だったようです。初日にもう少しデータの統計量に注目してじっくり考察するべきだったかもしれません。周りの様子を見ているとデータの高度な統計処理や分析結果の可視化を綿密に行っている参加者もいて、その手法などについて見習う部分も多かったです。 一方で、今回は時間も限られていたのでとにかく作ったモデルを試す回数を増やすことを意識して取り組んでいましたが、試行錯誤する中でどのデータが効いているのか見えてきたり学習モデルのどのパラメータが重要なのか気付けたりする部分も多く、泥臭くトライ&エラーを繰り返すことも一つの有効なアプローチであると実感しました。はじめに大胆にデータを絞ったことも、それによって問題を単純化でき見通しを立てやすくなったので、自分にとっては有利に働いたのだと思います。 また、インターンシップ中の参加者や社員の方々との多くの交流は非常に刺激的でした。あっという間の3日間でしたが濃密で有意義な時間を過ごすことができたと感じています。

筑波大学 小林さん

筑波大学の小林です.今回のインターンシップでの分析に用いた手法と感想について述べたいと思います.

用いた手法について

今回のインターンは三日という短い期間で成果を出すことを求められるものでした.その為初日はデータの可視化とそれを元にルールベースを構築することで,ある程度の成果を出すことに専念しました.二日目以降は機械学習モデルの構築を進めながら,裏でルールベースのチューニングと提出を繰り返しを行い,最後にはモデルの構築時に得た知見を追加したルールベースを提出しました.

感想

機械学習での予測が二日かけても初日に作成したルールベースを超えるものにならず,自分の実力不足を実感しました.ルールベースは実装が早く序盤は強いですが最終的には時間をかけて作られた機械学習での予測には勝てないです.しっかりと勉強して地力をあげることが,データコンペで優れた結果を出すには大切だと改めて感じました.

インターン参加者の感想 第二回

f:id:dr_paradi:20170913181000j:plain

大阪大学 中村さん

分析に用いた手法

どの機械学習の手法を用いても精度はほとんど変わらなさそうだったので、深く考えずにGBDTを用いました。ライブラリはxgboostを使用しました。訓練データの期間が1日分のみで、さらにテストデータが未知であったことから過学習が怖かったので、木の本数をクロスバリデーションで選んだものよりも少なくしました。実際、木の本数を少なくすると、スコアが結構良くなったように記憶しています。

手法の選択よりもどんな特徴量を使うかの方が重要だと思ったので、元のデータから様々な特徴量を作りました。例えば、 - いくつかの特徴量を組み合わせて新たな特徴量を作る(例:性別+年齢) - カテゴリカル変数は、カテゴリごとの訓練データ内での広告の表示された回数・クリックされた回数・クリック率を特徴量とする などを行いました。

参加してみての感想

作業時間や計算資源が限られていたため、複雑なことをやるよりも手早く色々なアイデアを試すことが重要だったように感じました。また、機械学習の手法を用いずにルールベースのみでよい結果を残している人もいて、ルールベースも侮れないなと思いました。

長岡技術科学大学大学院 桾澤さん

インターンシップでの気付き

今回の課題で自分は基本的な時間帯等の素性に加えて広告ごとにWord2Vecでベクトル化したを素性として用いることで高い精度の予測ができるのではと考えそれらを素性としたSVMの予測器を実装しました。 提供されたデータにはユーザーのクリックしたデータが少なかったためカテゴリ面ごとにある程度パーソナライズして広告を出し分けていると予想してすべてのデータを時系列順に学習させました。 その結果最終成績として2位になることができました。 今回のインターンシップを通して学ぶことができたデータ分析に対する考え方を書きたいと思います。

機械学習のモデルの気持ちになる

よく言われていることだとは思いますが、このインターンシップを終えて改めてこの感想をいだきました。 今回提供されたユーザーの行動ログは殆どがカテゴリカルなデータであり、それをそのまま機械学習に用いてもあまりいい精度が出ないのは明らかでした。 にも関わらず、基本的な部分の素性の可視化を怠りそのままモデルに学習をさせてしまったためか、最終的な結果としていい精度を出すことができませんでした。

機械学習に対する理解を深めることもそうですが、理解を深めた上でじゃあどうやったら精度を上げることができるのか、どのような形の素性を用いればより高い精度を期待できるのか、という事をしっかりとデータを可視化した上で分析することが重要だと再確認することができました。

早稲田大学大学院 芦川さん

芦川です。今回のインターンで用いた手法や学んだこと・感じたことについてご紹介したいと思います。

用いた手法

私は今回ルールベースを一切用いない代わりに、なるべく多くの素性を基に機械学習手法を用いることで、自動的に予測に寄与する特徴表現が得られるようにすることを目指しました。

機械学習に用いた特徴量はユーザーID以外全ての素性から得たone-hotベクトルとしました。この際、それぞれの素性をone-hotで表現するためにダミー変数に置き換える辞書を自分で定義して、後段の処理で扱いやすい形になるように工夫しました。(例えば、タイムスタンプの時刻は時間の値をそのまま利用してしまうと扱いが難しいので、24時間を6時間ごとに区切り0~3の変数に置き換えるようにしたり、広告固有のIDなどは出現頻度とCTRに相関があることが分かったため、頻出するものだけに変数を与え、他は未知IDとして処理を行うようにしたりしました。)

こうして得られた特徴量を基にニューラルネットワークモデルとロジスティック回帰モデルの学習を行いました。ただし、上記で得られる特徴量は非常にスパースであるため、ロジスティック回帰モデルに与える際はLSIにより次元圧縮をしてから入力しました。

最終的にCTRを予測する際は、2つのモデルの出力を線形補間することで求めました。ニューラルネットは過学習をしやすいため、手元でいいスコアが出ても本番ではいいスコアが出るとは限りません。そこで今回はロジスティック回帰モデルとの線形補間を行うことで少しでも汎化性能を向上させることを試みました。

感想・学んだこと

私は今回ハンドクラフトなルールベースは信用できないと考え、CTRに関するユーザーの傾向をモデルのみで捉えることに注力しました。この方針でモデルを構築することで途中経過のベンチマークスコアは伸びていったのですが、プライベートデータに対する最終的な評価は残念な結果となってしまいました。この理由はいくつか考えられますが、一番の要因はモデルに頼りすぎた結果過学習をおこし、汎化性能が低下してしまったことだと思います。(そもそも今回与えられたデータ量で頑健なモデルを構築することは厳しかったのかもしれません。)

今回のタスクでは機械学習モデルに頼りすぎず、しっかりデータを分析して素性選択をしたりユーザーの傾向に基づくルールを見出したりした方々が上位にランクインしていたように感じます。モデルをどう構築するか?ということも重要ですが、実データに対してはそれだけでは不十分で、データをしっかりと分析した上で、時には感覚やセンスに頼りながら仮説を立ててアプローチしていくことが重要だったのだと思います。

メンターより

今年のサマーインターンの統括を担当しましたかとうです。

昨年のグノシーにおける記事クリック予測モデルの作成に引き続き、今年は広告のCTR予測モデルの作成を、コンテスト形式で行いました。

コンテストというと一見実務とかけ離れているのでは?と思われますが、課題と期待する成果のみ与えられ、課題を解くというのはGunosyでよく見られる仕事の光景です。
(実際には課題の設定、データの収集なども必要ですが・・・)

モデルの精度だけでなく決められた時間内に全てのレスポンスを返さないとスコアが悪化すること、サーバーのスペックが決まっていること、といった課題の制限についてもリアルな体験をしてもらうためのこだわったポイントです。レスポンスが遅ければ広告は表示されませんし、改善効果以上にコストがかかってしまっては元も子もありません。

制限がある中で現実的な手法を検討し、繰り返し試すというPDCAのサイクルを多く回すことが普段の仕事でも重要です。参加者の感想にもありましたが、実際に試行回数が多い方が高スコアにつながっていたように思います。

ということで今回参加いただいた学生の皆さんには、3日間という短い期間でしたがGunosyのエンジニアとしてリアルな体験をしていただきました。この体験は今後の研究、仕事にも生かされると信じています。
参加者のみなさま、お疲れ様でした!

*1:Gunosy社員の憩いのスペース。ソファや土足禁止スペースがあり、昼食や簡単なミーティング、個人での作業などに活用する人が多い