Menu
CoddyTech

正则化

本课属于 Coddy Machine Learning 学习旅程的“监督学习”单元。第 34 课,共 58 课。

过拟合的线性模型会依赖较大的权重,试图贴合每一行带噪声的数据。岭回归会对较大的权重施加惩罚,而 alpha 决定惩罚的力度。

这里有 20 把二手吉他,使用 6 个缩放后的特征来预测价格:

六条线分别表示每个吉他特征的权重,横轴是从 0.01 到 1000 的 alpha。成色从 116 开始,品牌从 104 开始,使用年限从 -83 开始;随着 alpha 增大,它们都逐渐趋近于 0

只需与 LinearRegression 交换一次,其权重为 [-83. 116. 104. 27. 17. 15.]:

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 越大,权重越小,过拟合越少。alpha 太大时,模型会欠拟合。

challenge icon

挑战

中等

一个度假网站根据 8 个特征预测小屋的每晚价格,使用的数据只有 16 间小屋。程序会读取 alpha;起始代码会拆分并缩放数据。

  1. 使用该 alpha 拟合一个 LinearRegression 和一个 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 个特征,以及以欧元计价的每晚价格。
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 在线编译器