30·监督学习-回归入门

多元线性回归

regressionlinear-model

第30课 - 多元线性回归

学习目标

完成本课学习后,你将能够:

  1. 理解多元线性回归与简单线性回归的核心区别与联系。
  2. 掌握使用 Scikit-learn 库构建多元线性回归模型的全流程。
  3. 学会进行数据预处理,特别是处理多个特征(特征工程的基础)。
  4. 学会评估多元线性回归模型的性能,并解读关键结果。
  5. 了解多重共线性等模型假设的初步概念。

核心概念

在上一课中,我们学习了简单线性回归,它试图用一个自变量(特征)来预测因变量(目标),例如用“房屋面积”来预测“房价”。但现实世界的问题往往复杂得多,房价不仅取决于面积,还受房间数量、地段、楼层、房龄等多个因素影响。

多元线性回归就是简单线性回归的自然延伸。它使用两个或更多个自变量来预测一个因变量。其数学形式可以简单理解为:

目标 = 系数1 * 特征1 + 系数2 * 特征2 + ... + 系数n * 特征n + 截距

举个通俗的例子: 房价 = (w1 * 面积) + (w2 * 房间数) + (w3 * 地段分数) + b 其中 w1, w2, w3 是每个特征对应的权重(系数),b 是截距。模型的任务就是从数据中学习出这些最佳的权重,使得预测的房价与真实房价之间的误差最小。

核心要点:多元线性回归假设所有特征与目标之间都是线性关系,并且各个特征之间相对独立(这是理想情况,我们稍后会提到“多重共线性”)。

代码示例

我们将使用经典的“波士顿房价”数据集(或类似替代数据集)来演示如何用 Scikit-learn 实现多元线性回归。我们将预测房屋的中位价。

# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.datasets import fetch_california_housing # 使用加利福尼亚房价数据集替代

# 1. 加载并查看数据
# 注:波士顿数据集因伦理问题已被移除,我们使用加利福尼亚房价数据集
housing = fetch_california_housing()
X = pd.DataFrame(housing.data, columns=housing.feature_names) # 特征数据
y = housing.target # 目标数据(房价中位数,单位10万美元)

print("特征名称:", housing.feature_names)
print("数据集形状:", X.shape)
print("前5行数据:\n", X.head())

# 2. 数据预处理(简单示例:特征缩放,这对于很多模型是好的实践,虽然线性回归本身不强制要求)
# 我们使用标准化 (Standardization)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X) # 对特征进行标准化处理

# 3. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X_scaled, y, test_size=0.2, random_state=42
)
print(f"\n训练集大小:{X_train.shape[0]},测试集大小:{X_test.shape[0]}")

# 4. 创建并训练模型
model = LinearRegression()
model.fit(X_train, y_train) # 训练模型,学习系数和截距

# 5. 查看模型学习到的参数
print("\n模型系数 (每个特征对应的权重):")
for feature, coef in zip(housing.feature_names, model.coef_):
    print(f"  {feature}: {coef:.4f}")
print(f"模型截距: {model.intercept_:.4f}")

# 6. 在测试集上进行预测并评估
y_pred = model.predict(X_test)

# 计算评估指标
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)

print("\n模型评估结果:")
print(f"均方误差 (MSE): {mse:.4f}")
print(f"均方根误差 (RMSE): {rmse:.4f}")
print(f"R² 分数: {r2:.4f}")

# 7. 简单可视化:预测值 vs 真实值
plt.figure(figsize=(8, 6))
plt.scatter(y_test, y_pred, alpha=0.5)
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', lw=2) # 画一条对角线作为参考
plt.xlabel('真实房价 (10万美元)')
plt.ylabel('预测房价 (10万美元)')
plt.title('多元线性回归:真实值 vs 预测值')
plt.grid(True)
plt.show()

