Python

Kaggleの機械学習のコースで勉強したまとめ

投稿日:2018年8月26日 更新日:

Machine Learning Course

  • 必要スキル Python
  • 無料
  • 4時間
  • 19レッスン

おおむねこの本に書いてありました.詳しくはこちらの本で.

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎書籍

作者Andreas C. Muller, Sarah Guido

クリエーター中田 秀基

発行オライリージャパン

発売日2017年5月25日

カテゴリー単行本(ソフトカバー)

ページ数392

ISBN4873117984

Supported by amazon Product Advertising API

データの事前処理

欠損値の処理

欠損値とは、データが欠けていること.
pandasでは、NaN(Not a number)で表される.
決定木の理屈では、欠損値は欠損値のままで受け入れるはずなんだけど、scikit-learnでは欠損値を含むデータを入れるとエラーが出る.

欠損値の処理には、便利なImputerをつかうとまとめて平均値を欠損値にいれてくれる.

~0.19の場合

0.20~の場合

列に含まれる欠損値を確認する方法

Imputerを使わずに欠損値を代入する方法

fillnaで、欠損値に指定した値を入力してくれる.

カテゴリカル・データのonehot変換

男女(Sex)や出発地(Embarked)なども、そのままではscikit-learnに入れられないから数値に変換する必要がある.
ここで悩ましいのが、男を1、女を2にしたらいいのか、あるいは女は-1や0にしたらいいのかということ.
二種類しか分類がなければいいけど、3種類のときは、順番によってデータの重要度が、変わるわけではないのに、数値をいれることで後ろに行くほど、データが重要なようにも評価される可能性がある.
onehot行列は、該当する列だけが1で残りは0となる行列.
onehot化することで、すべてのデータを等しく評価することが期待できる.

onehot化するには、get_dummiesでonehot化したDataFrameを取得できるので、これをもとのdfにくっつける.

Model Validation 学習結果の評価

学習用データとテスト用データの分割

テスト用のデータがないなら、学習用データの方を学習用とテスト用にわけなければだめだった.
そうしないとパフォーマンスを測るのが難しくなる.

train_test_splitというヘルパー関数で、データを簡単に学習用データとテスト評価用のデータに分割することができる.
random_stateというオプションで、毎回、データがランダムに変わることを防ぐことができる.

Kaggleでは、学習用データをわけて、評価したあと、提出用のデータは全データを使って学習し直すべき.

前は、データを分けるのにShuffleSplitをつかった.

平均絶対誤差 mean absolute error

機械学習は、大きくわけて、数値を予測する回帰型(Regressor)とクラス分けをする分類型(Classifier)に分かれる.

回帰モデルの場合は、平均絶対誤差を用いるらしい.

平均絶対誤差は、小さいほど良いモデルということになる.

使い方としては、テスト用データから、予測した数値と正解データを関数に入れる.

分類型の場合は、平均絶対誤差はスコア(clf.score)と裏表みたい.

Cross Varidation

学習用データとテスト評価用のデータの分割には問題がひそんでる場合がある.

学習用データに偏りがあったり、評価用のデータに未評価のデータが含まれたりする可能性があって、十分に学習できないから.

Cross Varidationは、データを複数に分けて、学習用データと評価用データを順番に入れ替えて、モデルの正当性を評価する手法.

scikit-learnでは、cross_val_scoreという関数がある.
closs_val_scoreに、データと分類器をいれると、各スコアを行列で返してくれる.
neg_mean_absolute_errorを指定してるので、マイナスの平均絶対誤差で計算される.
つまり、大きいほうが評価が高いということになる.

Cross Varidationとデータの分割は、どちらによるか、ケース・バイ・ケースによるべきで、正確性を求めるならCross Varidationだけど、データが大きいとその分、Cross Varidationのほうが評価に時間がかかってしまう.
その場合は、単純にデータを分割してやってみたほうがはやい.

ROC AUC

スコアはROC AUCという計算方法が採用されることが多いみたい.

パラメータ・チューニング

分類器のパラメータのように、データの外で設定するパラメータをハイパーパラメータという.
ハイパーパラメータの設定でスコアが変わったりもするけど、その設定は職人芸的なところもあるという.
MEAやCrossValidationなどで評価基準ができたことで、ハイパーパラメータもスコアがよくなるように計算することができる.

