データサイエンティストを目指すための Kaggle チュートリアル

Kaggle Advent Calendar 2017 一日目の記事です。

皆さんデータサイエンスしてますか?

機械学習の本読んだけど、MNISTやIrisデータの解析も飽きてきた(ディスっているわけではない)のであれば、実際の企業や団体が公開しているデータに触れることができるデータサイエンスコンペティションサイトのKaggleに挑戦してみましょう。

今回は、日本語対応しておらず少しハードルの高いKaggleのコンペティションに参加できるように、よく出てくる単語とかを説明していきます。

重要なKaggle用語

Kernels

Kaggleで公開されているデータに対して、統計処理を行った結果や予測結果が公開されている。一流のプロが解析しているKernel等も見ることができ、評価の高いKernelのコードを写経するだけでも価値があると思う。

Competitions

企業が賞金を出したりして、参加者がより良い予測ができるモデルを作って競い合います。上部メニューのCompetitionsで飛ぶと一覧で出てきます。Activeというのが現在開催中のもので、最近(2017年12月)だと、メルカリが値段予測問題でコンペティションを開催しています

Datasets

企業等が公開しているデータ。コンペティションではないので他のユーザーとは競わないですが、他のデータサイエンティストが公開しているKernelも見ることができるので、色々と参考になる。

Kaggleをどう利用したらいいのか?

登録してみたものの、何をすればいいのか迷いますよね。これについては、KaggleのCTOが Quora という Q&Aサイト(実名版のヤフー知恵袋のようなもの)で回答した内容だと機械学習やAIを学ぶには次のようにKaggleを使っていくと良いそうです。(あまり英語得意じゃないので勝手な解釈になってるかもしれませんが間違ってたらコメントで指摘してください)

1. 興味のある問題を選ぶ

好きなものこそ上手なれという言葉もあるように、まず自分の興味ある分野のDatasetsを探してみましょう。画像を解析する問題や、株価を予測する問題が色々あります。Kaggleだとチュートリアル的な問題として、タイタニックの生存者予測家の値段予想があります。

2. 一回愚直に問題を解いてみる

あれこれ、アルゴリズムを考えたりしてドツボにはまるのであれば、一度愚直に、簡単な方法で解いてみましょう。例えば性別の情報が入っているなら、性別だけで一回予測してみて答えを出してみたりすると、精度は悪いですが回答できるようになります。

3. 最初のモデルを改善していく

一度回答は出せたので、今度はその回答の精度を上げてみます。先程の例ですと、性別の他に年齢を加えてみたり、使ったアルゴリズムの変数を調整して、どうすれば良い結果が得られるか色々試してみます。

4. 自分の解法を公開する

ある程度、良い結果がでたら、Kernelを公開してみましょう。フィードバックを得られて学びになったり、高評価を得てKaggleのプロフィールの見栄えがよくなるかもしれません(就職・転職の際に使えそうですね)。日本語でフィードバックが欲しいならQiitaなどで公開しても良さそうですね。

5. 1~4を繰り返す

他の問題でも同じように解いてKernelを公開したり、他人のKernelを読んで勉強して色々な問題に対応できるようにしていきましょう。

6. Competitionに参加してみる

実力を付けたらCompetitionに挑戦してみましょう。(別に参加は無料なのでいきなりCompetitionに参加しても大丈夫です)

チーム機能もあったりするので、一緒にデータサイエンスを学んでいる人と協力して挑戦するのも良さそうです。

7. プロを目指して機械学習を実践していく

ある程度、Competitionに慣れてきたら、実際に自分の仕事で機械学習を実践してみたり、転職などで使える環境に挑戦してみましょう。ここまでくると最新の論文を読んだり、良いコードの書き方を意識しだしたりするようです。(ちなみに私はまだこのレベルまで達してないです。)

あとは、自分が将来進む道(アカデミックな分野かAIエンジニアかデータサイエンティストなのか)も決めて専門性を高めていく必要があるみたいです。(なんか、ゲームの2次職みたいですね)

8. 他の人に教えてみる

ここまできたら、実際に他の人にも教えてみましょう。

