0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIエンジニアへの道:データ操作からAIをマスターする30日間ロードマップ - 6日目

Last updated at Posted at 2025-07-13

データセットを分割する!訓練データ・検証データ・テストデータの重要性

皆さん、こんにちは!AI学習ロードマップ6日目です。昨日までで、データの読み込み、前処理、特徴量エンジニアリングといった、AIモデルの入力データを準備する方法を学びました。

今日のテーマは、AIモデルの学習において最も基本的で、かつ決定的に重要なプロセスである「データセットの分割」です。特に、訓練データ、検証データ、テストデータという3つのデータの役割と、なぜこの分割が必要なのかを徹底的に解説します。

AIモデルを正しく評価し、過学習(過剰適合)や未学習(過少適合)を防ぐためには、データ分割の理解が不可欠です。本日は、それぞれのデータの役割と、AIモデルの評価におけるデータ分割の重要性について詳しく見ていきましょう。


1. なぜデータセットを分割する必要があるのか?

AIモデルを開発する目的は、未知のデータに対して正確な予測や分類を行うことです。しかし、モデルを訓練したデータと同じデータで性能を評価すると、モデルは訓練データを「暗記」してしまっただけで、現実世界での汎化能力がないにもかかわらず、高い精度が出ているように見えてしまいます。これを 過学習(Overfitting) と呼びます。

例えば、テストで全く同じ問題が出るとわかっていれば、回答を丸暗記するだけで満点が取れます。しかし、現実世界では応用問題が出される可能性が高く、丸暗記では対応できません。

AIモデルの真の能力(汎化能力)を評価し、過学習を防ぐためには、モデルが見たことのないデータで評価する必要があります。これがデータセットを分割する最大の理由です。


2. データセットの3つの役割

AI開発プロセスでは、通常、データを以下の3つのセットに分割します。

2.1. 訓練データ (Training Data)

  • 役割: モデルが学習するために使用される主要なデータセット。モデルは訓練データの特徴量と目的変数(正解ラベル)の関係を学習し、パラメータを調整します。
  • 特徴: データセット全体の大部分(通常70%〜80%)を占めます。
  • AIモデルとの関係: モデルは訓練データを見て、学習し、パターンを認識します。

2.2. 検証データ (Validation Data)

  • 役割: モデルのハイパーパラメータ(モデルの構造や学習プロセスを制御する設定値)をチューニングし、学習中にモデルの性能を監視するために使用されます。モデルは検証データを見て学習することはありませんが、ハイパーパラメータの調整のためにその性能が評価されます。
  • 特徴: 訓練データとテストデータの中間に位置します。
  • AIモデルとの関係: 学習プロセス中に、訓練データに対する性能と検証データに対する性能を比較することで、過学習が発生しているかどうかを早期に検出できます。

2.3. テストデータ (Test Data)

  • 役割: モデル開発の最終段階で、モデルの最終的な性能(汎化能力)を評価するために一度だけ使用されます。モデルがこれまで一度も見たことのないデータであり、実際の運用環境での性能に近い評価が得られます。
  • 特徴: データセット全体の残りの部分(通常10%〜20%)を占めます。
  • AIモデルとの関係: モデルはテストデータを見て学習することはありません。テストデータは、モデルの「最終試験」として機能します。

3. データ分割の具体的な方法

Pythonのscikit-learnライブラリは、データ分割のための便利なツールを提供しています。

3.1. 訓練データとテストデータの分割 (train_test_split)

最も一般的な分割方法です。

from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np

# サンプルデータの生成
np.random.seed(42)
X = pd.DataFrame(np.random.rand(100, 5), columns=[f'feature_{i}' for i in range(5)]) # 特徴量
y = pd.Series(np.random.randint(0, 2, 100)) # 目的変数 (0または1)

# データを訓練用 (80%) とテスト用 (20%) に分割
X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.2,   # テストデータの割合を指定 (20%)
    random_state=42, # 分割を再現可能にするためのシード値
    stratify=y       # クラスの比率を維持して分割(分類問題で重要)
)

print("データセット全体のサイズ:", len(X))
print("訓練データのサイズ (X_train):", len(X_train))
print("テストデータのサイズ (X_test):", len(X_test))

# stratifyの効果を確認 (元のデータのクラス比率を訓練データ・テストデータで維持)
print("\n元のデータ (クラス0/1の比率):")
print(y.value_counts(normalize=True))
print("訓練データ (クラス0/1の比率):")
print(y_train.value_counts(normalize=True))
print("テストデータ (クラス0/1の比率):")
print(y_test.value_counts(normalize=True))

stratify=yは、特に分類問題において重要です。これにより、元のデータセットにおけるクラスの分布(例えば、クラスAが90%、クラスBが10%)を、分割後の訓練データとテストデータでも維持することができます。クラス不均衡なデータセットでこれを怠ると、テストデータに特定クラスのデータが偏ってしまい、正しい評価ができなくなる可能性があります。

3.2. 訓練データ・検証データ・テストデータの3分割

一般的には、訓練データをさらに訓練用と検証用に分割します。

# 訓練データをさらに分割 (訓練用 80% / 検証用 20%)
# 元のデータセットの80%が訓練データに、その80%の訓練データをさらに80%訓練用、20%検証用に分割
X_train_temp, X_val, y_train_temp, y_val = train_test_split(
    X_train, y_train,
    test_size=0.25, # 全体の80%の訓練データのうち25%が検証データ (80% * 0.25 = 20%)
    random_state=42,
    stratify=y_train
)

