正則化
CoddyのMachine Learningジャーニー「教師あり学習」セクションの一部。レッスン 34/58。
過学習した線形モデルは、大きな重みを頼りにして、ノイズの多い各行に合わせようとします。Ridge回帰は大きな重みにペナルティを課し、alphaでその強さを設定します。
中古ギターが20本あり、価格を予測するためのスケーリング済み特徴量が6つあります。
重みが [-83. 116. 104. 27. 17. 15.] だった LinearRegression から、1か所を置き換えるだけです。
from sklearn.linear_model import Ridge
ridge = Ridge(alpha=100)
ridge.fit(X_train, y_train)
print(np.round(ridge.coef_))次のように出力されます:
[-14. 18. 16. 10. 5. 8.]alpha が大きいほど、重みは小さくなり、過学習が抑えられます。大きすぎると、モデルは未学習になります。
チャレンジ
中級あるバケーションサイトでは、16軒のコテージのみを使い、8個の特徴量から1泊あたりのコテージ料金を予測します。プログラムはalphaを読み込み、スターターコードでデータを分割してスケーリングします。
LinearRegressionと、そのalphaを使ったRidgeをそれぞれ学習させます。- 各モデルの重みの合計サイズを出力します。重みの符号を取り除いて合計し、丸めた値です。
- 各モデルのテストデータでのR二乗値(小数点以下3桁)と、以下のように優れたモデルを出力します。
別の地域で5を使った場合:
Total weight size: plain 90, ridge 53
Test R squared: plain -0.471, ridge 0.642
Better on new cottages: ridge自分で試してみよう
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.metrics import r2_score
alpha = float(input())
# 以下の行は変更しないでください:貸別荘 28 軒、特徴量 8 個、1 泊あたりの料金(ユーロ)
cottages = pd.read_csv("cottages.csv")
features = ["size_m2", "bedrooms", "lake_m", "age_years", "town_km", "sauna", "road_noise_db", "forest_m"]
X = cottages[features]
y = cottages["price"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=0)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師あり学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