複数のパラメータの組み合わせの最適解を求めるならグリッドサーチというやつをつかう.

これは、後記のXGBoostでグリッドサーチしたパターン

分類器

Random Forest

アルゴリズム

ランダムフォレストは、wikipediaによると、決定木を弱学習器とする集団学習アルゴリズムとのこと.

  1. 学習を行いたい観測データから、ランダムサンプリングによりB組のサブサンプルを生成する(ブートストラップサンプル)

  2. 各サブサンプルをトレーニングデータとし、B 本の決定木を作成する

  3. 指定したノード数nminに達するまで、以下の方法でノードを作成する

    1. トレーニングデータの説明変数のうち、m 個をランダムに選択する

    2. 選ばれた説明変数のうち、トレーニングデータを最も良く分類するものとそのときの閾値を用いて、ノードのスプリット関数を決定する

要点は、ランダムサンプリングされたトレーニングデータとランダムに選択された説明変数を用いることにより、相関の低い決定木群を作成すること。

パラメータの推奨値

nmin: 分類の場合は1、回帰の場合は5
m: 説明変数の総数をpとすると、分類の場合はsqrt(p)、回帰の場合は p/3

評価

最終出力は以下のように決定する

識別: 決定木の出力がクラスの場合はその多数決、確率分布の場合はその平均値が最大となるクラス
回帰: 決定木の出力の平均値

XGBoost

XGBoostは、Gradient Tree Boostingという理論の実装であるとのこと.

Gradient Boostという勾配を用いた学習とRandom Forestを組み合わせたアンサンブル学習の手法らしい.

sklearn.ensemble.GradientBoostingClassifier

scikit-learnにもGradient Tree Boostingの実装があるみたい.

まとめ

コードを、1.定義フェイズ、2.事前処理フェイズ、3.パラメータチューニングフェイズ、4.学習フェイズ、5.出力フェイズに分けた.
定義フェイズでは、なるべく数字はハードコードせず、前出しして、定義部分の数値を変えるだけで済むようにしてメンテナンス性を高めた.
事前処理フェイズでは、最後にテスト用データも同じ処理をするので、関数にした.ここで、欠損値の処理方法やonehot化の処理を変える.
パラメータチューニングフェイズでは、パラメータチューニングの処理を書く.
学習フェイズでは、事前処理フェイズで処理したデータとパラメータチューニングフェイズで最適化したパラメータで学習する.
評価フェイズでは、スコアを表示する.
出力フェイズでは、提出用にデータを加工する.

そのほかにコードの管理にはgitを使ったほうがいい.
2個前の変更に戻って分岐するといったことが頻繁に起きる.
そのたびに適当にファイル名を変えていたら管理しきれなくなる.ブランチなどで分岐させて管理したほうがいい.
上のファイルでは、コミットメッセージ用の情報をテキストファイルで書き出すようにしてるので、そのファイルを使ってコミットすればよい.

commit logの例

あと、git管理してると、result.csvが変化したか、変化した箇所がすぐわかるのもいいかも.

80点超えました!!

朝晩少しずつやって1週間くらいかかりました.

-Python
-, , ,

執筆者:

関連記事

Pythonではじめての強化学習2〜CartPole-v1

By: Robert Couse-Baker – CC BY 2.0 目次1 リファクタリング2 CartPole-v13 リファクタリング24 そのほかのEnvへの応用 リファクタリング …

Pythonではじめての機械学習~scikit-learn、tensorflow

By: krheesy – CC BY 2.0 目次1 機械学習2 scikit-learn3 tensorflow 機械学習 勉強しているところなので、間違っている箇所もあるかもしれませ …

Pythonではじめての強化学習3〜Actor and Critic model

By: Banalities – CC BY 2.0 目次1 課題 出力が連続値の場合2 Actor and Critic3 Actorにノイズを付与する4 結果 MountainCarC …

市場テクニカル分析ライブラリta-libとPython用のラッパーTa-Libをインストールする

By: GotCredit – CC BY 2.0 目次1 ta-lib2 Ta-Lib ta-lib ta-libは市場のテクニカル分析用のライブラリ集. linuxの場合はソースコード …

Python3で株式売買のシミュレーション〜pandas

By: Michael Gwyther-Jones – CC BY 2.0 目次1 株式売買シミュレーション2 ファイルの構造3 pandas4 DataFrameの作成、構造5 csvか …