機械学習では、データを2つのセットに分割するのが一般的です。
この2つのセットとは、トレーニングセットとテストセットです。
その名の通り、トレーニングセットはモデルの学習に使用され、テストセットはモデルの精度をテストするために使用されます。
この記事では、以下のことを行います。
- 最初に、データセットを分割することの重要性を学びます。
- 次に、Pythonでデータを2つのセットに分割する方法について学びます。
なぜデータをトレーニングセットとテストセットに分ける必要があるのでしょうか?
機械学習モデルの学習では、すべてのデータ点を最小限の誤差で最もよく表すパターンを見つけようとしている。
その際、2つの一般的なエラーが発生します。
オーバーフィッティングとアンダーフィッティングです。
アンダーフィッティング
Underfittingとは、モデルがトレーニングデータセットのデータポイントさえも表現できていない状態です。
アンダーフィッティングの場合、トレーニングデータセットでテストしても精度が低くなります。
Underfittingは通常、モデルが単純すぎてデータセットの複雑さを捉えられないことを意味します。
オーバーフィッティング
Overfittingとは、モデルが学習データセットを少し正確に表しすぎる場合です。
これは、モデルの適合度が高すぎることを意味します。
オーバーフィッティングの場合、モデルは新しい未知のデータに対してうまく機能しなくなります。
オーバーフィッティングは通常、モデルが複雑すぎることの表れです。
オーバーフィッティングもアンダーフィッティングもどちらも好ましくありません。
学習データでテストすべきか?
理想的には、トレーニングデータでテストするべきではありません。
モデルは訓練データセットをオーバーフィットしている可能性があり、それゆえ新しいデータでは失敗します。
トレーニングデータセットでの精度が高ければ、未知のデータでのモデルの成功が保証されるわけではありません。
このため、トレーニングデータとテストデータを分けておくことが推奨されます。
基本的な考え方は、テストセットを未経験のデータとして使用することです。
トレーニングセットでデータを学習した後、テストセットであなたのモデルをテストする必要があります。
テストセットでモデルがうまく動作すれば、自分のモデルに自信を持つことができます。
How to split training and testing data sets in Python?
最も一般的な分割比率は 80:20 です。
つまり、80%のデータセットをトレーニングセットに、20%のデータセットをテストセットに入れるということです。
データを分割する前に、データセットが十分な大きさであることを確認してください。
トレーニング/テスト分割は、大きなデータセットでうまく機能します。
では、早速コードを書いてみましょう。
1. データセット全体をインポートする
この記事では、California Housingのデータセットを全体的に使用します。
まずは、Pandasを使ってデータをデータフレームにインポートするところから始めましょう。
pandasはpipコマンドでインストールすることができます。
pip install pandas |
を使用してデータセットをpandasのDataframeにインポートします。
import pandas as pd
housing = pd.read_csv( "/sample_data/california_housing.csv" )
housing.head() |
y = housing.median_income
|
median_income列を出力(Y)として扱います。
x = housing.drop( 'median_income' ,axis = 1 )
|
同時に入力ベクトルを形成するために、データセットからカラムを削除する必要があります。
x.head() |
Pandasの.head()メソッドを使って、入力と出力がどのようなものかを確認することができます。
y.head() |
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.2 )
|
print ( "shape of original dataset :" , housing.shape)
print ( "shape of input - training set" , x_train.shape)
print ( "shape of output - training set" , y_train.shape)
print ( "shape of input - testing set" , x_test.shape)
print ( "shape of output - testing set" , y_test.shape)
|
import pandas as pd
housing = pd.read_csv( "/sample_data/california_housing.csv" )
print (housing.head())
#output y = housing.median_income
#input x = housing.drop( 'median_income' ,axis = 1 )
#splitting x_train,x_teinst,y_train,y_test = train_test_split(x,y,test_size = 0.2 )
#printing shapes of testing and training sets : print ( "shape of original dataset :" , housing.shape)
print ( "shape of input - training set" , x_train.shape)
print ( "shape of output - training set" , y_train.shape)
print ( "shape of input - testing set" , x_test.shape)
print ( "shape of output - testing set" , y_test.shape)
|
入力と出力のベクトルが準備できたので、データをトレーニングセットとテストセットに分けることができます。
2. sklearnを使ったデータの分割
データを分割するために、sklearnのtrain_test_splitを使用します。
train_test_split は、指定された比率に従って、データをトレーニングセットとテストセットにランダムに分割します。
pythonでどのように行うか見てみましょう。
ここでは、80:20の割合で分割しています。
20%のテストデータセットは、末尾の0.2で表されています。
テストセットとトレーニングセットの形状を比較するには、以下のコードを使用します。
これは次のような出力になります。
The Complete Code
この学習データとテストデータの分割のための完全なコードは以下の通りです。
まとめ
この記事では、データをトレーニングセットとテストセットに分割することの重要性について学びました。
さらに、データセットを pandas Dataframe にインポートし、sklearn を使用してデータをトレーニングセットとテストセットに分割しました。