print("\n--- 3分割後のデータサイズ ---")
print("訓練データ (X_train_temp):", len(X_train_temp)) # 全体の約60%
print("検証データ (X_val):", len(X_val))               # 全体の約20%
print("テストデータ (X_test):", len(X_test))           # 全体の20%

4. 過学習とデータ分割の関係

データセットを訓練、検証、テストに分割することで、過学習を効果的に検出・回避できます。

4.1. 過学習の検出

学習プロセス中に、訓練データに対する精度と検証データに対する精度を追跡します。

  • 理想的な状態: 訓練精度と検証精度の両方が安定して上昇している。
  • 過学習の兆候: 訓練精度は上昇し続けるが、検証精度が頭打ちになるか、低下し始める。

モデルは訓練データに適合しすぎ、見たことのない検証データに対する予測能力が失われ始めていることを示します。

4.2. モデルの評価と最終調整

  • 訓練データ: モデルの重み(パラメータ)を学習する。
  • 検証データ: ハイパーパラメータをチューニングする。例えば、ニューラルネットワークの層の数や、決定木の深さなどを調整する際に使用します。
  • テストデータ: モデルの最終評価を行う。テストデータは、モデルの調整やハイパーパラメータのチューニングには決して使用してはなりません。

テストデータをモデル開発中に頻繁に見てしまうと、無意識のうちにモデルがテストデータに適合してしまい、テストデータが検証データと同じ役割を果たしてしまうことになります。これは「テストデータのリーク」と呼ばれ、モデルの最終的な汎化能力を過大評価する原因となります。


5. クロスバリデーション (交差検証)

データ量が限られている場合や、データ分割によってモデルの評価が不安定になる可能性がある場合、 クロスバリデーション(Cross-Validation) が有効な手法となります。

5.1. k-分割交差検証 (k-Fold Cross-Validation)

k-分割交差検証では、訓練データをk個の等しいサイズのサブセット(フォールド)に分割します。

  1. k-1個のフォールドを訓練データとして使用し、残りの1個のフォールドを検証データとして使用します。
  2. これをk回繰り返し、各フォールドが一度だけ検証データとして使用されるようにします。
  3. k回の検証結果の平均が、モデルの最終的な性能評価となります。
  • メリット:
    • すべてのデータが訓練と検証の両方に使用されるため、データセットを効率的に活用できます。
    • 評価結果が単一の分割に依存しないため、モデル性能の評価がより頑健になります。
  • デメリット:
    • k回モデルを訓練する必要があるため、計算コストが増大します。
from sklearn.model_selection import KFold, cross_val_score
from sklearn.linear_model import LogisticRegression

# 訓練データ (X_train, y_train) に対してクロスバリデーションを実行
# 例: 5-分割交差検証 (k=5)
kf = KFold(n_splits=5, shuffle=True, random_state=42)

# ロジスティック回帰モデルをクロスバリデーションで評価
model = LogisticRegression(max_iter=1000)
cv_scores = cross_val_score(model, X_train, y_train, cv=kf, scoring='accuracy')

print("\n--- 5-分割交差検証の結果 ---")
print("各フォールドの精度:", cv_scores)
print("平均精度:", cv_scores.mean())
print("精度の標準偏差:", cv_scores.std())

cross_val_scoreを使うことで、k-分割交差検証を簡単に実行できます。これにより得られた平均精度は、検証データに対するより信頼性の高いモデル性能評価となります。


6. データ分割における実践的なヒント

  • データのリークを防ぐ: 特徴量エンジニアリングやスケーリング(標準化/正規化)は、必ず訓練データのみで行い、その変換器(例:StandardScaler)をテストデータに適用する必要があります。テストデータに対してfit_transformを実行すると、テストデータの情報が学習プロセスにリークしてしまいます。
  • 時系列データの分割: 株価予測のような時系列データでは、ランダムに分割することはできません。未来のデータを使って過去を予測することはできないため、時系列データは時間順に分割する必要があります(例:過去のデータで訓練し、直近のデータで検証・テスト)。
  • データサイズのバランス: 訓練データ、検証データ、テストデータの比率は、データセットのサイズやタスクによって異なりますが、一般的には訓練データに最も多くのリソースを割り当てます。

7. まとめと次へのステップ

本日は、AI学習ロードマップの6日目として、AIモデルの評価と過学習防止のためのデータセット分割の重要性を学びました。

  • 訓練データ: モデルの学習に使用。
  • 検証データ: ハイパーパラメータのチューニングと過学習の監視に使用。
  • テストデータ: モデルの最終的な汎化能力を評価するために一度だけ使用。
  • train_test_split で効率的にデータを分割し、stratifyでクラス比率を維持することが重要です。
  • クロスバリデーションは、限られたデータでより頑健なモデル評価を行うための強力な手法です。
  • テストデータのリークは絶対に避けるべきであり、前処理やスケーリングは訓練データのみで実行する必要があります。

明日からは、今日までに準備したデータセットの概念を基に、いよいよAIの基本的なモデルである「線形回帰」と「ロジスティック回帰」について学び、AIがどのようにデータから予測を行うのかを理解していきます。

それでは、また明日!


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?