Gunosyデータ分析ブログ

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

サマーインターンシップ2019開催報告

こんにちは、Gunosy Tech Lab内定者の濱下と谷口です。

今年も昨年同様エンジニア向けデータ分析サマーインターンシップを実施しました。

メンターアルバイトとして参加したので,その様子やメンターとしての気付きなど,当日の写真を交えながら紹介します!

 

 

Gunosy Summer Internship 2019 について

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

今年は「機械学習コース」と「サービス開発コース」のコースの募集がありました。 本記事で紹介する機械学習コースでは、Gunosyが普段の業務で取り組んでいる課題に近いものに個人戦のコンペ形式で取り組んでもらいました。 期間は3日間で講義やコンペを行い、 コンペ優勝者には昨年と同様賞金10万円が、2位3位の人にはお肉のギフトカタログが贈呈されました。

業務に近いデータ分析に実際に取り組むことで、データ整形・特徴量の検討・モデルの選択などを試行錯誤する過程を体感してもらいました。

(昨年度の様子はこちら)

 

data.gunosy.io

講義

1日目には取締役兼・CDO(最高データ責任者)の大曽根から「Gunosyにおけるデータ分析とプロダクト開発の関わり方」について講義が行われました。

f:id:jkatagi:20190924164732j:plain

講義内容は

・データ分析に基づいたプロダクト開発の流れについて

・Gunosyはデータとアルゴリズムをもってあらゆる課題解決に取り組んでいる

・プロダクト開発の前提は、ユーザーが正しく、失敗を前提に考えるため、賢く失敗し価値のあるトライをたくさんした人が偉い

といったGunosyにおけるプロダクト開発や理念が詰まった話でした。

最終日には、VP of Engineeringの加藤から昨年同様「Gunosyの歩みについて」の講義が行われました。Gunosyがどのように成長してきたのか、これからどのように成長していくかという話でした。

 

課題の結果発表後に、CTO(最高技術責任者)の小出から締めの挨拶が行われました。機械学習システムを構築するには、機械学習以外にも幅広い知識・理解が必要なので大変だが、課題をどれぐらい解決できたかを定量的に実感できる面白さがある、という話でした。

f:id:jkatagi:20190924164809j:plain

 

課題について

講義が終わったあと、本インターンシップの課題が発表されました。テーマは「ユーザーの属性推定」というものです。グノシーアプリにおける匿名化された実際のユーザーの記事閲覧履歴や利用OSなど*1をもとに、ユーザーの属性を推定します。ユーザの属性推定は、実際の業務においても重要なタスクとされています。

今回は、社員があらかじめ用意したサンプルコードがはじめに与えられました。「そのユーザーがどの記事を何回クリックしたか」ということだけを利用するというものです。実はこのサンプルコードが非常に秀逸で、このサンプルコードを起点に少しずつ変えていくというやり方が一番いいように思われました。

コンペは個人戦として行われますが、チームメンバー(参加者は4-5人のチームに分けられていました)などと自由に話し合ってもOKです。積極的に知見を共有する方針をとっていたチームもありました。

作業環境

分析・モデル作成の作業は、参加者が普段から使用してるPCを用いて、Google Colaboratory上で行っていただくことを想定しました。昨年のサマーインターンではAmazon Workspaces上で環境を構築しましたが、「すぐに落ちてしまう」・「キー割り当てが普段と異なるためタイピングしづらい参加者が出てくる」という問題点がありました。今年はその問題点を解消する形となっています。Google Colaboratoryによって、Googleの仮想マシン(GPU)上でPythonを実行することができます。

ランチ・おやつ

各日、チームメンバーでオフィス近辺のランチに出向いたり、社内の同じ部屋でお弁当を食べたりする時間が設けられました。ここでお互いのことについて話したり、コンペについての議論が行われたりしました。社員も参加するので、Gunosyの話を聞いたり質問をしたりする良いチャンスです。

また、コンペの合間にはさまれる休憩時間には、おやつを食べます。真剣にコンペに取り組むことで研ぎ澄まされていた神経がここでいったん緩和されます。一枚のハッピーターンがアイディアをもたらすかもしれません。

結果発表

