3.2 线性回归与预测
🎯 学习目标
通过房价预测器项目,掌握回归问题的基本概念和线性回归算法,包括:
- 理解回归问题与分类问题的区别
- 掌握线性回归的原理和数学基础
- 学会多种回归评估指标
- 掌握特征重要性分析
- 学会进行价格预测和构成分析
📋 项目预览
我们将创建一个房价预测器,能够根据房屋特征(面积、房间数、房龄、地理位置)预测房屋价格,并分析各特征对价格的贡献程度。
🧠 核心概念详解
1. 回归 vs 分类
关键区别:
- 分类:预测离散的类别(如花的种类)
- 回归:预测连续的数值(如房屋价格)
生活化比喻:
- 分类:判断一张图片是猫还是狗(二选一)
- 回归:预测明天的气温是多少度(连续数值)
| 问题类型 | 输出类型 | 例子 |
|---|---|---|
| 分类问题 | 离散值 | 鸢尾花种类识别 |
| 回归问题 | 连续值 | 房价预测 |
2. 线性回归的基本思想
线性回归就是找到一条直线,最好地拟合数据点。
简单线性回归公式:
y = w × x + by:预测值(房价)x:特征值(房屋面积)w:权重(斜率)b:偏置(截距)
多元线性回归公式:
价格 = w1×面积 + w2×房间数 + w3×房龄 + w4×地理位置 + b3. 回归评估指标
均方误差(MSE):
MSE = (预测值 - 真实值)² 的平均值- 衡量预测值与真实值的差异
- 对异常值敏感(因为平方)
平均绝对误差(MAE):
MAE = |预测值 - 真实值| 的平均值- 更直观的误差度量
- 对异常值不敏感
决定系数(R²):
R² = 1 - (预测误差的方差) / (数据本身的方差)- 表示模型解释数据变异的比例
- 范围:0到1,越接近1越好
4. 特征工程的重要性
好的特征能显著提升模型性能:
- 房屋面积:直接影响价格
- 房间数量:反映房屋规模
- 房龄:影响房屋折旧
- 地理位置:决定地段价值
特征选择原则:
- 与目标变量相关
- 彼此之间不高度相关
- 易于获取和测量
🔧 代码实现详解
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))- 分解价格到各个特征的贡献
- 提供更详细的定价依据
🎯 学习要点总结
- 回归问题理解:掌握回归与分类的根本区别
- 线性回归原理:理解最小二乘法和梯度下降
- 评估指标:掌握MSE、MAE、R²的含义和计算
- 特征工程:学会选择和创建有效的特征
- 模型解释:能够分析特征重要性和价格构成
- 数据可视化:学会用图表展示数据和模型效果
- 模型应用:能够用训练好的模型进行实际预测
- 误差分析:理解预测误差的来源和改进方向
💡 练习建议
基础练习
- 修改特征组合:尝试只用面积预测价格,观察效果变化
- 调整数据规模:改变样本数量,观察对模型稳定性的影响
- 添加噪声:增加数据噪声,观察模型鲁棒性
进阶练习
- 多项式回归:尝试用多项式特征捕捉非线性关系
- 正则化:使用岭回归或Lasso回归防止过拟合
- 特征工程:创建新特征,如面积/房间数比值
扩展练习
- 真实数据集:在真实的房价数据集上应用模型
- 时间序列预测:尝试预测股票价格或销售量
- 模型部署:创建Web服务进行在线房价预测
🔍 常见问题解答
Q: 为什么我的模型R²是负数?
A: R²为负数表示模型比简单使用平均值预测效果更差,可能是过拟合或特征选择不当。
Q: 如何选择重要的特征?
A: 可以通过相关系数分析、特征重要性排序、或使用特征选择算法。
Q: 线性回归假设数据是线性的,如果关系不是线性怎么办?
A: 可以使用多项式回归、转换特征、或尝试其他回归算法。
🚀 下一步学习
完成线性回归项目后,你可以:
- 学习逻辑回归解决二分类问题
- 探索多项式回归处理非线性关系
- 了解正则化技术防止过拟合
- 学习其他回归算法如决策树回归、支持向量机回归
记住:回归问题的核心是理解变量之间的关系,并用数学模型捕捉这种关系!