いいものをつくろう

CTOの日記

データサイエンス

Kaggle入門1日目~6日目まで一気に

更新日:

tkm2261さんのkaggle 入門ブログ動画を見てkaggleに再入門したいと思います。

動画でわからないことあったらtwitterしてねという優しい方です。

あとslackでコミュで初心者の質問にもマスターれぶぇる(level)の人が答えてくれる有償レベルのうれしいチャンネルがあるようです

よっしゃ!ここまで着いてこれているぞ!

GCPの無料枠申し込みます。

12 か月間の無料トライアルにお申し込みいただきありがとうございます。

300 ドル分の無料トライアル クレジットをご利用いただけます。クレジットを使い切ってもご心配はいりません。無料トライアルでは、お客様から許可をいただくまで請求されることはありません。

できました!!

GCPができたのでバケットを作成しました。(バケットの作成とデータアップロード動画)その中にフォルダを言われた通り

inputとして作成しました。この時点でバケットやGCPの概念は理解していません。

サァ、フォルダ作ったぞ!かかってこいやー

さらにインスタンス作成の箇所にジャンプはこちらの動画17分くらいまで。

 

作成したインスタンスgcp へ ssh で接続するには

[bash]

ssh 123.123.123.123 -i `path to private key`

[/bash]

サーバーの初期設定ということで必要そうなソフト(こちらも参照)を入れていきます。
ubuntu なのでyumではなくaptで

[bash]
sudo apt install git vim build-essential tmux htop
[/bash]

のように入れていきます。

今入れた中でtmuxは非常に重要で、長いこと計算を回すことがあるのでその場合ssh切れて
どこまで行ったか分からない。処理がabortされるので無駄になるということを避けるために入れます。

gcp を数時間使った時の請求額をメモしておく。
作業開始前が¥33,358.52クレジット残高 元の残高: ¥33,364.00

作業開始後が¥33,218.97 クレジット残高元の残高: ¥33,364.00
で 5時間(8:50amに開始し、14:00pm)で約140 円で1時間約30円となりました。まぁ、ほとんで機械学習計算は回してないので安いのでしょうね。それしてもこれくらいの値段なら続けられそうです。

追記ですが、作業開始後  が¥32,910.09クレジット残高 元の残高: ¥33,364.00

で 5時間(8:50amに開始し、23:00pm)で約440 円でやはり1時間約30円となりました。

つまり8CPU core, 30G RAMは1時間約30円と記憶しておきます。

ここからすべてtmux上で作業していくので
一通りtmuxの使い方をさらって慣れておこう

tmuxを必要最低限で入門して使う
tmuxチートシート

自分はscreenコマンドは慣れていたのでそのprefixに変更するために

.tmux.confを用意した

[bash]

vi .tmux.conf

set-option -g default-terminal screen-256color
set -g terminal-overrides 'xterm:colors=256'

# prefixキーをC-aに変更
set -g prefix C-a
[/bash]

さぁ!準備が整いました。これで初カグル問題挑戦していきましょ!!

gcp terminalからrepositoryをsshで持ってこようとして

gcpの公開鍵を作ってコピペしようとしたら、できない。。。。

tmux上の文字列は簡単にマウス選択コピーできないのか。。。

少し調べてみて、tmux ないでのコピーモードはあるがまたクリップボードにコピーしてくれそうでなない。と、構造はぼんやりとしか分からなかったのでとりあえず手を動かす。

tmuxのコピーコマンドでのクリップボード共有 を参考にさせていただいた。ですんなり行かなかった。どうやら今現状私がやりたいのはリモートホスト上のtmuxでコピーしたテキストを手元のMacのクリップボードに入れる方法ということっぽい。

そうか、clipboard に保存されていてもそれはあくまでリモートホスト上のclipbaord で手元のローカルmac上でないんだよな。そうかそうか、でも上記リンクのやり方だと毎回hostが違ってくるgcpではやりづらい。っということでたくさん紹介記事のあるもう、mac上からtmux使ってる程の方法を試してみる。