勉強会で発表したり、ブログや本を書いたり、アウトプットする方法は色々あると思います。他人に説明することで、自分のなかであやふやな部分とかも気づけたりするので大事ですね。

Kaggleで目指すもの

KaggleではCompetitionで上位に入賞したり、高評価のKernelを作ったりすると、メダルがもらえて、そのメダルの種類と枚数によってランクが上がって行きます。最終的にはグランドマスターという称号が用意されているので、それを目指してみるのもいいですね。

宣伝

普段は田中TOMという名前でKaggleのコンペに挑戦するYoutube動画あげています。一緒にKaggleでプロフェッショナルの証であるMasterランクを手に入れましょう。

田中TOM - YouTube

田中TOMのめざせKaggleMaster #7

動画リンク

田中TOMのめざせKaggleMaster #7 コンペティションに挑戦だ!!

Next Competition

WSDM - KKBox’s Churn Prediction Challenge | Kaggle

KKBoxという定額音楽配信サービスの離脱を予想する。

概要(もとの文は英語なので間違ってるかも)
KKBoxのサービスは30日毎にアカウントの更新を行う、今回の問題では2017年4月にてサービスが継続されるか解約(churn)を予想する。

「解約」の基準は、現在のメンバーシップの有効期限が切れてから30日以内に申し込むかどうか。
自動継続オプションも存在する。

提供されているファイルの内容

情報ごとにファイルが別れている。
ログのファイルサイズが圧縮されて6GB超え

  • train.csv: 2017年3月の継続・解約情報。目的変数
  • transactions.csv: 2017年3月31日までの契約更新情報。支払い方法など
  • members_v3.csv: ユーザー情報(年齢、性別、住んでいる街など)
  • user_logs:2017年3月のユーザサービス利用状況。日毎に曲の何%まで聞いたかの曲数ログ

kernel

例の如く良さげなkernelをあさってみた
Should I stay or should I go? – KKBox EDA

Julia Now

kkbox触りだけ
kkbox.ipynb

News

田中TOMのめざせKaggleMaster #6

動画ULR

田中TOMのめざせKaggleMaster#6 たなかTOMは あたらしく SVMを おぼえた!

線形SVM

理論

データクラスを分離する境界を決定する学習器。
最も境界に近いデータとの距離を最大にするような境界を探す。
境界 = 識別超平面
境界に最も近いデータ = サポートベクター

ちなみに
SVC ≒ SVM っぽい

scikit-learnのlinearSVC

実行結果

C = 0.2 / train = 0.810325476992 / score = 0.77990
C = 1.0 / train = 0.809203142536 / score = 0.78468
C = 3.0 / train = 0.810325476992 / score = 0.77990

 

Julia Now

AWS の Deep Learning AMI を使って EC2 インスタンス上で 最新のJuliaを動かせるように

  • AWSのEC2インスタンス上に最新のJuliaとMXNet.jlを導入するのはすごい大変でした。
  • 今回作ったものはAMIとして公開してあります。
  • やっとMXNet.jlでGPU環境が整った
  • MXNetで学習をしてみたけど、過学習発生中。。。
  • あと数日中に MXNet 0.12 対応版の MXNet.jl もリリースされるっぽい https://github.com/dmlc/MXNet.jl/pull/304

News

AWS の Deep Learning AMI を使って EC2 インスタンス上で 最新のJuliaを動かせるように

以前 Deep Learning AMI を使うことで気軽に MXNet を GPU 上で動かせた。

【動画解説】AWS の Deep learning 用 AMI で MXNet を動かす

ただし、自分の今触っている Julia 言語が AMI にインストールされておらず、最新版(現在 v0.6.1) を動かしてGPU処理をするまで持っていった。Amazon Linux だとライブラリ周りのバージョンが追いついていなかったので、今回はUbuntu版のDeep Learning AMI(タイプはGPUが使えるp2.xlarge)を利用して構築。

まずは普通にEC2のインスタンスにアクセスして、rootユーザになり、julia の v0.6.1 を make する。(CPU4コア使っても1時間ぐらいかかる。。。)

