STEP 14:予測モデルの構築と評価

🎯 STEP 14: 予測モデルの構築と評価

過学習を防ぎ、実用的な予測モデルを作ろう

📋 このステップで学ぶこと

  • 学習データとテストデータの分割方法
  • 過学習(Overfitting)とその防止策
  • 予測精度の評価指標(MAE、RMSE、MAPE)
  • 交差検証(Cross-Validation)の実践
  • 実務で使える予測モデルの構築

学習時間の目安:3.5時間

🎯 1. なぜデータを分割するのか

過学習の問題

🚨 過学習(Overfitting)とは

モデルが過去のデータに合いすぎて、未来の予測が悪くなること

例:
・過去のデータ:R² = 0.99(ほぼ完璧!)
・新しいデータ:予測が全然当たらない…
→ これが過学習

原因:
・説明変数が多すぎる
・サンプルサイズが小さい
・ノイズ(たまたまの変動)まで学習してしまう

学習データとテストデータ

📌 データの分割

学習データ(Training Data):
モデルを作るためのデータ
例:過去のデータの70%

テストデータ(Test Data):
モデルの予測精度を確認するためのデータ
例:過去のデータの30%

重要:
テストデータは、モデル作成時には一切使わない
→ 「未来のデータ」として扱う

なぜ分割が必要か

💡 分割する理由

学習データだけで評価する問題:

  • モデルは学習データに「最適化」されている
  • 学習データでのR²は高くなりやすい
  • でも、新しいデータでの予測は悪いかもしれない

テストデータで評価する利点:

  • 本当の予測精度がわかる
  • 過学習を検出できる
  • 実務での性能を推定できる
【イメージで理解:過学習】 試験勉強で例えると… 過学習:  ・過去問だけを丸暗記  ・過去問では100点  ・でも、本番の試験では50点… 良いモデル:  ・過去問で基本を学ぶ  ・応用力も身につける  ・本番の試験でも80点! → テストデータ = 本番の試験

✂️ 2. データの分割方法

分割比率の決め方

分割比率 適用ケース
70:30 最も一般的。中規模データ(100〜1000件)
80:20 データが少ない場合(〜100件)
60:20:20 学習:検証:テスト(高度なモデル選択)
90:10 データが非常に多い場合(10000件〜)

ランダム分割の重要性

💡 ランダムに分割する

データをランダムに分割することが重要です。

NG例:最初の70%を学習、残り30%をテスト
→ 時系列データの場合、季節性などが偏る

OK例:ランダムにシャッフルしてから分割
→ 学習データとテストデータに偏りがない

ただし、時系列データの場合は例外(後述)

Pythonでの分割

# ============================================ # 学習データとテストデータの分割 # ============================================ import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression # サンプルデータの作成 data = { ‘広告費’: [50, 60, 70, 55, 80, 90, 85, 75, 65, 70, 95, 100, 52, 62, 72, 57, 82, 92, 87, 77, 67, 72, 97, 102], ‘気温’: [25, 28, 30, 26, 32, 33, 31, 29, 27, 30, 34, 35, 24, 27, 29, 25, 31, 32, 30, 28, 26, 29, 33, 34], ‘売上’: [310, 420, 480, 330, 600, 650, 550, 500, 380, 480, 700, 720, 290, 410, 470, 280, 590, 640, 540, 490, 370, 470, 690, 710] } df = pd.DataFrame(data) # ============================================ # 説明変数と目的変数を分離 # ============================================ # X: 説明変数(売上を予測するために使う変数) # y: 目的変数(予測したい変数) X = df[[‘広告費’, ‘気温’]] y = df[‘売上’] # ============================================ # train_test_split(): データを分割する関数 # ============================================ # なぜデータを分割するか? # → 同じデータで学習と評価をすると、過学習を見逃す # → 別のデータでテストすることで、本当の予測力を測る # # パラメータ: # X, y: 分割するデータ # test_size=0.3: テストデータの割合(30%) # random_state=42: 乱数シード(再現性のため) # → 同じ数値を指定すると、毎回同じ分割結果になる # # 戻り値(4つ): # X_train: 学習用の説明変数 # X_test: テスト用の説明変数 # y_train: 学習用の目的変数 # y_test: テスト用の目的変数 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, # テストデータ30% random_state=42 # 再現性のため ) print(“【データ分割の結果】”) print(f”全データ数: {len(df)}件”) print(f”学習データ: {len(X_train)}件({len(X_train)/len(df)*100:.0f}%)”) print(f”テストデータ: {len(X_test)}件({len(X_test)/len(df)*100:.0f}%)”) print(“\n【重要ポイント】”) print(“・学習データ: モデルの係数を計算するために使用”) print(“・テストデータ: モデルの予測精度を評価するために使用”) print(“・テストデータは学習には絶対に使わない!”)
# 出力例 全データ数: 24件 学習データ: 16件 テストデータ: 8件

