Menu
CoddyTech

正則化

CoddyのMachine Learningジャーニー「教師あり学習」セクションの一部。レッスン 34/58。

過学習した線形モデルは、大きな重みを頼りにして、ノイズの多い各行に合わせようとします。Ridge回帰は大きな重みにペナルティを課し、alphaでその強さを設定します。

中古ギターが20本あり、価格を予測するためのスケーリング済み特徴量が6つあります。

6本の線。それぞれギターの特徴量1つあたりの重みを示し、横軸は0.01から1000までのalpha。状態は116、ブランドは104、年数はマイナス83から始まり、alphaが大きくなるにつれてすべて0に近づく

重みが [-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 が大きいほど、重みは小さくなり、過学習が抑えられます。大きすぎると、モデルは未学習になります。

challenge icon

チャレンジ

中級

あるバケーションサイトでは、16軒のコテージのみを使い、8個の特徴量から1泊あたりのコテージ料金を予測します。プログラムはalphaを読み込み、スターターコードでデータを分割してスケーリングします。

  1. LinearRegressionと、そのalphaを使ったRidgeをそれぞれ学習させます。
  2. 各モデルの重みの合計サイズを出力します。重みの符号を取り除いて合計し、丸めた値です。
  3. 各モデルのテストデータでの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)

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師あり学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