3日目のワークの終了と同時に社員がインターン生の結果を確認しました。評価方法としてはデータが予めPublicとPrivateに分けられ、インターン生はPublicに対するスコアのみダッシュボード上で確認できるようになっていました。最終的な順位はPublicとPrivateの両方を合わせたデータに対するスコアで決定しました。今回Publicに対してPrivateの割合が大きめに取られていたため、Publicのスコアのみを追求すると、最終スコアが悪くなり順位が落ちるということがあり得る、というのも面白い点の1つだったと思います。

f:id:jkatagi:20190924165329j:plain

f:id:jkatagi:20190924165414j:plain



 

インターン参加者の感想

f:id:jkatagi:20190924165534j:plain

1位 : 京都大学・大村 和正 さん

  • 分析に用いた手法

特徴量はユーザー属性によって平均値等が分かりやすく異なっているものを探し、最終的には

 

・OSがiosかandroidか

・閲覧した記事のID

・記事の閲覧時間(10の倍数になるよう一の位以下を四捨五入)

・記事をどの位置までスクロールしたか、その割合(割合は全て少数第三位以下を四捨五入)

・閲覧した記事の内、アンケートが占める割合

・エンタメタブの割合

 

の6つを利用しました。

 

記事IDと閲覧時間はCountVectorizerを用いてカウントを特徴量とするベクトルに変換し、OSは2次元、割合は101次元のone-hotベクトルに変換して入力しました。

 

モデルはLightGBMとMLPClassifierの二つを利用し、出力される確率分布を調和平均したもののargmaxを予測ラベルとしました。

  •  参加してみての感想

これは効くだろうと思った特徴量が精度の向上に全く貢献しないということが多々あったため、実際のデータを分析して使えるものを見つけ出すのは本当に大変なことだと思いました。

 

運が良かった側面はあると思いますが結果は自信に繋がりましたので、企画・運営をしていただいた皆様には心より感謝申し上げます。

 

 

2位 : 東京大学・大野 佑 さん

  •  分析に用いた手法

 

  • 作成した特徴量

    • 特徴量A

各ユーザが閲覧した記事IDをBoW形式の特徴量ベクトルにしたものです.

サンプルコードで使用していた特徴量と同様に scikit-learn の CountVectorizer で作成し,特徴量ベクトルの次元は max_features=5000 として5000個までに絞っています.

    • 特徴量B

ユーザに関して与えられた情報の中には,各ユーザが記事を閲覧するときの行動特性を表すものがありました.具体的には読んだ各記事に関して,article_length(記事長),session_length(滞在時間),scroll_length(スクロール長),placement(フィードの中で何番目の記事か),などです.

その中から,欠損値がなくそのまま扱えそうなカラムを選択してその平均と分散を計算し特徴量にしました.

 

    • 特徴量C

特徴量Aでは計算量の都合から記事の種類を5000に絞っていたので,その他の記事の閲覧情報が捨てられてしまうと考えました.

与えられたデータには各記事について詳細情報が得られるテーブル(articles.csv)があったため,これを用いることで各ユーザが読んだ記事について29次元の嗜好カテゴリベクトルを得ることができます.

これを特徴量Cとし特徴量Aを補完するものとして使用しました.

 

    • 特徴量T

各ユーザが記事を閲覧した時間(UNIXTIME)の情報も与えられているのでそこから各ユーザが記事を閲覧する曜日・時間帯の分布を得ることができます.その分布(ヒストグラム)を正規化して7次元,24次元のベクトルを得ました.

 

  • モデル
    • 多層パーセプトロン

各ユーザに関するそれぞれの特徴量を連結したものを単純に入力し,ユーザの年齢層を確率値として出力するものです.

学習時には容易に過学習するので,中間層のユニットを減らしたりドロップアウトを加えるなどして工夫しましたが,アーリーストッピングがもっとも効果的でした.

この構造のモデルの入力として特徴量ABCのみをつかったもの(MLP-ABC),特徴量ABCT全てつかったもの(MLP-ABCT)で性能がよいものに関して,パラメータを保存しました.

 

    • 階層的ニューラルネット

各特徴量について埋め込みを得た後,それらを連結する階層的な構造をとるニューラルネットワークも作成しました.

これについて特徴量ABCT全てを使ったもので性能が良かったもの(HNN-ABCT)に関して,パラメータを保存しました.

 

    • バギング

最終的には上記のモデルMLP-ABC,MLP-ABCT,HNN-ABCTの結果をバギングして出力を得ました.

  • 参加してみての感想

