正則化回帰

scikit-learn による教師あり学習

George Boorman

Core Curriculum Manager, DataCamp

正則化の理由

  • 想起: 線形回帰は損失関数を最小化する

  • 各特徴量ごとに係数$a$と$b$を選択

  • 大きな係数は過学習につながる可能性あり

  • 正則化: 大きな係数にペナルティを課す

scikit-learn による教師あり学習

リッジ回帰

  • 損失関数 = OLS損失関数 + $$ \alpha * \sum_{i=1}^{n} {a_i}^2$$

  • リッジ:大きな正または負の係数にペナルティを課す

  • $\alpha$:選択する必要があるパラメータ

  • KNNでkを選ぶのと同様に、$\alpha$を選ぶ

  • ハイパーパラメータ:モデルパラメータを最適化するために使用する変数

  • $\alpha$:モデルの複雑さを制御

    • $\alpha$ = 0 = OLS(過学習につながる可能性あり)

    • $\alpha$ が非常に大きい場合: 未学習につながる可能性あり

scikit-learn による教師あり学習

scikit-learn におけるリッジ回帰

from sklearn.linear_model import Ridge

scores = [] for alpha in [0.1, 1.0, 10.0, 100.0, 1000.0]:
ridge = Ridge(alpha=alpha)
ridge.fit(X_train, y_train) y_pred = ridge.predict(X_test)
scores.append(ridge.score(X_test, y_test))
print(scores)
[0.2828466623222221, 0.28320633574804777, 0.2853000732200006, 
 0.26423984812668133, 0.19292424694100963]
scikit-learn による教師あり学習

ラッソ回帰

  • 損失関数 = OLS損失関数 + $$ \alpha * \sum_{i=1}^{n} |a_i|$$
scikit-learn による教師あり学習

scikit-learn におけるラッソ回帰

from sklearn.linear_model import Lasso

scores = [] for alpha in [0.01, 1.0, 10.0, 20.0, 50.0]: lasso = Lasso(alpha=alpha) lasso.fit(X_train, y_train) lasso_pred = lasso.predict(X_test) scores.append(lasso.score(X_test, y_test)) print(scores)
[0.99991649071123, 0.99961700284223, 0.93882227671069, 0.74855318676232, -0.05741034640016]
scikit-learn による教師あり学習

特徴選択のためのラッソ回帰

ラッソ:データセットの重要な特徴を選択可

  • 重要度の低い特徴の係数を0にする

  • 0まで縮小されていない特徴量はラッソで選択

scikit-learn による教師あり学習

scikit-learn における特徴選択のためのラッソ

from sklearn.linear_model import Lasso

X = diabetes_df.drop("glucose", axis=1).values y = diabetes_df["glucose"].values names = diabetes_df.drop("glucose", axis=1).columns
lasso = Lasso(alpha=0.1)
lasso_coef = lasso.fit(X, y).coef_
plt.bar(names, lasso_coef) plt.xticks(rotation=45) plt.show()
scikit-learn による教師あり学習

scikit-learn における特徴選択のためのラッソ

各特徴量の係数の棒グラフ。糖尿病を除いてすべて0付近で、糖尿病は25の値

scikit-learn による教師あり学習

練習しましょう!

scikit-learn による教師あり学習

Preparing Video For Download...