時系列データの分割

⚠️ 時系列データは特別扱い

時系列データ:時間順に並んだデータ(売上、株価など)

重要:
時系列データはランダム分割しない
→ 過去のデータで学習、未来のデータでテスト

例:
・1月〜8月:学習データ
・9月〜12月:テストデータ

理由:未来は過去を見てから予測するため

# ============================================ # 時系列データの分割(特別な注意が必要) # ============================================ # 時系列データとは? # → 時間順に並んだデータ(月次売上、株価など) # # なぜランダム分割してはいけないか? # → 未来のデータで学習して過去を予測することになる # → 実務では「未来は見えない」ので、これは不正 # → 過去→未来の順序を維持する必要がある df_time = df.copy() df_time[‘月’] = range(1, 25) # 1〜24月のラベルを追加 # ============================================ # 時間順に分割(ランダムにしない!) # ============================================ # int(): 小数を整数に変換 # len(df_time) * 0.7: 全データの70%の位置 train_size = int(len(df_time) * 0.7) # .iloc[]: 位置(インデックス番号)でデータを取得 # [:train_size]: 最初からtrain_size番目まで # [train_size:]: train_size番目から最後まで df_train = df_time.iloc[:train_size] # 最初の70%(過去) df_test = df_time.iloc[train_size:] # 残りの30%(未来) print(“【時系列データの分割】”) print(f”学習データ: 1月〜{train_size}月(過去のデータで学習)”) print(f”テストデータ: {train_size+1}月〜{len(df_time)}月(未来を予測)”) print(“\n※時系列データでは、この順序を必ず守ること!”)

📊 3. 予測精度の評価指標

R²だけでは不十分

📌 R²の問題点

R²は相対的な指標
→ 「どれくらい説明できるか」はわかるが、「予測誤差が何円か」はわからない

例:R² = 0.9でも、予測誤差が100万円なら実務で使えない

解決:絶対的な誤差を測る指標を使う

主要な評価指標

📏 3つの重要な評価指標

1. MAE(Mean Absolute Error、平均絶対誤差)

計算式:
MAE = (|誤差1| + |誤差2| + … + |誤差n|) / n

意味:平均して、予測がどれくらい外れているか
例:MAE = 50万円 → 平均して、予測は50万円ズレている
特徴:解釈しやすい(同じ単位)、外れ値の影響を受けにくい

2. RMSE(Root Mean Squared Error、平均二乗誤差の平方根)

計算式:
RMSE = √[(誤差1² + 誤差2² + … + 誤差n²) / n]

意味:誤差の二乗の平均の平方根
特徴:大きな誤差をより重視、外れ値の影響を受けやすい、MAEより値が大きくなる

3. MAPE(Mean Absolute Percentage Error、平均絶対パーセント誤差)

計算式:
MAPE = (|誤差1/実際の値1| + … + |誤差n/実際の値n|) / n × 100%

意味:パーセントでの平均誤差
例:MAPE = 5% → 平均して、予測は実際の値の5%ズレている
特徴:異なるスケールのデータを比較できる、実際の値が0に近いと計算できない

どの指標を使うべきか

