田中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 で答えた結果よりも悪いことになる。

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

Julia で Numerai にチャレンジ

Numerai というデータサイエンスが競い合って、効率の良いファウンドを運営しようという試み。

ビットコインで雇われた匿名の7,500人が「頭脳」となるヘッジファンド「Numerai」|WIRED.jp

良いデータを登録できると、報酬ももらえるので頑張って Julia で挑戦してみる。

using DataFrames
using DecisionTree
using ScikitLearn

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])

model = RandomForestRegressor()
ScikitLearn.fit!(model, xTrain_array, yTrain_array)

predTest = ScikitLearn.predict(model, Array(test[:,4:53]))

labelsInfoTest = DataFrame()
labelsInfoTest[:id] = test[:id]
labelsInfoTest[:probability] = predTest

writetable("numerai_predict.csv", labelsInfoTest, separator=',', header=true)

とりあえず、simpleなランダムフォレストを作って登録もできた。Loglossは0.76522ぐらいだった。

Julia で箱ひげ図を表示する

Kaggle の Titanic 問題 をやっている。

性別と等級から年齢の平均は異なりそうで、それをNaN値に入れることを考えた。

まずは、実際にどれくらい違いがでるのかを確認してみる。

箱ひげ図を表示できれば良さそうなので、JuliaのGadflyライブラリを使って、図を表示してみる。

やっぱり差異はありそうなので、今後の:AgeのNaN値にはとりあえず、この平均を入れていくことにする。

田中TOMの めざせ Kaggle Master #3 相関係数

動画URL

田中TOMのめざせKaggleMaster #3 相関係数

相関係数

どの特徴量がターゲットに対して強い相関があるかを見ることは、
データ分析の最初の取っ掛かりとして良さそう

以下の解説記事が相関係数についてわかりやすくまとまっていた。
5分で分かる!相関係数の求め方

pandasで相関係数を求めてみた

pandas.DataFrame.corr

参考にした記事
Kaggleのtitanic問題で上位10%に入るまでのデータ解析と所感

やってみたやつ
gist

Julia Now

Tiatnic のデータ解析系記事
http://ajkl.github.io/2015/08/10/Titanic-with-Julia/

今週のニュース

田中TOMの めざせ Kaggle Master #2 愛しのJulia

動画

田中TOMについて

  • 構成メンバー
  • たの
  • いっち

Kernel について

Competion毎に自分の実行したコードを公開できる。

そこに対しての評価 Vote できる。
(前回 英語が必要と言ったけど、Kernelに関してはコードだけでも伝えることができれば説明しなくても評価は貰えそう)

注意として Kernel は消せない仕様らしい

Can I delete kernels?

Julia って人気ない?

Julia言語っていう、言語があるんですよ
プログラミング言語 Julia の紹介

けど、Titanicを見てもJulia使ってる人少ない。Kernel一件しか見つからない。。。

ちょいちょい Qiita には Julia に関する記事も上がっている。(見た感じは2014年が一番盛り上がってる)

まだ開発段階(v0.6)で、1年前のコードとかでも動かない状態。

周りの、ライブラリも止まってるの多い。(というか Kaggle 自体もあまり julia 環境構築に本気になっていない様子。 Kaggle – Github

けど、「たの」はこれで突き進みます。(少なくとも今年はJulia縛り)

Titanic のJuliaで解いているコードが最新のJuliaで実行できていなかったので、パッチを当ててみた。
https://www.kaggle.com/regonn/simple-randomforest/

来週はデータ解析頑張ります!!

今週のニュース

ブラウザがあれば誰でも機械学習を体験できるGoogleのサイト「Teachable Machine」がオープン - GIGAZINE

「深層学習の活用が日本産業界の分岐点だ」日本ディープラーニング協会が発足 | BUSINESS INSIDER JAPAN

人間ってナンだ?超AI入門 - NHK

Google Home - スマート スピーカー&ホーム アシスタント - Google ストア

田中TOMの めざせ Kaggle Master #1

動画

趣旨説明

  • kaggleの問題を解いていくことで機械学習への知識を深めていく
  • その過程を配信する(Youtube, Podcast)

目標

  • https://www.kaggle.com/progression/
  • Competition Expert 2018年11月 までに達成
  • Competition Master を目指す期限 2020年11月 お互いが 30歳に
  • Competition GrandMaster 20xx年

Kaggleでやりたい課題

分類

再度titanicをやる?

[以前の動画] Deep Learning ちょっと横道 MNIST 以外のデータで機械学習を試す

以下のような観点で攻めれば機械学習への理解が深まりそう。
– データ表現、特徴量エンジニアリング
– アルゴリズム
– パラメータチューニング

回帰

house pricesやる?

House Prices: Advanced Regression Techniques

XGBoost使った日本語解説記事
KaggleのHousePrices問題を決定木系のアンサンブルで解く

今週のニュース

【機械学習初心者向け】scikit-learn「アルゴリズム・チートシート」の全手法を実装・解説してみた - Qiita

数学を避けてきた社会人プログラマが機械学習の勉強を始める際の最短経路 - Qiita

データサイエンティストを目指して半年で学んだことまとめ - Qiita

Juliaの動画を進める

Rのデータも使える。

JuliaInterop/RCall.jl: Embedded R within Julia

機械学習に突入

機械学習開発用ライブラリ

https://github.com/JuliaStats/MLBase.jl

lm = labelmap(species)
labelencode(lm, arrs)

とやることで、文字列ではなくラベルの数字に置き換えることができる。

correctrate(gtl, predl)
errorrate(gtl, predl)

で正答率などを表示することもできる。

明日はDecision Tree辺り