課題の内容に関して言えば,自分は大学院で機械学習を専攻していますが,これまで分析コンペには出場したことがなく実際のデータで予測モデルを構築するという経験がありませんでした.今回のインターンを通して自分が勉強してきた内容を実践で確かめることができたのは大きなみのりがあったと感じています.また,今回のデータは実際のログから得られたデータであり,予測したいターゲットもその応用先が実際に想定されているということでした.勉強用のお誂え向きのデータではないため,その分難しさもありましたが,自分のモチベーションとして実際のビジネスにインパクトを出せる可能性があるというのは大きかったです.

インターン全体に関して言えば,和気藹々としたグループの雰囲気の中で課題に取り組めたのが楽しかったです.ピリついた環境の中ではなかなか集中できないタチなので,今回のような雰囲気は成果を出す上でも非常に助かりました.会社説明のときや,ランチの際に,社員さんとやりとりさせていただく場面もありましたが,自由で楽しい雰囲気がよく伝わってきました.ランチも美味しかったです!ありがとうございました.

 

 

3位 : 早稲田大学・片山 颯人 さん

 

  • 分析に用いた手法

 

データはユーザの閲覧記事ID情報を基準に,モデルはDNNを用いた手法をベースに用いました.

最初はどの特徴が効きそうかいくつか仮説を立てて特徴量の作成を行いました.自分の中では特徴量を綺麗に作成できれば識別器に何を用いても結果は大きく変わらないだろうと考えたからです.

作成した特徴量はユーザが閲覧した記事の長さや記事の閲覧時間を一定の範囲ごとにカテゴライズしてCountVectorizerを用いるというものです.しかし,記事情報が10000次元に対して作成した特徴量は100次元ほどであったため,うまく情報を統合できていない可能性もあり精度は上がりませんでした.

そこでニューラルネットを用いてある程度次元を縮約してから他の特徴量を統合することで性能向上を図れること,さらに複数のユーザー属性を同時に推定するように学習させれば性能向上が図れるという2つの理由からモデルはニューラルネットに固定しました.最終的に,入力特徴量と出力の種類をどのバリエーションがいいか試して行く形で最終的な精度を得ました.

  • 参加してみての感想

 

一番に感じたことは圧倒的に時間が足りないことです.2日目までこんな特徴量効くんじゃないかと少し試行錯誤しただけであっという間に時間がすぎてしまって..やばい,明日で終わる,と考えたときに最低限やるべきことを考えるようにしました.メンターさんには時間配分などの相談に乗ってもらったり,自分がやろうとしていることに対して「それはやって見る価値ありそう」とか「それって意味ないんじゃないか」など自分の考えのフィードバックをいただけたことが本当に助かり,偉大だなと感じました.

 

メンター総括

メンターおよびコンペ参加者として最後に総括をし、ブログの締めといたします。

濱下

私は主にメンターとして参加しました。今回のコンペは、精度を伸ばすのに昨年とは異なる手法が効果的でした。しかし昨年も今年も共通しているのは、1日目の講義にもあったように「筋の良い仮説の試行錯誤を繰り返す」ことが出来ていた人が精度を伸ばしていたように思えました。筋の良い仮説を建てるためには、まずデータをよく見ることが重要です。そうしなければ筋違いな仮説を建ててしまい、効果的でないことがしばしばあります。メンターとしては、インターン生の席を回りながらサポートしていました。その時に面白いと思ったのは、インターン生は研究分野など多様なバックグラウンドを持ち、課題に対するアプローチが人によって異なっていたということです。また、その中には自分が考えつかないものもあったりと、自分自身学ぶものが多かったインターンでした。

谷口

今回のコンペでは、データを精査することに加え、「アンサンブル学習の適用」や「モデル選択」など、機械学習をどれだけうまく扱えるかということも結果につながっていたように感じました。去年のGunosy Summer Internship 2018のコンペでは、データを細かく分析し良い特徴量を抽出できた者が勝利をおさめた印象がありました。この2回で異なるテーマが背景にあるのはとても面白いし、「タスクによって効果的なやり方は異なる」ということを実感することができました。実際私は、アンサンブル学習に関する知見が薄く、またモデルを色々変えて試すということもあまりできなかったので、良いスコアを出すことができませんでした。また、メンターとしても、指導のむずかしさと面白さを体感しました。自分の課題も見え、来年度からの勤務スタートに向けて良いモチベーション向上になったと思います。

f:id:jkatagi:20190924165630j:plain