機械学習ハッカソンに行ってきました。
機械学習ハッカソンに行ってきました。
会場は、秋葉原アンダーグラウンド。アキバには妙に親近感を覚えます。
テーマは「機械学習を使ってなにかをする」ということで、使うデータは自由、手法も自由。R使ってもいいし、sklearn使ってもいいし、自分でアルゴリズム書いてもOK。
参加した方達は、ガチなデータサイエンティストって感じの人はあまりいなくて、エンジニア、マーケターが多かった印象。
写真は秋葉原アンダーグラウンドさんのFacebookページから拝借。
ハッカソン
ハッカソン開始後は、どんなデータ使おうか話したり、慣れてるひとがライブラリのインストールの仕方を教えたり。 あと、ハッカソン中はコード書くのがメインという訳ではなくて、手法について議論が盛り上がって楽しかったです。「ニューラルネットワークでなにかできないかなー」→「ディープラーニングやってみたいよね!」→「じゃあまずRBM作ってからー」とか、「こういう分類問題で何使おうか?」→「SVM??」→「あ、SCWっていうオンライン学習の論文があってー」とか、割とハッカソンで実現できるかどうかとか関係なく、わいわいやってました。
自分はというと、手頃なデータを用意していなかったので、kaggleからデータをダウンロード。ウォルマートの売り上げ予測があったので、これに挑戦しました。
詳しい説明は、ここから。
ざっくり言うと、まず時系列分析をしてトレンドを除いてから、色んな機械学習の手法ごとのベンチマークをとろうかなーと思ってました。まあ、結論から言うと
という感じで、kaggleにアップロードができなかったのでスコアを出すところまでは実装できませんでしたorz
プレゼンでは、前半に分析の青写真を説明(移動平均とってー、機械学習はsklearn使ってーとか)して、後半は、sklearnの使い方(SVMとかクロスバリデーションとか)の話をしました。 発表しながら、この手法どうですかねー?って感じで色々聞けたのが、少ない人数ならではって感じで良かったです。ちなみに優勝はサザエさんのジャンケン予測でした。
まとめとピザ会
全体的にアウトプットまで、あと一歩という方が多くて*1、6時間という時間の中でデータを探して、分析方法を考えて、実装してプレゼンを作るというのは結構盛りだくさんでした。「機械学習ハッカソン」というイベントは、あまり開催されてこなかったと思うので、主催者の@chiralさんも参加したみなさんも探り探りで取り組んでいたという印象でした。
そしてピザ会(懇親会)では、機械学習がビジネスにどう使われていくかとか、今後のハッカソンの進め方とかの話をしました。
機械学習の手法はどんどん開発が進んでいて、注目度も高まっているのだけれど、いろんな分析手法が一人歩きしてる感*2や、ツールがコモディティ化されて、結果を出力する人は増えるけど、それを解釈、説明してビジネスに活かせる人はすぐには出てこないよね*3とか。
今後のハッカソンでは、あらかじめ分析するデータと目的は共有して、必要なツールとかはなるべく用意(テキスト、開発環境などなど)したほうがいいですよねという話をしたので、次回はもっとテーマを絞ったハッカソンになるのではと思います。
あと、ハッカソン中に意外とアルゴリズムについての議論が盛り上がったので、ここの理解しなきゃっていう問題意識はみんな持ってるんだなと感じました。やっぱりライブラリ使うだけじゃなくて、自分で実装できなきゃねって。もちろん実装したコードを仕事に使うっていうわけではないんだけど、ライブラリにデータを食わせるだけだと、ブラックボックス感ハンパないよねって感じで。
アルゴリズム実装会??
ハッカソンとは別枠でアルゴリズム実装会っていう話も出たので、ぜひ参加したいです。 機械学習って簡単な手法でも、最初のとっかかりがすごく難しいことがあるので、初学者にとっては助けになると思う。 もちろんアルゴリズムに詳しい人も、分かりやすく説明することで、さらに理解できるようになるはずだし。うまく説明できないところは、理解が浅い部分てことで宿題にすると*4。
月1, 2回くらいで集まって、実装する手法について話して、コードはGithubにあげて、次回の集まりまでに各々が頭を抱えながら実装進めて(ときどきissueを飛ばしたり)、 実装まで手が回らない人は、他の人のコードを読むだけでも勉強になるし(プルリク送るだけでもおk)、プログラミング苦手な人は、予習しといて勉強会に参加して議論するだけでもいいし。
習熟度に合わせて、「書く」、「読む」、「聞く」と色んな段階の人が参加できそうですし、あと個人的には20人くらいの人数がちょうどいい気がしました。いろいろディスカッションもしやすいので。
awkで列方向に集計する。
合計、平均、分散、標準偏差
列方向の集計やりづらいなって思ってたけど、for (i=1;i<=NF;i++)使って楽チン。
集計するファイル↓↓
hoge.txt
840 394 783 798 911 197 335 768 277 553 477 628 364 513 952 916
awkファイル↓↓
sum.awk
BEGIN { print "sum", "ave", "var", "std" } { sum=0; for (i=1;i<=NF;i++){ sum+=$i }; ave=sum/NF; varTemp=0; for (i=1;i<=NF;i++){ varTemp+=($i-ave)^2 }; var=varTemp/NF; std=sqrt(var); print sum, ave, var, std }
スクリプトの実行と結果。
awk -f sum.awk hoge.txt sum ave var std 2815 703.75 32418.2 180.051 2211 552.75 87162.2 295.232 1935 483.75 17098.7 130.762 2745 686.25 64317.2 253.608