機械学習2|ホールドアウト法とクロスバリデーションで少ないデータで学習する

  • URLをコピーしました!

ここで学習すること

教師あり学習の基本であるホールドアウト法を学習します。
ホールドアウト法をPythonで実行するためのtrain_test_splitでデータを訓練データとテストデータに分割する方法を学習します。クロスバリデーションにて少ないデータでも精度を上げる手法を学習します。

教師あり学習では訓練データとテストデータの2つが必要です。訓練データで学習し、テストデータで作成したモデルの精度を評価します。この手法をホールドアウト法といいます。

訓練データ、テストデータの比率は8:2くらいとします。データ数は50個以上必要とされています。

train_test_splitでデータを訓練データとテストデータに分割する

pythonではscikit-learnというライブラリを使います。このライブラリ内のtrain_test_split関数でデータを訓練用データとテストデータへ分割します。ここではデータの分割までを解説します。

scikit-learnのデータセットを読み込みます

from sklearn import datasets

sklearn.model_selectionライブラリ内のtrain_test_split関数を読み込みます

from sklearn.model_selection import train_test_split

データセット内のirisデータセットを読み込みます

iris = datasets.load_iris()

変数Xに正解ラベル以外の配列を代入します

X = iris.data

#このような150行4列の行列データです

yにXに対する正解ラベルの配列を代入します

y = iris.target

#このような150行の行列データです。

「X_train, X_test, y_train, y_test」にX,yデータを振り分けて格納します。test_size=0.2はテストデータの割合を指示します。ここでは20%と指示しています。random_state=0は省略可能ですが、省略するとテストデータが毎回ランダムで選ばれます。データセットが変わると精度も変わるので、通常指定しておきます。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

print (“X_train :”, X_train.shape)
print (“y_train :”, y_train.shape)
print (“X_test :”, X_test.shape)
print (“y_test :”, y_test.shape)

訓練データとテストデータのサイズを表示します。150行4列のデータが120行4列と30行4列に振り分けられました。

X_train : (120, 4)

y_train : (120,)

X_test : (30, 4)

y_test : (30,)

k-分割交差検証(クロスバリデーション)で少ないデータでもモデルの精度を上げる

k-分割交差検証では、データをk分割し、そのうち一つを検証データ、残り(k-1)をテストデータとして使用します。その後、テストデータとして使用する変えることでk個のモデルによる性能評価が可能です。

そのため、データ数が少ない場合(100個以下の場合)でもモデルの精度をあげることが可能です。

以下にクロスバリデーションのイメージを示します。クロスバリデーションしない場合は1回の学習で終了しますが、クロスバリデーションを使用することで10回の学習が可能になります。

よかったらシェアしてね!
  • URLをコピーしました!
目次