その過程ではまったこと、tmuxの文法が2.4移行で変わったようなので各ブログのままコピペしていたらそんなcommand知りまへん のように怒られるので、変更前はこんな感じで書いてますが

[bash]
bind-key -t vi-copy v begin-selection
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"
[/bash]

下記のように変更して書いてあげてください。

[bash]

bind -Tcopy-mode-vi v send -X begin-selection
bind -Tcopy-mode-vi y send -X copy-pipe "reattach-to-user-namespace pbcopy"

# `Enter` でもcopy-pipeを使う
unbind -Tcopy-mode-vi Enter
bind -Tcopy-mode-vi Enter send -X copy-pipe "reattach-to-user-namespace pbcopy"

[/bash]

おっけ、いろいろ細い穴(本来の目的に到達するために始めた補助的な作業)を掘り出していますが、よくこれをしている間にモチベーションや目的を見失ってなんの作業をしてるのかよくわからなくなるが今のその懸念を抱えつている状態。そんな時は自分の現在の位置を声に出して整理してあげよう。(完全に自分にしゃべりかけています。)「もともとkaggleをやっていました。gcp立てて初期設定して、これからって時にrepositoryのcloneをやろうと思いきやコピペで苦戦!今ココ!これをクリアできればまた、repoをクローンするところから再開できる。頑張ろう

 

できました〜〜!

 

さぁ、コーディング始めよう。

サクッと load_data.pyを書きました。

次にtrain.pyでlogistic regressionを書いていきましょー。かっこいい。

ロギングなり、前回の大会のコピーなりすることが多いそうです。ここでは冒頭のファイルロギングの箇所だったりもそうでした。今回は簡単なロジスティックリグレッションの実装だったの何も見ずにすらすら書いていましたねー。かっこいい。

動画の実装をそのまま書いて私もsubmit.csv が作成できました。

早速提出してみましょう。

そのためにMy Submission というボタンをクリックすると

何やらkaggle コマンドを使っていますね。kaggle api のことで使い方はこちら

[bash]
pip install kaggle
[/bash]

[bash]
chmod 600 ~/.kaggle/kaggle.json
[/bash]

 

[bash]
kaggle competitions submit -c porto-seguro-safe-driver-prediction -f ./log/submit.csv -m "My first submit with default Logistic Regression"
[/bash]

初めてのsubmitは提出自体は成功しました。しかしながらMy Submissionでスコアを確認しようとしました
ところ、以下のエラーが

[bash]
Evaluation Exception: Object of type 'Kaggle.DataFrames.Series`1[System.Int32]' cannot be converted to type 'Kaggle.DataFrames.Series`1[System.String]'.
[/bash]

何やら雲行きが怪しい模様。もうすでに提出不可能な課題になったのでしょう。
実際、サンプルのsample_submission.csv でも試してみましたが、同じエラーが出たのでここは提出は諦めて、あくまで手元のスコアを伸ばす方法とその過程をしっかりと勉強することにします。

kaggleで上位にいくためには精度を高めて行かなくてはなりません。
そこで動画で紹介してくれているのはstratifiedKFold
です。何やら巧妙な名前の物体が出てきました。

Foldっと出てきたらこれはクロスバリディーションの一種と思ってください。
クロスバリデーションとは訓練データを一気に訓練するのではなく、細切れにして訓練と
テストを繰り返していく手法のことです。そのためにまず訓練データと
テストデータを分割する必要があるのですが、その方法にもいくつか種類がある
という話、その一つが今回の stratifiedです。stratified とは層状という意味で
層状・分割交差検証ということでちょっとわかりにくいですね。データを分割する時に
要は元のデータの分布をそのまま分割データにも持ってきてくれようとする分け方です。