状況 推奨指標 理由
わかりやすさ重視 MAE 同じ単位で解釈しやすい
大きな誤差を重視 RMSE 大きな誤差にペナルティ
パーセントで評価 MAPE 相対的な誤差がわかる
異なるモデルの比較 RMSE / MAPE 標準的な比較指標
📌 推奨:MAEとRMSEの両方を報告する

・MAE:経営層への報告に適している(「平均20万円のズレ」)
・RMSE:技術的な評価・モデル比較に適している
・MAPE:異なる規模のデータを比較する場合に便利

💻 4. Pythonでの実践

モデルの学習と評価

# ============================================ # モデルの学習(学習データのみ使用) # ============================================ # 重要:学習には学習データ(X_train, y_train)のみを使う # → テストデータは「未知のデータ」として取っておく # → これにより、本当の予測力を測れる model = LinearRegression() # .fit(): モデルを学習(係数を計算) # X_train: 学習用の説明変数 # y_train: 学習用の目的変数 model.fit(X_train, y_train) print(“【モデルの係数】”) print(f”切片: {model.intercept_:.2f}”) print(f”広告費の係数: {model.coef_[0]:.2f}”) print(f”気温の係数: {model.coef_[1]:.2f}”) print(“\n【係数の解釈】”) print(f”・広告費が1万円増えると、売上が{model.coef_[0]:.1f}万円増える”) print(f”・気温が1℃上がると、売上が{model.coef_[1]:.1f}万円増える”)
# 出力例 【モデルの係数】 切片: -245.32 広告費の係数: 5.82 気温の係数: 12.45 【係数の解釈】 ・広告費が1万円増えると、売上が5.8万円増える ・気温が1℃上がると、売上が12.5万円増える
# ============================================ # 学習データでの予測精度 # ============================================ # なぜ学習データでも評価するか? # → テストデータとの比較で過学習を検出できる # → 学習データでの精度は「理論上の最高精度」 from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error # model.predict(): 学習済みモデルで予測 y_train_pred = model.predict(X_train) # ============================================ # 各評価指標の計算 # ============================================ # r2_score(実際, 予測): 決定係数R² # → 0〜1の値、1に近いほど良い r2_train = r2_score(y_train, y_train_pred) # mean_absolute_error(実際, 予測): MAE(平均絶対誤差) # → 予測の平均的なズレ(単位は目的変数と同じ) mae_train = mean_absolute_error(y_train, y_train_pred) # mean_squared_error(実際, 予測): MSE(平均二乗誤差) # → np.sqrt()で平方根を取るとRMSE rmse_train = np.sqrt(mean_squared_error(y_train, y_train_pred)) # MAPE(平均絶対パーセント誤差): 手動で計算 # → パーセントでの誤差、異なるスケールの比較に便利 mape_train = np.mean(np.abs((y_train – y_train_pred) / y_train)) * 100 print(“【学習データでの性能】”) print(f”R²: {r2_train:.4f}({r2_train*100:.1f}%説明できる)”) print(f”MAE: {mae_train:.2f}万円(平均±{mae_train:.1f}万円のズレ)”) print(f”RMSE: {rmse_train:.2f}万円(大きな誤差を重視)”) print(f”MAPE: {mape_train:.2f}%(平均{mape_train:.1f}%のズレ)”)
# 出力例 【学習データでの性能】 R²: 0.9823(98.2%説明できる) MAE: 8.45万円(平均±8.5万円のズレ) RMSE: 10.23万円(大きな誤差を重視) MAPE: 1.89%(平均1.9%のズレ)
# ============================================ # テストデータでの予測精度(最も重要!) # ============================================ # なぜテストデータが最も重要か? # → 学習に使っていない「未知のデータ」 # → 実際に運用した時の精度に近い # → この精度でモデルの実力を判断する # テストデータで予測 y_test_pred = model.predict(X_test) # 各評価指標を計算 r2_test = r2_score(y_test, y_test_pred) mae_test = mean_absolute_error(y_test, y_test_pred) rmse_test = np.sqrt(mean_squared_error(y_test, y_test_pred)) mape_test = np.mean(np.abs((y_test – y_test_pred) / y_test)) * 100 print(“【テストデータでの性能】← これが本当の実力!”) print(f”R²: {r2_test:.4f}”) print(f”MAE: {mae_test:.2f}万円”) print(f”RMSE: {rmse_test:.2f}万円”) print(f”MAPE: {mape_test:.2f}%”) # ============================================ # 学習 vs テストの比較(過学習チェック) # ============================================ print(“\n【過学習チェック】”) print(f”R²の差: {r2_train – r2_test:.4f}(小さいほど良い)”) print(f”MAEの差: {mae_test – mae_train:.2f}万円(小さいほど良い)”) if r2_train – r2_test > 0.1: print(“⚠ 注意: 過学習の可能性があります”) else: print(“✓ 過学習の兆候なし、良好なモデルです”)
# 出力例 【テストデータでの性能】← これが本当の実力! R²: 0.9645 MAE: 12.34万円 RMSE: 15.67万円 MAPE: 2.45% 【過学習チェック】 R²の差: 0.0178(小さいほど良い) MAEの差: 3.89万円(小さいほど良い) ✓ 過学習の兆候なし、良好なモデルです

