アンダーフィットとオーバーフィット
CoddyのMachine Learningジャーニー「教師あり学習」セクションの一部。レッスン 32/58。
機械学習最大の落とし穴に遭遇しました。k = 1や深い木に記憶させてしまうことです。この章ではその名前を明らかにし、最後に次のようなグラフを示します。
落とし穴:水の与え方を変えたバジルの苗が15株。その収穫量に3本の曲線を当てはめます。
次数 1 では単純すぎます:アンダーフィッティング。次数 12 ではすべての訓練データの点を通り、それらの間で大きく揺れ動きます:オーバーフィッティングです。学習するのではなく、記憶しているのです。
np.polyval(coefs, x)は曲線の高さを返します。訓練データとテストデータのRMSE(グラム単位):
for degree in [1, 3, 12]:
coefs = np.polyfit(water_train, grams_train, degree)
train_err = np.sqrt(mean_squared_error(grams_train, np.polyval(coefs, water_train)))
test_err = np.sqrt(mean_squared_error(grams_test, np.polyval(coefs, water_test)))
print(degree, round(train_err), round(test_err))次のように出力されます:
1 156 138
3 15 19
12 9 173過学習の兆候:訓練誤差が小さく、テスト誤差が大きい。
チャレンジ
中級風力発電所では、風速から1基の風力タービンの出力をモデル化します。用意されたコードは24個の測定値を分割し、max_degreeを読み込みます。
- 1から
max_degreeまでの各次数について、訓練データに曲線を当てはめ、訓練データとテストデータのRMSEを整数のkW単位で出力します。 - テスト誤差が訓練誤差の2倍を超える最初の次数を出力します。そのような次数がなければ、
No overfitting up to degreeとmax_degreeを出力します。
別の風力タービンと7の場合:
Degree 1: train 117 kW, test 172 kW
Degree 2: train 115 kW, test 182 kW
Degree 3: train 64 kW, test 85 kW
Degree 4: train 63 kW, test 79 kW
Degree 5: train 47 kW, test 67 kW
Degree 6: train 47 kW, test 65 kW
Degree 7: train 23 kW, test 85 kW
Overfitting starts at degree 7自分で試してみよう
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
max_degree = int(input())
# 以下の行は変更しないでください:1基の風力タービンの風速 (m/s) と出力 (kW)
speed = np.array([3.8, 4.3, 5.1, 5.6, 5.6, 6.7, 6.8, 7.2, 7.8, 8.5, 8.9, 9.1,
10.2, 10.9, 11.4, 11.9, 12.2, 12.4, 12.6, 13.2, 13.9, 14.4, 15.5, 16.5])
power = np.array([0, 85, 179, 22, 17, 126, 255, 273, 419, 545, 612, 665,
913, 1120, 1114, 1227, 1299, 1400, 1293, 1329, 1396, 1493, 1461, 1552])
speed_train, speed_test, power_train, power_test = train_test_split(
speed, power, test_size=0.25, random_state=0)
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師あり学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