どうもニコイチです。前回はモデル作成の概要をお伝えしました。今回から実際にモデル作成に写っていきます。まずは、データを分割していきます。
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import seaborn as sns
# データ読み込み
df = pd.read_csv('bank_data.csv')
# 特徴量の準備(数値型のみを使用)
X = df[['age', 'balance', 'duration']]
y = df['y']
# データ分割
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.25, # テストデータの比率
random_state=42, # 再現性のための固定値
stratify=y # 目的変数の比率を維持
)
# モデル学習
model = LogisticRegression()
model.fit(X_train, y_train)
# 予測
train_pred = model.predict(X_train)
test_pred = model.predict(X_test)
# 結果の可視化
plt.figure(figsize=(12, 4))
# 学習データとテストデータのサイズ比較
plt.subplot(1, 2, 1)
sizes = [len(X_train), len(X_test)]
labels = ['学習データ\n({:,}件)'.format(len(X_train)),
'テストデータ\n({:,}件)'.format(len(X_test))]
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
plt.title('データ分割の比率')
# 精度比較
plt.subplot(1, 2, 2)
accuracies = [
accuracy_score(y_train, train_pred) * 100,
accuracy_score(y_test, test_pred) * 100
]
plt.bar(['学習データ', 'テストデータ'], accuracies)
plt.ylim(0, 100)
plt.title('予測精度の比較')
plt.ylabel('精度 (%)')
for i, v in enumerate(accuracies):
plt.text(i, v + 1, f'{v:.1f}%', ha='center')
plt.tight_layout()
plt.show()
# 結果の詳細表示
print(f"データ総数: {len(df):,}件")
print(f"学習データ: {len(X_train):,}件")
print(f"テストデータ: {len(X_test):,}件")
print(f"\n学習データの精度: {accuracies[0]:.1f}%")
print(f"テストデータの精度: {accuracies[1]:.1f}%")
目次
データ分割の重要ポイント
- 分割の意味
- 学習データ:模擬テスト
- テストデータ:本番テスト
- この分け方で「暗記」と「理解」の違いが分かる
- 分割のポイント
- test_size=0.25:4分の1をテストデータに
- stratify=y:目的変数の比率を維持
- random_state:結果の再現性を確保
- よくある失敗と対策
- データ漏洩:テストデータを学習に使わない
- 不均衡データ:stratifyで比率を維持
- 過学習:学習データとテストデータの精度差を監視
実践的なアドバイス
- 分割比率の選び方
- 基本は75:25か80:20
- データが少ない場合:90:10も検討
- データが多い場合:70:30も可能
- 精度評価のコツ
- 学習データの精度が高すぎる→過学習の可能性
- テストデータの精度が極端に低い→汎化性能に問題
- 両者の差が10%以上→モデルの見直しが必要
このように、適切なデータ分割は機械学習の成功に不可欠です。上記のコードを実行すると、分割の様子と精度の違いを視覚的に確認できます。
コメント