3.2 线性回归与预测

🎯 学习目标

通过房价预测器项目,掌握回归问题的基本概念和线性回归算法,包括:

  • 理解回归问题与分类问题的区别
  • 掌握线性回归的原理和数学基础
  • 学会多种回归评估指标
  • 掌握特征重要性分析
  • 学会进行价格预测和构成分析

📋 项目预览

我们将创建一个房价预测器,能够根据房屋特征(面积、房间数、房龄、地理位置)预测房屋价格,并分析各特征对价格的贡献程度。

🧠 核心概念详解

1. 回归 vs 分类

关键区别

  • 分类:预测离散的类别(如花的种类)
  • 回归:预测连续的数值(如房屋价格)

生活化比喻

  • 分类:判断一张图片是猫还是狗(二选一)
  • 回归:预测明天的气温是多少度(连续数值)
问题类型 输出类型 例子
分类问题 离散值 鸢尾花种类识别
回归问题 连续值 房价预测

2. 线性回归的基本思想

线性回归就是找到一条直线,最好地拟合数据点。

简单线性回归公式

y = w × x + b
  • y:预测值(房价)
  • x:特征值(房屋面积)
  • w:权重(斜率)
  • b:偏置(截距)

多元线性回归公式

价格 = w1×面积 + w2×房间数 + w3×房龄 + w4×地理位置 + b

3. 回归评估指标

均方误差(MSE)

MSE = (预测值 - 真实值)² 的平均值
  • 衡量预测值与真实值的差异
  • 对异常值敏感(因为平方)

平均绝对误差(MAE)

MAE = |预测值 - 真实值| 的平均值
  • 更直观的误差度量
  • 对异常值不敏感

决定系数(R²)

R² = 1 - (预测误差的方差) / (数据本身的方差)
  • 表示模型解释数据变异的比例
  • 范围:0到1,越接近1越好

4. 特征工程的重要性

好的特征能显著提升模型性能:

  • 房屋面积:直接影响价格
  • 房间数量:反映房屋规模
  • 房龄:影响房屋折旧
  • 地理位置:决定地段价值

特征选择原则

  1. 与目标变量相关
  2. 彼此之间不高度相关
  3. 易于获取和测量

🔧 代码实现详解

1. 数据生成和探索

import numpy as np

# 生成模拟房价数据
np.random.seed(42)
house_sizes = np.random.normal(100, 30, 200)
house_prices = house_sizes * 0.8 + np.random.normal(0, 20, 200)

代码说明

  • 生成200个房屋样本
  • 基础价格:每平米0.8万元
  • 添加随机噪声模拟现实情况

2. 数据可视化

import matplotlib.pyplot as plt

plt.scatter(house_sizes, house_prices, alpha=0.6)
plt.xlabel('房屋面积(平米)')
plt.ylabel('价格(万元)')
plt.title('房屋面积 vs 价格')

可视化作用

  • 直观看到特征与目标的关系
  • 发现异常值或数据模式
  • 验证线性关系的假设

3. 线性回归模型

from sklearn.linear_model import LinearRegression

# 创建模型
model = LinearRegression()

# 训练模型
model.fit(X_train, y_train)

# 查看模型参数
print("截距:", model.intercept_)
print("系数:", model.coef_)

模型参数含义

  • intercept_:基础价格(当所有特征为0时的价格)
  • coef_:各特征对价格的贡献程度

4. 模型评估

from sklearn.metrics import mean_squared_error, r2_score

# 预测测试集
y_pred = model.predict(X_test)

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

print(f"MSE: {mse:.2f}")
print(f"R²: {r2:.3f}")

5. 预测新样本

# 预测新房屋价格
new_house = [[120, 3, 10, 7]]  # 120平米, 3室, 10年房龄, 地段评分7
predicted_price = model.predict(new_house)[0]

print(f"预测价格: {predicted_price:.1f} 万元")

📊 完整代码解析

数据生成部分

# 生成多特征数据
house_sizes = np.random.normal(100, 30, 200)
num_rooms = np.random.randint(1, 6, 200)
house_ages = np.random.randint(1, 50, 200)
location_score = np.random.uniform(1, 10, 200)

# 组合特征
X = np.column_stack([house_sizes, num_rooms, house_ages, location_score])
  • 生成4个不同的房屋特征
  • 使用column_stack组合成特征矩阵

模型训练部分

from sklearn.model_selection import train_test_split

# 划分训练测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 训练线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)

特征重要性分析

# 计算特征重要性
feature_importance = pd.DataFrame({
    '特征': feature_names,
    '系数绝对值': np.abs(model.coef_)
}).sort_values('系数绝对值', ascending=False)
  • 通过系数绝对值判断特征重要性
  • 帮助理解哪些特征对价格影响最大

价格构成分析

# 分析价格构成
base_price = model.intercept_
contributions = []
for j, feature_val in enumerate(new_house[0]):
    contribution = model.coef_[j] * feature_val
    contributions.append((feature_names[j], contribution))
  • 分解价格到各个特征的贡献
  • 提供更详细的定价依据

🎯 学习要点总结

  1. 回归问题理解:掌握回归与分类的根本区别
  2. 线性回归原理:理解最小二乘法和梯度下降
  3. 评估指标:掌握MSE、MAE、R²的含义和计算
  4. 特征工程:学会选择和创建有效的特征
  5. 模型解释:能够分析特征重要性和价格构成
  6. 数据可视化:学会用图表展示数据和模型效果
  7. 模型应用:能够用训练好的模型进行实际预测
  8. 误差分析:理解预测误差的来源和改进方向

💡 练习建议

基础练习

  1. 修改特征组合:尝试只用面积预测价格,观察效果变化
  2. 调整数据规模:改变样本数量,观察对模型稳定性的影响
  3. 添加噪声:增加数据噪声,观察模型鲁棒性

进阶练习

  1. 多项式回归:尝试用多项式特征捕捉非线性关系
  2. 正则化:使用岭回归或Lasso回归防止过拟合
  3. 特征工程:创建新特征,如面积/房间数比值

扩展练习

  1. 真实数据集:在真实的房价数据集上应用模型
  2. 时间序列预测:尝试预测股票价格或销售量
  3. 模型部署:创建Web服务进行在线房价预测

🔍 常见问题解答

Q: 为什么我的模型R²是负数?

A: R²为负数表示模型比简单使用平均值预测效果更差,可能是过拟合或特征选择不当。

Q: 如何选择重要的特征?

A: 可以通过相关系数分析、特征重要性排序、或使用特征选择算法。

Q: 线性回归假设数据是线性的,如果关系不是线性怎么办?

A: 可以使用多项式回归、转换特征、或尝试其他回归算法。

🚀 下一步学习

完成线性回归项目后,你可以:

  • 学习逻辑回归解决二分类问题
  • 探索多项式回归处理非线性关系
  • 了解正则化技术防止过拟合
  • 学习其他回归算法如决策树回归、支持向量机回归

记住:回归问题的核心是理解变量之间的关系,并用数学模型捕捉这种关系!

« 上一篇 3.1 机器学习基础 下一篇 » 3.3 KNN算法与图像分类