题目
实现并优化线性回归模型预测房价
信息
- 类型:问答
- 难度:⭐⭐
考点
线性回归原理,梯度下降优化,特征工程,模型评估
快速回答
实现线性回归模型预测房价的核心步骤:
- 使用均方误差(MSE)作为损失函数:$J(\theta) = \frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)}) - y^{(i)})^2$
- 通过梯度下降更新参数:$\theta_j := \theta_j - \alpha\frac{\partial}{\partial\theta_j}J(\theta)$
- 关键优化措施:特征缩放(归一化)、学习率调整、添加多项式特征
- 评估指标:R²分数、均方根误差(RMSE)
原理说明
线性回归通过建立特征与目标变量的线性关系进行预测:$h_\theta(x) = \theta_0 + \theta_1x_1 + ... + \theta_nx_n$。目标是最小化预测值与真实值的均方误差(MSE)。梯度下降通过计算损失函数的梯度迭代更新参数:$\theta_j := \theta_j - \alpha\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)}$。
代码示例
import numpy as np
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.metrics import r2_score
# 特征工程:多项式扩展和标准化
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_poly)
# 梯度下降实现
def gradient_descent(X, y, theta, alpha, iterations):
m = len(y)
cost_history = []
for _ in range(iterations):
h = X.dot(theta)
loss = h - y
gradient = X.T.dot(loss) / m
theta -= alpha * gradient
cost = np.sum(loss**2) / (2*m)
cost_history.append(cost)
return theta, cost_history
# 添加偏置项并初始化参数
X_b = np.c_[np.ones((len(X_scaled), 1)), X_scaled]
theta_init = np.random.randn(X_b.shape[1], 1)
y = y.reshape(-1, 1)
# 训练模型
theta_final, costs = gradient_descent(X_b, y, theta_init, alpha=0.01, iterations=1000)
# 预测与评估
y_pred = X_b.dot(theta_final)
rmse = np.sqrt(np.mean((y_pred - y)**2))
r2 = r2_score(y, y_pred)最佳实践
- 特征缩放:使用StandardScaler归一化特征,加速梯度下降收敛
- 学习率选择:通过损失曲线调整α值(常用0.01-0.1),过大导致震荡,过小收敛慢
- 多项式特征:对非线性关系添加二次项/交叉项(注意避免过拟合)
- 迭代终止:设置收敛阈值(如损失变化<1e-5)而非固定迭代次数
常见错误
- 未归一化特征导致梯度下降不稳定
- 忘记添加偏置项($\theta_0$)导致模型偏差
- 学习率设置不当引发震荡或收敛过慢
- 忽略特征相关性检查(使用热力图分析)
- 未划分训练集/测试集导致过拟合误判
扩展知识
- 正则化:L2正则化(岭回归)解决多重共线性:$J(\theta) = MSE(\theta) + \alpha\sum_{i=1}^{n}\theta_i^2$
- 优化算法:随机梯度下降(SGD)加速大数据集训练,动量法减少震荡
- 评估进阶:交叉验证评估模型稳定性,学习曲线诊断偏差/方差
- 对比方案:决策树处理非线性关系,集成方法提升预测精度