機械学習:データセットをtrainingとtest用に分ける
機械学習手法を試すために、数多くのデータが公開されています。
ここのデータアーカイブは624のデータを持っています。
この中で、例として使われることが最も多いwineを使って、機械学習の世界に入っていきましょう。
このページ上で、データセットの特徴量を見ることができ、
![](https://assets.st-note.com/img/1689181094516-jvmhbn4u9q.png?width=1200)
これから、クラス名がカテゴリカルデータ(名称)で、他は全て連続値とあるから数値であることがわかります。また欠損値はありません。
CVS形式のデータなので、pandasのread_cvsを使って読み込みます。
import pandas as pd
import numpy as np
df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data',
header=None)
df_wine.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash',
'Alcalinity of ash', 'Magnesium', 'Total phenols',
'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins',
'Color intensity', 'Hue', 'OD280/OD315 of diluted wines',
'Proline']
print('Class labels', np.unique(df_wine['Class label']))
df_wine.head()
![](https://assets.st-note.com/img/1689182214886-NwxAoSlRal.png?width=1200)
df_wine.head()
このデータセットを使って、各ワインのアルコール度、含まれる、りんご酸濃度、無機成分、無機成分のアルカリ度、マグネシウム量等を特長量として、ワインのクラス分けを習得するのが、機械学習の目的です。
故に、変数に当たる特徴量のXには一列目のクラスラベル以外を割り当て、結果のYにはクラスラベルを割り当てます。
from sklearn.model_selection import train_test_split
X, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values
X_train, X_test, y_train, y_test =train_test_split(X, y, test_size=0.3,\
random_state=0, stratify=y)
データフレームの分割は、sklearn.model_selectionに入っている train_test_splitを使います。
2行目のX,y=にて、前記事で説明したilocを使っています。
3行目が分割作業で、test_size=0.3で、サンプルデータ(読み込んだ全データ)の30%が、X_test, y_testに割り当てられることを指定します。
訓練データを増やして、テストデータを少なくすると、学習して得られたアルゴリズムの汎化誤差の推定が正確に行えません。最もよく使われるのは、0.2、0.3、 0.4で、データセットが例えば数十万以上の大規模データだと、0.1, もしくは0.01でも良いとされています。
statify=yで、訓練データとテストデータのyの情報(class)が同じ比率で分割されることを指定しています。なぜならば、class=1がほぼ全ての訓練データyで訓練された学習モデルは、class=2やclass=3がclass=1より多く入っている試験データには適合せず、適切な学習は行われたとは言えません。
学習モデルの予測性能の改善のためには、訓練とテストの後、割り当てたテストデータを破棄せず、データセット全体でもう一度訓練を行う方法があります。