正则化回归

使用 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 中的岭回归

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 进行特征选择

每个特征的系数条形图,除"diabetes"约为 25 外,其余接近 0

使用 scikit-learn 的监督学习

Passons à la pratique !

使用 scikit-learn 的监督学习

Preparing Video For Download...