代码解释

  1. 我们加载了包含8个特征(如平均收入、房屋平均年龄等)的加利福尼亚房价数据集。
  2. 特征缩放:我们对特征进行了标准化(Z-score标准化),这有助于模型更快收敛,并使不同尺度的特征具有可比性。
  3. 划分数据集:80%用于训练,20%用于测试,这是评估模型泛化能力的标准做法。
  4. 模型训练model.fit() 这一步,模型内部通过数学方法(最小二乘法)找到了最佳的系数和截距,使得训练数据上的预测误差最小。
  5. 参数解读model.coef_ 数组中的每个数字对应一个特征对房价的贡献权重。model.intercept_ 是所有特征都为0时的基准预测值。
  6. 模型评估
    • MSE/RMSE:衡量预测误差的绝对大小,RMSE的单位与目标变量相同,更直观。
    • R² 分数:表示模型解释了目标变量方差的比例。值越接近1,模型拟合得越好。

实践练习

练习1(基础) 修改上面的代码,使用只有前4个特征(例如 ['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms'])来训练一个多元线性回归模型,并比较其R²分数与使用全部特征的模型有何变化?这说明了什么问题?

练习2(进阶) 尝试去掉代码中的 StandardScaler 标准化步骤,直接使用原始特征 X 进行训练。对比模型的R²分数和系数大小,思考为什么在特征尺度差异很大时,标准化有时是有益的?

练习3(应用) 给你一个新的数据样本(如下所示),请使用上面训练好的完整模型(使用全部特征且经过标准化)来预测其房价。

# 新数据样本(需要先进行相同的标准化处理!)
new_sample_raw = np.array([[8.3252, 41.0, 6.984, 1.024, 322.0, 2.556, 37.88, -122.23]])
new_sample_scaled = scaler.transform(new_sample_raw) # 关键步骤:使用之前fit过的scaler进行transform
predicted_price = model.predict(new_sample_scaled)
print(f"预测的房价中位数:{predicted_price[0]:.2f} (单位:10万美元)")

请解释这行代码 new_sample_scaled = scaler.transform(new_sample_raw) 为什么是必要的?如果直接用 new_sample_raw 预测会有什么后果?

常见错误

  1. 忘记数据预处理:直接将未处理(如缺失值、异常值、不同量纲)的数据输入模型。这可能导致模型性能下降、系数难以解释,甚至训练失败。请记住fittransform 只能在训练集上调用,测试集和新数据只能调用 transform
  2. 忽略多重共线性:当两个或多个特征高度相关时(例如,“房屋面积”和“房间数”),会导致模型系数不稳定、难以解释。需要通过相关性矩阵分析或计算方差膨胀因子(VIF)来检查。
  3. 过度解读系数:不要绝对地说“特征X增加1个单位,目标就增加w个单位”。这仅在其他特征保持不变的假设下成立。而且,系数的大小受特征缩放的影响。
  4. 不检查线性假设:如果特征与目标之间的真实关系是非线性的,强行用线性模型拟合,效果会很差。可以通过残差图(预测值与残差的图)来初步判断。
  5. 直接在测试集上调参:测试集必须保持“干净”,仅用于最终评估。任何基于测试集结果的调参都是“数据泄露”,会导致对模型性能的乐观误判。

小结

  • 多元线性回归是处理多个输入特征预测一个连续目标的基础模型。
  • 核心流程包括:数据加载与探索 -> 特征工程与预处理 -> 数据集划分 -> 模型训练 -> 预测与评估。
  • Scikit-learn 提供了极其简洁的接口(LinearRegression().fit().predict())来实现该模型。
  • 模型评估需综合运用 MSE/RMSE(看误差大小)和 R² 分数(看解释力度)。
  • 关键注意事项:数据预处理(尤其是缩放)、检查特征共线性、理解模型假设、严格遵守训练集/测试集的划分原则。
  • 多元线性回归是理解更复杂模型(如正则化回归、神经网络)的基石,其思想和方法可广泛迁移。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「多项式回归与非线性拟合」 以巩固所学知识。