結果の解釈

💡 学習データ vs テストデータの比較
指標 学習データ テストデータ 判定
0.9823 0.9645 ✓ 良好
MAE 8.45万円 12.34万円 ✓ 許容範囲
RMSE 10.23万円 15.67万円 ✓ 許容範囲

判断:
・テストデータの性能が学習データよりやや低いが、これは正常
・差が大きすぎない(過学習していない)
・テストデータでも高い精度 → 実務で使えるモデル!

過学習の検出

🚨 過学習のサイン

学習データとテストデータの性能差が大きい

例:
・学習データ:R² = 0.99、MAE = 5万円
・テストデータ:R² = 0.60、MAE = 50万円
過学習!

対処:
・説明変数を減らす
・正則化(Ridge、Lasso回帰)
・サンプルサイズを増やす
・交差検証で確認

結果の可視化

import matplotlib.pyplot as plt # 実測値 vs 予測値のプロット fig, axes = plt.subplots(1, 2, figsize=(14, 5)) # 学習データ axes[0].scatter(y_train, y_train_pred, alpha=0.7, color=’blue’) axes[0].plot([y_train.min(), y_train.max()], [y_train.min(), y_train.max()], ‘r–‘, linewidth=2) axes[0].set_xlabel(‘実測値(万円)’) axes[0].set_ylabel(‘予測値(万円)’) axes[0].set_title(f’学習データ(R² = {r2_train:.4f})’) axes[0].grid(True, alpha=0.3) # テストデータ axes[1].scatter(y_test, y_test_pred, alpha=0.7, color=’green’) axes[1].plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], ‘r–‘, linewidth=2) axes[1].set_xlabel(‘実測値(万円)’) axes[1].set_ylabel(‘予測値(万円)’) axes[1].set_title(f’テストデータ(R² = {r2_test:.4f})’) axes[1].grid(True, alpha=0.3) plt.tight_layout() plt.show()

🔄 5. 交差検証(Cross-Validation)

交差検証とは

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

データをk個のグループに分けて、
順番に1つをテストデータ、残りを学習データとして評価を繰り返す

例:5分割交差検証
1回目:グループ1をテスト、2-5で学習
2回目:グループ2をテスト、1,3-5で学習
3回目:グループ3をテスト、1-2,4-5で学習
4回目:グループ4をテスト、1-3,5で学習
5回目:グループ5をテスト、1-4で学習
→ 5回の平均を取る

利点:
・すべてのデータを学習にもテストにも使える
・評価が安定する
・過学習を検出しやすい

【5分割交差検証のイメージ】 全データを5つに分割:[1] [2] [3] [4] [5] 1回目: テスト[1] + 学習[2][3][4][5] → スコア1 2回目: テスト[2] + 学習[1][3][4][5] → スコア2 3回目: テスト[3] + 学習[1][2][4][5] → スコア3 4回目: テスト[4] + 学習[1][2][3][5] → スコア4 5回目: テスト[5] + 学習[1][2][3][4] → スコア5 最終スコア = (スコア1 + … + スコア5) / 5