はい。深堀せずどんどん(let's get going)いきましょう。


aucが0.49とかなんで全然良くないですね。0.5でランダムレベルなのでランダムで作った
回答と変わらない精度っということですので、この初期の状態のロジスティック回帰は精度は全く出てないですね。

auc とはなんだ? ==>todo

改善フェーズは
ハイパーパラメータを調整(パラメータサーチ)していく 1割
特徴エンジニアリング(特徴量探し)に9割 割くべき とおっしゃってました。
xgboost かけときゃいいんで。っとさらっと言いましたが アンサンブル学習的なやーつという
理解で進みます。

まずはParameterGridでパラメータをゴリゴリ変換してひたすら機械学習繰り返す方法
を試していきます。

[python]</pre>
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
all_params = {
'C' : [10**i for i in range(-1, 2)],
'fit_intercept': [True, False],
'penalty':['l2', 'l1'],
'random_state': [0],
'solver': ['liblinear']
}

min_score = sys.maxsize
min_params = {}
#https://www.youtube.com/watch?v=lTk09Wnbuis
for params in tqdm(list(ParameterGrid(all_params))):
logger.info('params: {}'.format(params))
<pre>[/python]

parameterGridは並列で走らせたいが、直列で走らせたと仮定して
よくあるあるで、この処理いつまでかかるのか?という時にtqdmが便利だ

[bash]pip isntall tqdm[/bash]

competitionの評価指標をevaluationで確認しましょう。(動画jumpGini Coefficient ということです。はい、わからないですが、進みます。

kaggleの良いところの一つとしていろいろなmetrics手法がわかることだそうです。
つまりそれだけ用途に合わせた手法があるということですね。これは少し面倒くさそうですが、
近道なしということなんですね。

また、この辺の評価関数がだいたいkernelを漁ると落ちているそうです。
今回もforza baselineという投稿でありましたね。これを回すだけで0.28台を出せるすごい
コードらしいですが、さておき、ここではgini関数を参考にさせていただきます。

[python]
def gini(y, pred):
fpr, tpr, thr = roc_curve(y, pred, pos_label=1)
g = 2 * auc(fpr, tpr) - 1
return g

[/python]

まぁ、重要なのは評価関数をざっと見ておくということと、その評価関数を実装に組み込むとリーダボードトの対比に便利ということです。
余談ですが、動画で参照していた the1owlというユーザーのアカウントはなくなってしまって
そのkernelもなくなってしまったわけですが、ユーザー自身は再度jazivxtという名前で復活しています。

日本人のmarugariさんがaucとginiの関連とというか何故aucを使わないのかをまとめてくれています。


さて、組み込んでみて結果は0.244といとこまで出ました
リーダボードで一位の人が0.29 だからLogisticRegression でここまで来たという
のは喜ぶべきことではないだろうか。
同時に、kaggleで行うことは
・徐々にいろんな手法で点数をあげていこと
という実感がすごく湧いた、というか実際手を動かしてやったので当たり前だが
この収穫は大きいと思う。点数を徐々に試行錯誤しながらあげていく感じがisuconに似ています。


ここにxgboostの解説が入ります。
。。。。

leaning_rateは超、重要なパラメータにはなるんですが、パラメータサーチをする際は
最後でいいと思います。理由は、時間がかかってしまうからで、なので他のパラメータを調整した後に
learning_rateを調整すればいいと思います。
後、hyperoptもよかったら調べてみてください。


今回、loadデータが綺麗すぎるんですよね。本来ならラベルデータとか数字変換したり
しないといけないんですよ。そうするとone hot encodingしたり、と云う工夫が生きてくるんですよね。

(動画jump)xgboostはone hot encodingなくてもいい説もありますが、logistic regressionの場合はやったほうが良いでしょう。
試しにone hot encodingやってみますか
おう。やろう。xgboost入れましょう。

[bash]pip install xgb[/bash]

似たようなlight gbmと言うものあるらしい。

xgboostを使っただけでスコアが0.24から0.276に跳ね上がった。
なのでみんなxgboostを使う模様。

xgboostは誤差に対してfitを重ねていくモデルなので
fitにバリデーションをかませることができる模様。
ローカル局所を避けることができるのか?計算が早くて済むのか
いまいちメリットがわからんが素晴らしいらしい。ので使ってみる。

なんやよくわからんが、cross validationを監視する上記の処理を入れてみた。
結果は同様に 0.276とかだが、n_jobs=8とするとすべてのコアが並列に走り、
すこぶる速くなった。


そして、また今度は xgboostのClassifierに対してParameterGridを走らすべく

[python]
all_params = {
'seed' : [0],
'max_depth':[3, 5, 7],
# これは最後コンペティションの最後くらいに0.01とか
# ちっちゃくすればいい。それまでは0.1とかで大きくやったほうが良い。
# なぜなら、一個の分類き作るのが時間かかるやん。
'learning_rate':[0.1],
'min_child_weight': [3, 5, 10],
'n_estimators':[10000],
# 'subsample':[1],
'colsample_bytree':[0.8, 0.9],
'colsample_bylevel':[0.8, 0.9],
'reg_alpha':[0, 0.1],
'max_delta_step':[0.1]
}
[/python]

こんなことをして、さらに結果がginiがゼロが続くようだったので
何かおかしいと、

[python]
clf.fit(x_train_fold, y_train_fold,
eval_set=[(x_valid_fold, y_valid_fold)],
#何ステップ更新されなかったら再起を停止するか eval_metric=gini_xgb
#最初10で設定してたら、諦めるの早すぎでgini係数がまともに評価されずに0
#続きだったので動画でもあるように100に変更した。
early_stopping_rounds=100,
)
[/python]

と変更した結果、なんと 0.28超えたがな。なさかしょっぱなから入門動画で
見事リーダーボード上位の点数出させてくれるとは思いませんした。
がこのように、一通りやり方を直に見せてくれて体現させてもらうと
自分でもできそうな気がしてきました。


one tip コラム。
ワンホッとエンコーディング説明してくているに、one hot encodingで作った元の
カラムを削除するんだけど、その際、inplace=Trueにすると、本来dropでのリターンがdataframe
のコピーなんだけど、inplace=Trueだと直接、元のdataframeに削除がかかってメモリを無駄遣いしない
ですよー、というチップ。

[python]
df.drop(col, axis=1, inplace=True)
[/python]

以上です。
まとめますと、
kaggle入門の動画をザァーと実践しました。
gcpアカウントを作成して、サーバーを立ち上げ環境を整えた。この時、
tmuxの設定に手こずったが、なんとか全て整った。
こっから機械学習での実装ということですが、データをロードして、正規化
の処理は今回のデータに関してはone hot encodingするくらいで、あとは全て綺麗と言う
ことです。loadのスクリプトを書いて、次に訓練として
LogisticRegressionをまずはなんのパラメータも調整せずにfit。
これでsumibt.csvを人鳥作れるようにした。
そのあと、は徐々にスコアを改善してくという流れ、
パラメータサーチ、特徴量探し、xgboost、かける parameter gridでスコアを伸ばしていった。
_jobsでの並列実行や、tqdmでの進捗可視化のテクニックやauc、giniなどの評価関数などにも
触れた。そしてスコアもリーダーボードと遜色ないレベルまでのスコアを体現できて
非常に体験のマスターピース、雛形、何か忘れたらここで得た、経験に戻ってきたいと思えるほど、
自分的には得るものは大きかった。もちろん、様々な知識はつけていかないとわかっているがそのプロセス
がわかったので応用が効きそうです。
その他、kernelをどのようにみるか、などのkaggleならではのポイントが随所にある
大変ためになりました。tkm2261さん、の動画を見てみなさまも一回勉強してみてはいかがでしょうか。

ありがとうございました。

参考参照

how to connect gcp with shhhttps://sleepless-se.net/2018/09/15/gcp-ssh/
how to tmux: https://qiita.com/nl0_blu/items/9d207a70ccc8467f7bab
tmux cheat sheet: https://qiita.com/nmrmsys/items/03f97f5eabec18a3a18b

clickboard on tmux: https://qiita.com/upinetree/items/cd80bc7865c52091be10

 

 

 

 

-データサイエンス

Copyright© CTOの日記 , 2020 All Rights Reserved.