社内で機械学習ハッカソンを開催しました

f:id:alpicola:20171216103959j:plain

こんにちは、アプリケーションエンジニアの id:alpicola です。先日社内で機械学習を題材としたハッカソンを開催しました。サービスに蓄積されたデータを使って、何か面白いことができないか気軽に試してみる場を設けるのが開催の趣旨です。このハッカソンの成果をいくつか紹介します。

この記事ははてなエンジニアAdvent Calendar 2017の24日目の記事です。昨日は id:wtatsuru さんによる「エンジニア新人研修で障害対応を行いました 」でした。明日は id:motemen さんです。

id:Windymelt 「おすすめブログのレコメンド」

はてなブログにはブログの購読機能があるのですが、ユーザーの購読情報を元にブログのレコメンドを行なっていて、いい度合いに動いてそうでした。協調フィルタリングという手法を使っていて、どんなブログを購読しているかによってユーザーの類似度を計算し、類似度の高いユーザーが多く購読しているブログをサジェストしていました。

ところで、「おすすめブログのレコメンド」って同語反復のようでおもしろいですね。

id:tarao 「word2vecによる同義・類似タグ列挙」

はてなブックマークのあるエントリで多用されているタグの集合を一つの文のように見て、word2vecでタグの単語埋め込みを作成していました。そうすると、コサイン類似度で似たタグが簡単に求まります。例えば「増田」というタグに対して

  • はてな匿名ダイアリー
  • anonymousdiary
  • AnonymousDiary

が類似度の高いトップ3になっていて、なかなか望み通りの結果が得られていそうでした。タグの表記揺れの解消など応用の可能性がいろいろあり興味深いです。

学習データの期間の取り方によって、時事性が反映されたりもするようでした。ある期間のデータでは「機械学習」に類似度が高いタグとして「SVM」が出てくる一方、ある期間のデータではそれより「ニューラルネットワーク」の方が類似度が高くなるなど、時流の移り変わりが表れていておもしろかったです。

id:syou6162 id:alpicola 「ブックマークユーザーのクラスタリング」

ユーザーがあるURLをはてなブックマークでブックマークするという関係を(ブックマークエントリ)×(ブックマークユーザー)の行列で表現し、行列分解アルゴリズム(今回はNMF)を適用することでユーザーのクラスタリングを試みました。id:syou6162 がはてなブックマーク全体、 id:alpicola がはてなブログに対するブックマーク、という風に違う学習データを使用しています。結果を見てみると、うまくそれっぽいクラスタが表われているものもある一方、いまいちごちゃっとして見えるものもあり、そうした場合にそれが自分の知らないインターネットコミュニティの対応しているのか、それとも単にクラスタリングがうまくいっていないのかの判断ができず、教師なし学習らしい困難さに直面してしまいました。

id:tanishiking24 「ブックマークエントリの炎上判定」

はてなブックマークでブックマークされた記事が炎上してそうかどうかの判定を、その記事が持つテキストデータの分類問題として解いていました。炎上しているかどうかの教師データを手で作っていてはハッカソンの時間中に終わらないため、今回はブックマークユーザーが使用しているタグを見て炎上かどうかを天下りで与え、それを学習データに使用している点が特徴的でした。

まとめ

ここで紹介した以外にも異常検知やログ解析、また機械学習の初心者はチュートリアルをやってみるなど、様々な取り組みがありました。1日という短い時間だったこともあり、今すぐプロダクションに取り込める成果はなかなかありませんでしたが、今後機械学習のサービスへの導入を検討する上での足がかりにはなるのではないでしょうか。また当日、学習データの作成の部分に時間を要したり、工夫が必要だった例も多く、こうした機会を経ながらデータセットやデータ基盤の整備が進めていきたく思いました。今後もこのようなハッカソンを継続的に行なっていきたいですね。