はじめに
データサイエンティスト協会が主催するデータサイエンティスト養成講座を受けている。
受講の動機
受講の動機は、データサイエンスに興味があり、勉強したかったから。
今まで、機械学習の勉強をしようとして、流行りのDeepLearningにばかり取り組んできた。
しかし、DeepLearningを学んでも現実の問題に適用するのは難しい。
急にAIが流行りだしたから、みんなDeepLearningを勉強し始めたが、
なんか違うというか、ズレている気がしている。
今はお祭り騒ぎのような気がしてならない。
なので、きちんとデータに向き合う力、
そしてそれを現実に応用できる力をつけるためにこの講座に申し込んだ。
裏の理由は、kaggleや DeepAnalyticsで、データがcsv形式で与えられた時、
分類問題や予測問題に取り組む力が欲しかったから。
こういう機械学習コンペの攻略法的な書籍やwebページが探しても見つからないのだ。
この講座では、DeepAnalyticsの練習問題に実際に取り組んでいくことで、
機械学習のモデル構築の手法を学ぶという実践的な講座。
受講生の人たちは、会社から派遣されてきたデータサイエンス部所属の人たちがほとんどだ。
自分は、趣味で自費(8万円!)で、しかも会社には受講していることを秘密にして受講している。
おそらくそんな人はほとんどいない。
概要
DeepAnalyticsのコンペにチームで取り組んでいく。
講座では、まずは講義がありそのあとに演習課題がだされてそれに取り組む。
演習課題はチーム内で相談しながら進めていくので、わからなくても教えあえる。
演習課題は、時間内に終わらないので、それが宿題になる。
チーム内や講義内容の情報共有は、グループウェアのサイボウズLiveが使われる。
各チームごとにグループが作成されて、情報共有できる。
各回の内容
第1回
初回の講座では、Rの基礎とモデルの評価方法が紹介される。
私は今までPythonを使ってきたので、Rのことがわからなかったので、
なれるまでは一苦労だった。
データの処理方法として、dplyrというライブラリが紹介される。
ちょうど、Javaでstreamについて勉強していたので、
dplyrはそれと比較すれば理解はしやすかった。でも、使いこなせる気がしない。。。
モデルの評価方法としてRMSEとAUCが紹介される。これらの指標は、
これからDeepAnalyticsで評価で使われるからだ。
RMSEは理解が容易だが、AUCはちょっと難しい。講座でも、AUCは時間をかけて説明された。
そのあとは、実際にDeepAnalyticsの銀行問題のデータをダウンロードして解析するという
課題が出された。そこまで難しくはない。後日、模範解答が配られ、dplyrをバリバリに
使ったかっこいい解法が紹介されていてちょっとびっくりした。
課題は、はじめは個人で考えるのだが、わからないときはチーム内で相談することができる。
なので、仲良くなる意味でも相談し合った。
第2回
機械学習アルゴリズムとして決定木が紹介される。
Rで決定木をつかうには、rpartというライブラリを使う。
決定木は、ライブラリをつかうとぱっと計算できてしまう。楽だ。
また、前回紹介されたAUCもrRocというライブラリを使うとすぐに計算できる。
そして、決定木でDeepAnalyticsの銀行問題をとりあえず解いて、
適当にパラメータチューニングしてコンテストに提出することをやった。
手元で計算したAUCよりも低い値がでる。なぜでしょう?という流れから、
過学習の説明が始まる。
過学習を防ぐために、ホールドアウト法とクロスバリデーション法が紹介される。
そのあと、パラメータチューニングの方法としてグリッドサーチが紹介される。
このあたりになると自力でのコーディングはちょっとむずかしい。
あたえられたサンプルコードを弄り回してグリッドサーチをする。
家に帰って、課題をPythonで解いてみた。scikit-learnの勉強にもなる。
しかし、どうもpythonで書いた決定木とRで書いた決定木の結果が一致しない。
なので、Rで書いていくことにした。
caretというライブラリを使うと、グリッドサーチが簡単にできるので試してみた。
しかし、caretは rpartモデルではcp, rpart2モデルでは maxdepthしかできない。
やりたいことは複数のパラメータを同時に探索することだ。
いろいろ調べたらmlrというパッケージでそれが実現できることがわかった。
mlr で グリッドサーチをして、目標だった AUC 0.9 以上を達成!
第3回
今回は、リニア系の手法ということで、ロジスティック回帰が紹介される。
kaggleのアンケート調査では、データサイエンティストが一番利用しているのは、
このロジスティック回帰だそうだ。二番目は、決定木。
その理由は、どちらも結果がわかりやすく、説明もしやすいからだそうだ。
そのままでもそこそこの精度はでるのだけれども、より精度を出すために、
データの加工方法が紹介される。
たとえば、絶対値をとったり、logをかましてデータを直線に近くなるようにする。
また、外れ値を削除した。決定木は条件を分岐していくので、外れ値はそれほど影響はないが、
このロジスティック回帰には影響がかなりある。
データをプロットして性質をつかみ、データを加工して、精度を見ていく。
だんだんデータサイエンティストっぽくなってきた。
最後におまけとして、Lasso回帰やRigde回帰も紹介される。
宿題は、ロジスティック回帰を利用して再度投稿してみること。
私は毎度のことながら、Pythonに課題を移植して取り組んだ。
データ加工は外れ値の除去をしてみたら精度が上がった。
が、他のアイデアはでなかった。しかし、そこはチームで取り組んでいるので、
他のメンバがアイデアを提案してくれた。
私は、事前に Pythonではじめる機械学習を読んでいたので、
そこにかかれていたLassoやRidge, Polynomial Featureを使って、精度を上げたがそれは注意された。
ツールを使えば簡単にいい精度がでるけれども、
それだとブラックボックスの機械を使っているだけになってしまいます。
この講座では、データの様子を良くみて、どう工夫するのかという基礎を講習しているつもりです。
なので、結果としてのスコアも大切ですが、何をしているのかを理解することはもっと重要です。
先生がたの熱意や優しさを感じたのだった。
第4回
集団学習(アンサンブル学習)について学ぶ。バギング、スタッキングが紹介される。
まずは、出力結果の平均をとる平均法が紹介される。
単純に今までの決定木系とリニア系の手法を足すだけで、精度が上がった。これは不思議。
次にバギングが紹介される。これも数式はないものの、
わかりやすい図とサンプルコードとともに紹介されるので、理解できた。
次にスタッキング。これは、理解が難しかった。
しかし、このスタッキングを紹介している書籍やウェブページはあまりないため、
この講座の資料はとても貴重なものだと言われる。たしかに、調べても検索で引っかからない。
こちらもわかりやすい図とサンプルコードが与えられるのだが、
会場にいる人のほとんどが理解できずポカーンとしてしまった。
私は、それから家に帰って4時間くらいうんうんうなってようやく理解できた。
課題は、アンサンブル学習を利用してさらなる精度向上を目指すこと。
最後にxgboostとランダムフォレストという究極秘密兵器が紹介され、頑張ってと言われる。
家に帰り、バギングとスタッキングをPythonで実装しなおした。
スタッキングがどうもバグって時間がかかったものの、
どちらもスクラッチでコーディングすることができた。
しかし、そうやって頑張って理解したものよりも、
xgboostとランダムフォレストをつかったほうが簡単にいい精度がでてしったのだった。
これはすごい。さすがはコンペで大活躍している手法のことだけある。
xgboostはパラメータチューニングが難しい。解説サイトがあったので、それを元にチューニング。
xgboostは GPUで走らせることができるので、Amazonの AWSの EC2インスタンスを借りて、
走らせた。自分のNotePCで走らせるのと比べて爆速でびっくり仰天。
最終的には、以下の結果となった。
`○投稿結果: 0.94031
○手法の工夫
-
ランダムフォレスト
パラメータチューニングには、mlrパッケージを使って実施 + 手動チューニング
https://gist.github.com/tsu-nera/5e948a5026ea2a0587783f64bf308faa
-
xgboost
パラメータチューニングは、Pythonで以下のサイトを元に実施。
○アンサンブルの工夫
- ランダムフォレストとxgboostの結果を59:41の割合で足した。
次回は、中間発表と、後半の課題Jリーグ問題だ。後半へ続く。