検証セット
CoddyのMachine Learningジャーニー「教師あり学習」セクションの一部。レッスン 35/58。
k と木の深さの選択では、テストスコアが最も高かった k または深さを採用しました。そのスコアは実際より良く見えます。高い値が出たという理由で、それを採用したからです。
そこで、選択に使う3つ目のセット、検証セットを用意します。
2回に分けます。残りの80%の0.25は20%です:
X_rest, X_test, y_rest, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
X_train, X_val, y_train, y_val = train_test_split(X_rest, y_rest, test_size=0.25, random_state=0)
print(len(X_train), len(X_val), len(X_test))500行の場合、次のように表示されます:
300 100 100検証データで選びます。テストセットに触れるのは、最後に一度だけです。
チャレンジ
中級あるブドウ園では、Ridgeを使って列ごとのブドウの収穫量を予測します。スターターコードはテストスコアでalphaを選び、同じスコアを報告しています。修正してください。
X_restとy_restを訓練用と検証用の行に分割します(test_size=0.25、random_state=0)。- 検証用のR二乗でalphaを選び、そのスコアとともに出力します。
- 選んだalphaで訓練用の行に適合させ、そのテストのR二乗を出力します。
別のブドウ園の場合:
Chosen alpha: 1 (validation R squared 0.787)
Test R squared: 0.726正直なスコアは、スターターコードのスコアより低いことがよくあります。それが真のスコアです。
自分で試してみよう
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge
# 最初の行のセットでスケーリングした Ridge(alpha) を学習し、2番目のセットでの決定係数を返す
def ridge_r2(alpha, X_fit, y_fit, X_check, y_check):
scaler = StandardScaler()
model = Ridge(alpha=alpha)
model.fit(scaler.fit_transform(X_fit), y_fit)
return model.score(scaler.transform(X_check), y_check)
# ブドウ畑のデータ 90 行:各行に 10 個の測定値と kg 単位のブドウの収穫量がある
rows = pd.read_csv("vineyard.csv")
features = ["sun_hours", "rain_mm", "soil_ph", "slope_deg", "vine_age",
"row_length_m", "buds_per_vine", "frost_days", "wind_kmh", "clay_pct"]
X = rows[features]
y = rows["yield_kg"]
alphas = [0.1, 1, 10, 100]
X_rest, X_test, y_rest, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# テストスコアで alpha を選び、その同じスコアを報告している:修正すること
best_alpha = 0
best_r2 = -1
for alpha in alphas:
r2 = ridge_r2(alpha, X_rest, y_rest, X_test, y_test)
if r2 > best_r2:
best_alpha = alpha
best_r2 = r2
print(f"Chosen alpha: {best_alpha}")
print(f"Test R squared: {best_r2:.3f}")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師あり学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