【機械学習実践】交差検証でモデル評価をしてみる【Python】

プログラミング

どうも、リンリンです。

前回の記事ではハイパーパラメータ自動チューニングライブラリ「Optuna」を使って、ハイパーパラメータチューニングをしていきました。

無事、モデルの精度を上げることに成功しましたね!

今回も機械学習における「不満」を解決するためにコードを書いていきましょう!!

【参考書籍】

テーブルデータでの機械学習手法が綺麗にまとめられています。

機械学習競技サイト「Kaggle」のトッププレイヤー達が共同著者です。とってもオススメ。

↓ 書評 ↓

スポンサーリンク

現状に対する不満「モデル評価用データが少ない」

さて、今まで様々な機械学習モデルを使って予測をしました。

でも私はかなり不満に思っている部分があります。それは…

モデル評価用データ206セットって少なくない!?!?!!?!?

って話ですよ。

現状の問題提起①

これは許せん。20%だけで評価していて、本当にいいのでしょうか??

モデル評価用データの割合を大きくする?

「20%が少ないと思うなら40%にすればいいじゃないか」と言われると、それもどうかと思います。

だって機械学習モデルを作る80%のデータが60%に減ってしまうじゃないですか。

現状の問題提起②

それでは機械学習モデルがデータ不足によって精度の悪いモノになってしまいそうですね。

じゃあ一体どうすれば!?

解決策:交差検証

答えは「交差検証」です。

交差検証とは、データを複数に分割して、1つのグループを評価データ・その他のデータを訓練データとしてモデルを構築・評価する手法です。

イラストで説明しましょうか。

まずは訓練データを80%・評価データを20%に分けます。評価データの重複を許さないように、5種類の分割が考えられますね。

交差検証のイメージ①

そして次に評価データを隠して、訓練データを使って機械学習モデルが作られます。

交差検証のイメージ②

モデルが出来たら、先ほど隠していた評価データをモデルに入れれば、予測値を出してくれます。

交差検証のイメージ③

評価データの重複を許していないんでしたね。つまり、予測値を全て統合すれば「全データの予測値を出力できる」ということです!

交差検証のイメージ④

ん?ちょっとまって。

じゃあ最初から「全部を訓練データかつ評価データにすればいいじゃん」と思った方は惜しいですね。

以前の記事を思い出しましょう。

機械学習モデルは訓練データには過剰にフィットしているので、訓練データを評価データに転用するのはNGでしたよね。不当に高い評価を出してしまいます。

訓練データと評価データのイメージ

だからわざわざデータを分割して、訓練データと評価データに分ける必要があったんですよね。

コードを書いて実践してみる

それでは実際にコードを書いて交差検証を実行しましょう。

ライブラリのインポート

今回は交差検証用にsckit-learnのKFoldというパッケージをインポートします。

それ以外は前回の記事と同様ですね。

CSVファイルの取り込み

例によって、コンクリートデータが入っているパスを入れてくださいね。

コンクリートデータを持っていない方は↓の記事からダウンロードしてください。

出来れば今までの記事を見ておくことをオススメします。

可視化関数の導入

後々、予測値と正答値を可視化するので関数を導入しておきます。

今までの記事で使っていた関数なので、もう慣れましたかね。

ハイパーパラメータを指定

LightGBMの挙動を変えるパラメータでも、「人の手を付けるべきパラメータ」を「ハイパーパラメータ」と言います。

今回は前回の記事で導き出したハイパーパラメータを使いましょう。

前回の記事↓

交差検証を実行

では交差検証をしていきましょう。

いやごめんなさい。難しいコードになっちゃいました。

これでもかっ!ってほど注釈を入れたのですが、分かりづらい点が多いですよね。

ちょっとイラスト付きで解説しますね。

まず「何でkfにコンクリートデータindexを与えているか」ですね。

コード中の交差検証イメージ①

状態としては上の図のように、Indexを訓練用(青色)と評価用に(オレンジ)に分割してそれぞれのループで使用しています。

例えばループ1周目では、Index1と4が評価データIndexとなっていますね。

コード中の交差検証イメージ②

訓練データと評価データのIndexが分かれば、説明変数と目的変数を分割することもできます。

実際にはindexは0~9だけではなく、0~1029まで(コンクリートデータ数分)ありますが、このようにしてX_train, X_test, y_train, y_testを作るわけです。

 

そしてコードで分かりづらい箇所がpredicted_dfですね。

この箇所では、次のように空のデータフレームが作られています。

コード中の状態イメージ①

そしてループの中のコード

で、temp_dfの中身は

コード中の状態イメージ②

このようにindex列に予測値を作り出した評価データのindexが。pred列には予測値が格納されています。

そしてこのコードで、空のデータフレームとtemp_dfを結合します。

コード中の状態イメージ③

ということで、最終的に作られたpredicted_dfがこちら。

コード中の状態イメージ④

このままでは色々と不備がありますね。

  • 1行目に空のデータ(index=0, pred=0.00000)が入っている
  • 正答値が格納されていない
  • indexが’index’という列に表記されているだけで、データフレームとしてのindexになっていない

ということで、これらの不備を解決するためにまた加工をします。

このコードを実行すると、predicted_dfはこんな感じになります。

コード中の状態イメージ⑤

はい。空のデータが消え、正答値も格納され、’index’列はデータフレームとしてのindexになりました。

 

今回はこんな分かりづらいコードになってしまいました。もっと強い方に可読性の高い記述方法がないか聞きたいですね。

予測値と正答値を可視化

ではさっそく交差検証で算出された全データの予測正答値マップを出力しましょう!

さっきの関数に作ったpredicted_dfをぶち込みます。

交差検証の予測正答値マップ

素晴らしい!全データ分のプロットがあるだけに密な相関図になっています!

ちなみに前回は↓ データ数は1/5ですね。

交差検証していない予測正答値マップ

ということで、交差検証をすることでモデルの精度を落とすことなくより多くの予測値を作り上げることができました!

このような交差検証は、モデルを正確に評価する上で非常に重要なテクニックになります。

交差検証のイメージを忘れずに覚えておきましょう。

 

追記:機械学習完全マスター教科書販売中です980円[期間限定]:24350文字の教科書です)

pythonの一般的な教本と一味違い、

  • 第一に機械学習を最短経路で「実装」できる
  • 第二に詳しい原理が理解できる

これらを重視して執筆しました。

普通の教本の1/4くらいの値段ですし、誰かに紹介すれば半額の紹介料が入るのですぐ元は取れます

★★★★★この価格でこのクオリティは凄すぎる

大学生ですが、これをつかって実験のレポートのデータ解析などにもつかえそうだと思いました! また、値段が安すぎて恐縮してます汗 凄すぎる…

レビュー欄より

↑こんなコメントも頂きました!ありがとうございます(泣)

お役に立てて、必死に執筆した甲斐がありました(泣)(泣)

レビューはモチベに繋がるので、順次追記してコンテンツを増加していきます!乞うご期待!

追記[2020/03/14]:コンテンツ追加しました。

  • ランダムフォレスト&LightGBM内部計算の可視化方法
  • 内部可視化を基にした原理解説
  • 学習の進行による予測分布の変化
  • マテリアルズインフォマティクスへの活用方法

Python初心者であれば更に理解が深まり、玄人でも更なる原理や挙動の知見を得ることができるようになりました!

是非一読あれ~

↓リンク

機械学習はこれ一本!pythonインストール~機械学習実装まで完全理解講座

コメント