梯度下降线性回归对象API介绍
1 课程概览
本课通过波士顿房价预测案例,讲解SGDRegressor(随机梯度下降)API的使用。详细演示完整开发流程:数据加载、训练集测试集划分(8:2)、特征标准化、模型训练、模型评估。介绍SGDRegressor的参数(max_iter、learning_rate、eta0等)和终止条件。
2 核心概念与定义
- SGDRegressor:随机梯度下降线性回归模型。
- train_test_split:划分训练集和测试集。
- StandardScaler:标准化处理。
- max_iter:最大迭代次数。
- 终止条件:限定迭代次数或限定阈值。
3 算法与模型详解
3.1 开发流程
步骤:
- 数据加载
- 划分训练集和测试集(8:2)
- 特征工程(标准化)
- 模型训练
- 模型预测
- 模型评估
3.2 数据划分
比例:8:2(训练集:测试集)
函数:train_test_split
参数:
| 参数 | 说明 |
|---|---|
| data | 特征 |
| target | 标签 |
| test_size | 测试集占比(0.2) |
| random_state | 随机种子(23) |
3.3 特征标准化
对象:StandardScaler
步骤:
- 创建标准化对象
- 训练集:fit_transform(训练+转换)
- 测试集:transform(仅转换)
为什么训练集用fit_transform?
- 首次标准化需要训练参数(均值、标准差)
- fit:训练参数
- transform:转换数据
为什么测试集只用transform?
- 使用训练集的参数进行转换
- 保证训练集和测试集使用相同的标准化参数
3.4 SGDRegressor参数
创建模型:
sgd = SGDRegressor(max_iter=1000, learning_rate='constant', eta0=0.01)
主要参数:
| 参数 | 说明 | 示例值 |
|---|---|---|
| max_iter | 最大迭代次数 | 1000 |
| learning_rate | 学习率策略 | 'constant' |
| eta0 | 学习率初始值 | 0.01 |
| loss | 损失函数 | 'squared_loss' |
| fit_intercept | 是否计算偏置 | True |
3.5 终止条件
| 条件 | 说明 |
|---|---|
| 限定迭代次数 | max_iter(如1000次) |
| 限定阈值 | 当损失变化小于阈值时停止 |
3.6 模型评估
指标:
- MAE(平均绝对误差)
- MSE(均方误差)
- RMSE(均方根误差)
原则:越小越好
4 数学原理与推导
4.1 随机梯度下降
$$\theta_{j}^{(i+1)} = \theta_{j}^{(i)} - \alpha \cdot (h_\theta(X_i) - Y_i) \cdot X_{ij}$$
4.2 标准化
$$X_{scaled} = \frac{X - \mu}{\sigma}$$
其中:
- $\mu$:均值
- $\sigma$:标准差
4.3 损失函数
$$L = \frac{1}{2}(h_\theta(X) - Y)^2$$
5 代码示例
from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import fetch_california_housing
# 1. 数据加载(使用加州房价替代波士顿房价)
housing = fetch_california_housing()
X = housing.data
Y = housing.target
# 2. 划分训练集和测试集(8:2)
X_train, X_test, y_train, y_test = train_test_split(
X, Y, test_size=0.2, random_state=23
)
# 3. 特征工程(标准化)
# 3.1 创建标准化对象
transfer = StandardScaler()
# 3.2 训练集标准化(fit_transform)
X_train_scaled = transfer.fit_transform(X_train)
# 3.3 测试集标准化(transform)
X_test_scaled = transfer.transform(X_test)
# 4. 模型训练
# 4.1 创建模型对象
sgd = SGDRegressor(
max_iter=1000, # 最大迭代次数
learning_rate='constant', # 学习率策略
eta0=0.01, # 学习率
loss='squared_loss', # 损失函数
fit_intercept=True # 是否计算偏置
)
# 4.2 训练模型
sgd.fit(X_train_scaled, y_train)
# 5. 模型预测
y_predict = sgd.predict(X_test_scaled)
# 6. 模型评估
print("=== 模型评估 ===")
print("回归系数W:", sgd.coef_)
print("偏置B:", sgd.intercept_)
print("MAE:", mean_absolute_error(y_test, y_predict))
print("MSE:", mean_squared_error(y_test, y_predict))
print("RMSE:", mean_squared_error(y_test, y_predict, squared=False))
# 7. 模型得分
print("模型得分R²:", sgd.score(X_test_scaled, y_test))
输出示例:
=== 模型评估 ===
回归系数W: [ 0.85 -0.12 0.31 ...]
偏置B: [2.07]
MAE: 0.53
MSE: 0.56
RMSE: 0.75
模型得分R²: 0.57
6 重难点与易错提醒
- ❗重点:训练集用fit_transform,测试集用transform。
- ❗重点:SGDRegressor的参数(max_iter、learning_rate、eta0)。
- ❗重点:终止条件:限定迭代次数或限定阈值。
- ❗重点:数据划分比例8:2。
- ⚠️易错:测试集用fit_transform(应该只用transform)。
- ⚠️易错:忘记特征标准化导致SGD不收敛。
- 💡深入理解:标准化保证所有特征在同一量纲,有利于梯度下降。
7 课堂问答精选
Q: 为什么训练集用fit_transform,测试集用transform?
A:
- 训练集用fit_transform:首次标准化需要训练参数(均值、标准差),然后转换数据。
- 测试集用transform:使用训练集的参数进行转换,保证训练集和测试集使用相同的标准化参数,避免数据泄露。
Q: SGDRegressor的终止条件有哪些?
A:
- 限定迭代次数:max_iter(如1000次),达到次数后停止。
- 限定阈值:当损失变化小于阈值时停止。 两种方式都可以,实际开发中通常设置max_iter。
8 本课小结
- 开发流程:数据加载 → 划分数据集 → 特征标准化 → 模型训练 → 预测 → 评估。
- 数据划分:train_test_split,8:2比例。
- 标准化:训练集fit_transform,测试集transform。
- SGDRegressor参数:max_iter、learning_rate、eta0。
- 终止条件:限定迭代次数或限定阈值。
9 延伸思考与实践
- 实践:用SGDRegressor完成波士顿/加州房价预测。
- 预习:线性回归性能评估与欠拟合过拟合。
- 思考:为什么标准化对梯度下降很重要?