Pythonでの実装

from sklearn.model_selection import cross_val_score # 5分割交差検証 scores = cross_val_score( LinearRegression(), X, y, cv=5, # 5分割 scoring=’r2′ # R²で評価 ) print(“【5分割交差検証の結果】”) print(f”各分割のR²: {scores}”) print(f”平均R²: {scores.mean():.4f}”) print(f”標準偏差: {scores.std():.4f}”)
# 出力例 【5分割交差検証の結果】 各分割のR²: [0.9712 0.9823 0.9654 0.9789 0.9701] 平均R²: 0.9736 標準偏差: 0.0063
# MAEでも評価 mae_scores = cross_val_score( LinearRegression(), X, y, cv=5, scoring=’neg_mean_absolute_error’ # MAE(負の値で返される) ) mae_scores = -mae_scores # 正の値に変換 print(f”\n【MAEでの交差検証】”) print(f”各分割のMAE: {mae_scores}”) print(f”平均MAE: {mae_scores.mean():.2f}万円”) print(f”標準偏差: {mae_scores.std():.2f}万円”)
# 出力例 【MAEでの交差検証】 各分割のMAE: [10.23 11.45 9.87 12.34 11.26] 平均MAE: 11.03万円 標準偏差: 0.89万円

結果の解釈

💡 交差検証の見方

1. 平均スコア
モデルの平均的な性能を示す

2. 標準偏差
スコアのバラつき
・標準偏差が小さい → 安定したモデル ✓
・標準偏差が大きい → 不安定(データに依存しすぎ)✗

判断:
上記の例では、R²の標準偏差が0.0063と非常に小さい
→ 安定した高性能なモデル!

総合的な評価関数

# 総合的なモデル評価関数 def evaluate_model(model, X, y, cv=5): “””モデルを総合的に評価する””” from sklearn.model_selection import cross_val_score print(“=” * 50) print(“モデル評価レポート”) print(“=” * 50) # R² r2_scores = cross_val_score(model, X, y, cv=cv, scoring=’r2′) print(f”\n【R²】”) print(f” 平均: {r2_scores.mean():.4f}”) print(f” 標準偏差: {r2_scores.std():.4f}”) # MAE mae_scores = -cross_val_score(model, X, y, cv=cv, scoring=’neg_mean_absolute_error’) print(f”\n【MAE】”) print(f” 平均: {mae_scores.mean():.2f}万円”) print(f” 標準偏差: {mae_scores.std():.2f}万円”) # RMSE rmse_scores = np.sqrt(-cross_val_score(model, X, y, cv=cv, scoring=’neg_mean_squared_error’)) print(f”\n【RMSE】”) print(f” 平均: {rmse_scores.mean():.2f}万円”) print(f” 標準偏差: {rmse_scores.std():.2f}万円”) # 判定 print(“\n【総合判定】”) if r2_scores.std() < 0.05 and r2_scores.mean() > 0.8: print(” ✓ 安定した高性能モデル”) elif r2_scores.std() > 0.1: print(” ⚠ 不安定なモデル(データに依存)”) else: print(” △ 普通のモデル”) return { ‘r2_mean’: r2_scores.mean(), ‘mae_mean’: mae_scores.mean(), ‘rmse_mean’: rmse_scores.mean() } # 実行 results = evaluate_model(LinearRegression(), X, y)

📝 STEP 14 のまとめ

✅ このステップで学んだこと

1. データ分割の基本

  • 学習データ(70%)とテストデータ(30%)に分割
  • テストデータは「未来のデータ」として扱う
  • 時系列データは時間順に分割

2. 過学習(Overfitting)

  • 学習データに合いすぎて、テストデータで性能が悪化
  • 学習とテストの性能差で検出

3. 評価指標

  • MAE:わかりやすい(同じ単位)
  • RMSE:大きな誤差を重視
  • MAPE:パーセントで評価

4. 交差検証

  • データを分割して複数回評価
  • 平均と標準偏差でモデルの安定性を評価
