正規化迴歸

使用 scikit-learn 進行監督式學習

George Boorman

Core Curriculum Manager, DataCamp

為什麼要正規化?

  • 回顧:線性迴歸最小化損失函式。

  • 為每個特徵變數選擇係數 $a$,再加上 $b$

  • 係數過大會導致過度擬合

  • 正規化:對大係數加上懲罰

使用 scikit-learn 進行監督式學習

Ridge 迴歸

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

  • Ridge 會懲罰正負兩側的大係數

  • $\alpha$:需要你選擇的參數

  • 選 $\alpha$ 類似在 KNN 中選 k

  • 超參數:用來最佳化模型參數的變數

  • $\alpha$ 控制模型複雜度

    • $\alpha$ = 0 = OLS(可能過度擬合)

    • $\alpha$ 很大:可能欠擬合

使用 scikit-learn 進行監督式學習

scikit-learn 中的 Ridge 迴歸

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 進行監督式學習

Lasso 迴歸

  • 損失函式 = OLS 損失函式 + $$ \alpha * \sum_{i=1}^{n} |a_i|$$
使用 scikit-learn 進行監督式學習

scikit-learn 中的 Lasso 迴歸

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 進行監督式學習

用 Lasso 做特徵選擇

  • Lasso 可選出資料集的重要特徵。

  • 會把不重要特徵的係數縮到 0

  • 未被縮為 0 的特徵即為 Lasso 選中的特徵

使用 scikit-learn 進行監督式學習

scikit-learn 中的 Lasso 特徵選擇

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 中的 Lasso 特徵選擇

各特徵係數的長條圖;多數接近 0,僅 diabetes 約為 25

使用 scikit-learn 進行監督式學習

一起來練習吧!

使用 scikit-learn 進行監督式學習

Preparing Video For Download...