では書きます。
本ソースはGoogle Colaboratoryで動かしています。
学習データ、検証データ、テストデータ
機械学習を行うにあたってデータが必要です。データには3種類あり、学習データ、検証データ、テストデータがあります。
この3つがとても混乱するので整理すると
訓練データ:パラメータを学習
検証データ:モデル選択
テストデータ:性能の測定
の違いがあります。
検証集合
モデルを作成した際、性能が良いか悪いか検証するデータの集まりを指します。いわゆるテストデータと呼ばれるものです。
テストデータを作るにあたって元のデータセットを学習データとテストデータに分ける必要があります。
分ける手法に、
・ホールドアウト法
・交差検証
・k-分割交差検証法
があります。以下に紹介します。
ホールドアウト法
シンプルにデータをテスト用データと学習データに分ける手法。

sklearnのtrain_test_splitではデフォルトはテストデータ0.25、学習データ0.75の割合で分けます。
コードはこちら
from sklearn.datasets import make_blobs
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# データセットの生成
X,y=make_blobs(random_state=0)
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=0)#ここでデータを学習データとテストデータに分けている。
logreg=LogisticRegression().fit(X_train,y_train)
print("Test set score:{:.2f}".format(logreg.score(X_test,y_test)))
結果
Test set score:0.88
交差検証(Cross Validation)
交差検証は学習データを訓練セットとテストセットに分けて行う手法。
ホールドアウト法と違うのは
・すべてのデータが一度検証に使われる(=結果に偏りがなくなる)
・検証に重複がない
・ホールドアウト法をk回繰り返すのでより信頼度アップ
とメリットが多いです。
図にするとこう。
コードはこちら(!pip install mglearnを忘れずに)
import mglearn
mglearn.plots.plot_cross_validation()
実際に検証してみましょう。
from sklearn.model_selection import cross_val_score
scores=cross_val_score(logreg,X,y)
print("Cross-validation scores:{}".format(scores))
print("Average cross-validation scores:{}".format(scores.mean()))
Cross-validation scores:[0.9 0.9 0.9 0.8 0.95]
Average cross-validation scores:0.89
k-分割交差検証法
交差検証法の分割数を指定する検証法です。
上では5だったので3でやってみましょう。
scores=cross_val_score(logreg,X,y,cv=3)#cv:分割数
print("Cross-validation scores:{}".format(scores))
print("Average cross-validation scores:{}".format(scores.mean()))
Cross-validation scores:[0.88235294 0.84848485 0.90909091]
Average cross-validation scores:0.8799762329174095
参考文献
http://nobunaga.hatenablog.jp/entry/2018/07/28/114927
Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