$ sudo su -
# apt-get update
# apt-get install libpango1.0-0 -y
# add-apt-repository ppa:staticfloat/julia-deps -y
# apt-get update
# cd /usr/local/src
# git clone https://github.com/JuliaLang/julia.git
# cd julia
# git checkout v0.6.1
# echo "JULIA_CPU_TARGET=core2" > Make.user
# make -j 4 julia-deps
# make -j 4
# make install
# ln -s /usr/local/src/julia/julia /usr/local/bin/julia

ubuntuユーザに戻して、Juliaを起動して

> Pkg.add("IJulia")
> Pkg.add("MXNet")
Julia v0.6.1 で MXNet.jl v0.2.3 はインストールに失敗するので master 版を取ってきてbuildする。https://github.com/dmlc/MXNet.jl/issues/316
> Pkg.checkout("MXNet")
> Pkg.build("MXNet')

再び、MXNetをbuildで待たされる。(これも1時間ぐらいかかるかも。。。)

なんとかこれで使えるようになった。GPUも有効にしてもエラーにならずに起動できている感じ。

オハイオリージョンで ubuntu-deep-learning-ami-with-julia-ijulia-mxnet(ami-e482ad81) という名前でAMIを公開してあります。たぶん、サンプルコードとかは動くはず。

 

田中TOMのめざせKaggleMaster #5 進捗ダメです

動画URL

田中TOMのめざせKaggleMaster #5 進捗ダメです

AWS で MXNet を試してみた

AWS の Deep learning 用 AMI で MXNet を動かす
– サンプルコードだがMXNetでGPUも使いやすいし、公式がサポートしている分動作は安定している
– Julia環境を入れようとすると結構面倒

アドベントカレンダー

今年もアドベントカレンダーの季節に

参加予定アドベントカレンダー

Kaggle進捗


次週もTitanicやります。。。

Julia now

Juliaの勉強会へ参加してきた

Juliaの勉強会へ参加してきた
– Juliaのデータサイエンス本を購入していて、ちょうどその勉強会だった
– 書籍のJuliaのバージョンがv0.4で結構コードがエラーになってしまう
– 最近出版された機械学習スタートアップシリーズ ベイズ推論による機械学習入門 (KS情報科学専門書) | 須山 敦志, 杉山 将 はサンプルのコードがJulia(v0.6)で書かれているみたいなので、次はこれを読んでいく予定

News

Juliaの勉強会へ参加してきた

最近 Julia のデータサイエンス本を購入。

ちょうど、この書籍に関する勉強会が開催されるのを知り参加してみる。

Juliaデータサイエンスワークショップ - connpass

やはりというか、書籍で書かれているJuliaのバージョンがv0.4で現在はv0.6なので、動かないコードが多い印象。(公式 github は更新がなく、日本の出版社もv0.6対応は近日公開になっている。。。)発表者の方が、一部v0.6でも動くようにしてもらっていたので助かった。

data-refinement/Julia-for-Data-Science

この勉強会を開催するに至った経緯に次の本の話があり、この本の著者が公開しているサンプルコードは Julia のコードで書かれているみたいで、今後もJuliaは科学計算分野で使われていきそう。

「機械学習スタートアップシリーズ ベイズ推論による機械学習入門」のサンプルコード(コチラは最新のv0.6で書かれている)

最初に紹介したJuliaのデータサイエンス本の次はこれを読んでいくのと、勉強会でJuliaで書かれている(他の言語でのライブラリのAPIを叩いていない)deep learningライブラリの hshindo/Merlin.jl(国産ライブラリ) や pluskid/Mocha.jl の存在を知ったので触っていこうと思う。

田中TOMの めざせ Kaggle Master #4

データ解析の道のり

kernelを眺める

執念を感じるtitanicのkernel
できる全てを詰め込んでいるのでは?
EDA To Prediction(DieTanic)

  1. Dataを眺める
  2. 特徴量をタイプ別に分類する
  3. 特徴量ごとにグラフや表を使って分析する
  4. 観察結果をまとめる
  5. 欠損データを埋める

視覚化ツール

seaborn
データ視覚化ツール
matplotlibのラッパーで、見た目と使いやすさが上がったもの

結果

上記のkernelの通りにデータの整形を行って予測を実行。
trainの方でpredictをした時の結果は89%なので過学習している?

機械学習アルゴリズムをランダムフォレスト系ではなく
別の手法にしたほうが良いだろうか?
Choosing the right estimator

xgb_model=xgb.XGBClassifier(n_estimators=30, max_depth=4)

で0.79904出た。上位16%くらい

Julia now

タイタニック

年齢について少し調べてみた。
年齢はNaN値が存在しているが、等級と性別である程度年齢の平均は推測できるのではと思った。

Gadfly+boxplot.ipynb

けど、順位はあがらず。最初にやった結果が偶然精度が良かった可能性が考えられる。

Julia で並列処理

Juliaで並列計算を試す

次はMxnet試したい

  • 前回のニュースで紹介してた Gluon(マイクロソフトとAmazonが組んだ機械学習ライブラリ) のラッパーされているライブラリ
  • 現状公式でJuliaサポートがされているライブラリ
  • Amazonが公式でサポートしており、今後データ処理が重くなりスケールアップしたい場合に、コードはそのままでAWSのGPUを使ったインスタンス上でコードが実行できそう。
  • MXNet とは – AWS

ニュース

Deep Learning 補足動画 行列内積の誤差逆伝播の式を導出

以前 田中TOM で取り上げたゼロから作るDeep Learningに関する動画でAffineレイヤーの内積の誤差逆伝播を求める部分が省略されていたので、行列で微分する部分の説明を動画で録画してみました。

 

Deep Learning 補足動画

この動画は
Deep Learning 第7回:誤差逆伝播を用いてニューラルネットワークを実装
で出てきた、行列での微分部分の補足動画です。

この

について解説してく。

今回想定するモデル

今回はバイアス部分は除いて、単純に入力2個と次の層への出力3個で考える。

ここで

となる。

①について


まで計算しておいて


を代入すると

よって示せた。

②について

同じように

少し複雑になるが

なので、ほとんどは0になってしまう。

よって示せた。

単純な数値計算例(値は結構適当)

もし、損失関数を計算して


として値が渡ってきたとしたら、

Juliaで並列計算を試す

引き続き Numerai をランダムフォレストで解いてみる。

のスライドによると、 DecisionTree は並列計算対応してくれているらしいので、実験してみた。

using DataFrames
using DecisionTree
using ScikitLearn
using LossFunctions
train = readtable("./numerai_training_data.csv")
test = readtable("./numerai_tournament_data.csv")
yTrain_array = Array(train[:, :target] * 1.0)
xTrain_array = Array(train[:, 4:53])
@time model = build_forest(yTrain_array, xTrain_array, 2, 30, 4, 0.7, 50)
pred_test = apply_forest(model, Array(test[:,4:53]))
labelsInfoTest = DataFrame()
labelsInfoTest[:id] = test[:id]
labelsInfoTest[:probability] = pred_test
writetable("numerai_answer3.csv", labelsInfoTest, separator=',', header=true)

@time を付けることでそのコードでの処理時間やメモリ使用量が分かるっぽい。

実行結果

> julia numerai.jl 
657.770862 seconds

> julia -p 3 numerai.jl 
282.813077 seconds

確かに、かなり時間が節約できている。

今後はJupyter である程度変数とかを絞ったら、コードにして並列計算したほうが良さそう。

肝心のNumeraiの結果は一度、Loglossが 0.70 台まで下がったが、Originarity チェックで弾かれた。なんでだろう。

他の結果は 0.75 以上の結果になってしまった。

損失関数の計算で分かってきたけど、1か0 の結果に対して、全ての予測が 0.5 だと、Logloss は 0.75 になる。

つまり0.75を下回らないと、予測の精度は全てを 0.5 で答えた結果よりも悪いことになる。

ここに一つのハードルがありそうだ。データはマスキングされているけど、元々はグラフデータとかの内容だろうし、普通に株取引とかで機械学習でやろうとしても、なかなか結果が出せないのと同じで、取引データから利益を出せるようになるには、もっとデータサイエンスを学ばないといけないな。