💡 最も大切なポイント

予測モデルの本当の性能は、テストデータで評価します。学習データでのR²が高くても、安心してはいけません!

実務での推奨フロー:

  1. データを学習(70%)とテスト(30%)に分割
  2. 学習データでモデルを作成
  3. テストデータで性能を評価
  4. MAE、RMSE、MAPEを計算
  5. 過学習していないか確認
  6. 交差検証で安定性を確認
  7. 問題なければ、全データでモデルを再学習
  8. 実運用開始

次のSTEP 15では、多重共線性の対処を学びます!

🎯 次のステップの予告

STEP 15では、「多重共線性の対処」を学びます。VIF(分散拡大要因)の計算と、変数選択の方法を習得します!

📝 練習問題

問題 1 基礎

なぜデータを学習データとテストデータに分割する必要があるのですか?

【解答】

理由:

モデルの本当の予測精度を確認するため

詳細:

  • 学習データだけで評価すると:
    モデルは学習データに「最適化」されているので、性能が高く出やすい
    でも、新しいデータでの予測は悪いかもしれない(過学習)
  • テストデータで評価すると:
    モデルが「見たことのない」データでの性能がわかる
    実務での予測精度を推定できる
    過学習を検出できる
問題 2 基礎

MAE、RMSE、MAPEの違いを説明し、それぞれどのような場面で使うのが適切か答えてください。

【解答】

MAE(平均絶対誤差):

  • 予測誤差の絶対値の平均
  • 同じ単位で解釈しやすい
  • 適切な場面:経営層への報告、直感的な理解が必要な場合

RMSE(平均二乗誤差の平方根):

  • 誤差の二乗の平均の平方根
  • 大きな誤差をより重視
  • 適切な場面:技術的な評価、モデル比較、大きな誤差が問題になる場合

MAPE(平均絶対パーセント誤差):

  • パーセントでの平均誤差
  • 異なるスケールのデータを比較できる
  • 適切な場面:異なる規模のデータを比較する場合、相対的な精度を知りたい場合
問題 3 応用

以下の2つのモデルがあります。どちらが良いモデルですか?理由も説明してください。

モデルA:
学習データ:R² = 0.85、MAE = 15万円
テストデータ:R² = 0.82、MAE = 18万円

モデルB:
学習データ:R² = 0.95、MAE = 8万円
テストデータ:R² = 0.60、MAE = 50万円

【解答】モデルAの方が良い

比較表:

項目 モデルA モデルB
学習データのR² 0.85 0.95(高い)
テストデータのR² 0.82 0.60(低い)
性能差(R²) 0.03(小さい) 0.35(大きい)
判定 ✓ 安定 ✗ 過学習

理由:
モデルBは学習データでは性能が高いが、テストデータで大きく悪化しています。これは過学習のサインであり、実務では使えません。

モデルAは学習データとテストデータの性能差が小さく、安定した予測ができます。実務で使える!

問題 4 応用

交差検証の結果、R²の平均が0.85、標準偏差が0.15でした。この結果をどう解釈しますか?

【解答】

解釈:

平均R²は0.85と良好ですが、標準偏差が0.15と大きいため、不安定なモデルと判断できます。

問題点:

  • 分割によってR²が0.70〜1.00と大きくバラつく
  • データに依存しすぎている
  • 実務での予測精度が安定しない可能性

対処法:
・説明変数を見直す
・外れ値の影響を確認
・サンプルサイズを増やす
・正則化(Ridge、Lasso)を検討

問題 5 実践

あなたは売上予測モデルを作成しました。MAE = 20万円、MAPE = 5%という結果でした。平均売上400万円と仮定して、このモデルはビジネス的に使えますか?判断基準を示しながら説明してください。

【解答例】許容できる精度と言えます

分析:

  • MAE = 20万円:平均して、予測は20万円ズレる。平均売上400万円に対して5%のズレ。
  • MAPE = 5%:パーセントで見ても5%のズレ。一般的に、MAPEが10%以下なら「良い精度」とされる。

