どうもニコイチです。前回は、予測モデルの概要や、モデルの評価方法について学びました。今回は、モデル作成の最初のステップとして、データを学習データと評価データに分割する方法について解説します。
全編はこちらから

なぜデータを分割する必要があるのか?
前回の記事でも触れましたが、予測モデルの目的は、未知のデータに対しても高い精度で予測することです。これを汎化性能と呼びます。もし、モデルを作るためのデータ(学習データ)だけでモデルの精度を評価してしまうと、過学習という現象が起こり、未知のデータに対しては全く役に立たないモデルになってしまう可能性があります。
過学習は、例えるなら「テストの過去問ばかりを丸暗記して、初めて見る問題に対応できない」ような状態です。
そのため、モデルの性能を正しく評価するためには、データを学習に使用するデータ(学習データ)と、モデルの性能を評価するためのデータ(評価データ)に分割する必要があります。
データの分割方法:train_test_split 関数
Pythonでは、scikit-learn という機械学習ライブラリの train_test_split 関数を使うことで、簡単にデータを分割することができます。
train_test_split 関数は、指定したデータをランダムに学習データと評価データに分割してくれる便利な関数です。
train_test_split 関数の使い方
train_test_split 関数は、以下のように使います。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(説明変数X, 目的変数y, random_state=数値)
- 説明変数X:モデルを学習させるためのデータ(特徴量)
- 目的変数y:予測したい対象のデータ
- X_train:学習用の説明変数
- X_test:評価用の説明変数
- y_train:学習用の目的変数
- y_test:評価用の目的変数
- random_state:分割する際の乱数を指定する数値。同じ数値を指定すると、常に同じ分割結果が得られる。
データ分割のイメージ
例として、八百屋の販売予測を考えてみましょう。
もし、データが以下のような形で表されていたとします。
人参(個) | トマト(個) | きゅうり(個) | キャベツ(個) | 売上(円) |
10 | 5 | 20 | 8 | 1000 |
12 | 7 | 18 | 5 | 1200 |
8 | 3 | 22 | 10 | 900 |
… | … | … | … | … |
この場合、
- 人参(個)、トマト(個)、きゅうり(個)、キャベツ(個) が 説明変数X
- 売上(円) が 目的変数y
となります。
train_test_split 関数を使って、このデータを学習データと評価データに分割すると、以下のようなイメージになります。
学習データ
人参(個) | トマト(個) | きゅうり(個) | キャベツ(個) | 売上(円) |
10 | 5 | 20 | 8 | 1000 |
12 | 7 | 18 | 5 | 1200 |
… | … | … | … | … |
評価データ
人参(個) | トマト(個) | きゅうり(個) | キャベツ(個) | 売上(円) |
8 | 3 | 22 | 10 | 900 |
… | … | … | … | … |
学習データを使ってモデルを学習させ、評価データを使ってモデルの性能を評価します。
データの分割を実際にやってみよう
それでは、実際に 宿泊価格について_demo.csv のデータを使って、データを分割してみましょう。
1. 準備
まずは、必要なライブラリをインポートし、データを読み込みます。
import pandas as pd
from sklearn.model_selection import train_test_split
# CSVファイルの読み込み
data = pd.read_csv('宿泊価格について_demo.csv')
print(data.head())
2. ダミー変数化
前回の記事で学んだように、質的データを数値データに変換するために、ダミー変数化を行います。
select_columns = ['room_type','accommodates','bed_type','bathrooms','cleaning_fee']
dummy_data = pd.get_dummies(data[select_columns], drop_first=True)
3. データの分割
train_test_split 関数を使って、データを学習データと評価データに分割します。
X_train, X_test, y_train, y_test = train_test_split(dummy_data, data["y"], random_state=1234)
4. 分割されたデータの確認
分割されたデータの中身を確認してみましょう。
print("X_trainの形状:", X_train.shape)
print("X_testの形状:", X_test.shape)
print("y_trainの形状:", y_train.shape)
print("y_testの形状:", y_test.shape)
shapeを見ることで、学習データと評価データに分割されていることが確認できます。
つまずきやすいポイント
- train_test_split 関数の使い方:
- 引数には、説明変数と目的変数を指定します。
- random_state を指定すると、分割結果を再現できます。
- 学習データと評価データの役割:
- 学習データはモデルを学習させるために使う。
- 評価データは学習したモデルの性能を評価するために使う。
- X_train、X_test、y_train、y_test の意味:
- X は説明変数、y は目的変数を表す。
- train は学習用、test は評価用を表す。
データ分割の割合
train_test_split 関数では、デフォルトで全データのうち、75%を学習データ、25%を評価データとして分割するように設定されています。分割割合は test_size 引数で変更することができます。
例えば、評価データの割合を20%にする場合は、以下のように記述します。
X_train, X_test, y_train, y_test = train_test_split(dummy_data, data["y"], test_size=0.2, random_state=1234)
学習データと評価データの割合は、問題やデータ量によって調整する必要があります。一般的には、学習データが多すぎるのも、少なすぎるのも良くないとされています。評価データが少ないとモデルの評価が正しく行えず、学習データが少ないと十分な学習ができません。一般的には、7:3や8:2で分割することが多いようです。
まとめ
今回は、データを学習データと評価データに分割する方法について学びました。
- 予測モデルの汎化性能を担保するために、データを学習データと評価データに分割する。
- train_test_split 関数を使うと、簡単にデータを分割できる。
- random_state を指定することで、分割結果を再現できる。
- データ分割の割合は、問題やデータ量によって調整する必要がある。
今回の記事はここまでです。次回はいよいよ、モデルの評価に使う評価指標、RMSEについて解説します。お楽しみに!
コメント