1. はじめに
機械学習でscikit-learnを使用しました。その際、サンプルコードにてK分割交差検証を使用していたので、その詳細を述べます。ライブラリの解説の理解のために自分なりに解釈したものになります。
※この分野1年目の初学者の為、誤っている場合があります。
2. 前提知識
機械学習においてパラメータとハイパーパラメータには違いがあります。
パラメータとはモデルの精度を良くする為に学習時に勝手にチューニングする数値です。重みやバイアスなどがあります。
対してハイパーパラメータは人間が調整する数値です。学習回数など様々です。例えば以下のような引数などのことです。
# 決定木の場合:木の深さ、ノードに対する分岐の数、ランダム性の指定など
clf = DecisionTreeClassifier(max_depth=None, min_samples_split=2,random_state=0)
この違いを押さえたうえで、機械学習で扱うデータには3つの分類があります。データの種類を理解することで精度の高いモデルを作成することができます。それぞれのデータによって全体のデータセットは3分割されます(3等分ではないことに注意)。
訓練データとはモデルをはじめに学習するときに使うデータです。
検証データとはハイパーパラメータを調整するためのデータです。
テストデータとは完成したモデルの精度を測るためのデータです。既に学習しているデータ(訓練データ・検証データ)であると必ず正解するため、それ以外の未知のデータである必要があります。
3. 本題
機械学習の流れとしては訓練→検証→テストになります。
一般的な例だと、勉強→模擬テスト→本試験となります。
3.1. K分割交差検証の必要性
検証はモデルの学習時に行われます。この時、訓練データと検証データが過度に適合してしまい、モデルの正確性評価が必要以上のスコアになってしまう過学習(overfitting)を避ける必要があります。この場合、未知の値に対して精度が出せない丸暗記のような状態となってしまうのです。
過学習を避けるために、教師あり機械学習を行う際には、利用可能なデータセットの一部をテストデータセットとして別に保持する必要があります。ただし、単に利用可能なデータセットを3分割すると、モデルの学習に使用できるデータの数が少なくなり精度が落ちてしまいます。
ここでの解決策がK分割交差検証です。
3.2. K分割交差検証とは
この問題の解決策として交差検証(cross-validation)があります。K分割交差検証はテストデータ以外のデータセットをK個のセット(=fold)に分割します。K個の分割された各セットに対して以下の手順を行います。図は英語なので、訳さないです。
- k-1個のfoldを訓練データとして使い、モデルを学習させる。
- 学習させたモデルの性能を、残りの1個のfoldである検証データで評価する。
- それぞれ違うfoldを検証データとすることでk回学習する。
- それぞれの結果の平均値を取ることで正確度など指標が求められる。
メリットとしてデータを無駄なく使える点があります。訓練データと検証データを固定しないため、データを最大限使用することができます。余談ですが、逆推定問題(結果から原因を求める問題)で非常に重要になるとされています。
デメリットは計算コストが高くなる点です。モデルの学習をK回行うため、一般のK倍時間がかかります。
具体例を下の5分割交差検証を用いて考えていきましょう。
- データセットをTraining dataとTest dataに分けます。今回はTrainingデータを訓練データと検証データの2つのデータとして使用します。
- Training dataを5分割し、Fold1-5を作成する(灰色)。
- 青色Foldを検証データ、緑色Foldを訓練データとし、それを変更しながら5回分、正解率の評価を行う。
- 5回の正解率の平均値を取り、検証結果とする。

4. おわりに
頑張った!!
理解すると意外と単純なことだったというオチでした。でも油断は禁物です。プログラムも載せようと考えていたましたが、とりあえず速度重視でアウトプットしました。後々追記するかもしれません。
何か間違いや不明点があればコメントして下さると幸いです。また、理解の助けになったという方がいればいいねやストックして下さるとと嬉しいです。雑多に書いていこうと思います。
参考文献