ビジネス判断:

  • 在庫計画:5%の誤差は許容範囲 → 使える
  • 予算計画:20万円のズレは許容範囲 → 使える
  • 戦略的意思決定:十分な精度 → 使える

注意:
許容できる精度は、ビジネスの目的によって異なります。
・在庫最適化:5%でOK
・金融取引:1%未満が必要
・大まかな予算:10%でもOK

目的に応じて、必要な精度を設定しましょう。

❓ よくある質問

Q1: テストデータは一度しか使ってはいけませんか?
理想的には、テストデータは最終評価の一度だけです。

理由:
テストデータを何度も見てモデルを調整すると、テストデータに「最適化」されてしまい、本来の目的を失います。

推奨フロー:
1. データを学習(70%)、検証(15%)、テスト(15%)に3分割
2. 学習データでモデル作成
3. 検証データでモデル選択・調整(何度でもOK)
4. 最後に、テストデータで最終評価(一度だけ)

実務では:
小規模データなら、学習(70%)とテスト(30%)の2分割でOK。交差検証を使えば、検証データは不要です。
Q2: 時系列データの分割方法は?
時系列データは、過去を学習、未来をテストに分割します。

例:
・2020年1月〜2023年8月:学習データ
・2023年9月〜2023年12月:テストデータ

重要:
ランダム分割しない(時間順を保つ)
・未来は過去を見てから予測するため

交差検証も特殊:
時系列交差検証(TimeSeriesSplit)を使う → Pythonのsklearnで実装可能
Q3: MAE、RMSE、MAPEのどれを使えばいいですか?
基本的には、MAEとRMSEの両方を報告するのがおすすめです。

使い分け:

MAE(平均絶対誤差):
・わかりやすい(同じ単位)
・経営層への報告に最適
・例:「平均して20万円ズレます」

RMSE(平均二乗誤差の平方根):
・大きな誤差をより重視
・技術的な評価に適している
・モデル比較に使いやすい

MAPE(平均絶対パーセント誤差):
・パーセントで表現
・異なるスケールのデータを比較できる
・実際の値が0に近いと使えない

推奨:MAE(報告用)+ RMSE(技術評価用)
Q4: 交差検証は必ず必要ですか?
必須ではありませんが、強く推奨されます。

交差検証が特に重要な場合:
・データ数が少ない(100件未満)
・モデルの安定性を確認したい
・複数のモデルを比較したい
・過学習を防ぎたい

省略してもOKな場合:
・データ数が非常に多い(10000件以上)
・シンプルなモデル(説明変数が1〜2個)
・時間的制約が厳しい

推奨:
時間があれば、必ず交差検証を実施しましょう。モデルの信頼性が大きく向上します!
Q5: テストデータでの性能が悪い場合、どうすればいいですか?
以下の順番で対処を検討します。

1. 過学習の確認
学習データとテストデータの性能差が大きい
→ 説明変数を減らす、正則化を使う

2. モデルの見直し
・線形回帰が適切か?(非線形の関係はないか)
・重要な変数が抜けていないか
・変数変換(対数、平方根など)が必要か

3. データの質を確認
・外れ値がないか
・データ入力ミスがないか
・サンプルサイズは十分か

4. 別の手法を検討
・決定木、ランダムフォレスト
・勾配ブースティング(XGBoost、LightGBM)
・ニューラルネットワーク

5. ビジネス的判断
完璧な予測は不可能。許容できる精度なら使う。
Q6: random_state(乱数シード)とは何ですか?
結果を再現可能にするための設定です。

説明:
データ分割はランダムに行われますが、random_stateを指定すると、毎回同じ分割結果になります。

なぜ必要か:
・結果を再現できる(同じ分析を再度実行可能)
・チームで結果を共有できる
・デバッグがしやすい

値の選び方:
・任意の整数(42、123、0など)
・値自体に意味はない
・一度決めたら変えない

例:
random_state=42 → 何度実行しても同じ分割になる
random_state=None → 毎回異なる分割になる
📝

学習メモ

ビジネスデータ分析・意思決定 - Step 14

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE