文章目录

简单介绍

##1. 什么是回归问题?

回归问题的核心目标是学习一个函数 f f f,使得给定输入特征 X X X,能预测出对应的连续输出 Y Y Y。这与分类问题不同,分类问题输出离散类别(如“狗”或“猫”),而回归问题输出连续数值(如房价、温度、销售额等)。

2. 典型的回归任务示例

  • 房价预测:基于房屋的面积、位置、房龄等特征,预测房屋价格。
  • 气温预报:利用历史气温数据预测未来的温度。
  • 股票价格预测:根据历史股票数据,预测股票的未来价格。
  • 医学诊断中的某个连续指标预测,比如血糖水平。

3. 回归问题的基本形式

假设数据集中有 n n n 个样本,每个样本具有 d d d 个特征: x i ∈ R d \mathbf{x}_i \in \mathbb{R}^d xiRd,对应的目标值为 y i ∈ R y_i \in \mathbb{R} yiR。目标是学习一个函数 f : R d → R f: \mathbb{R}^d \rightarrow \mathbb{R} f:RdR,使得:

y ≈ f ( x ) y \approx f(\mathbf{x}) yf(x)

4. 常见的回归模型

  • 线性回归(Linear Regression):假设输出是输入特征的线性组合

    y = w T x + b y = \mathbf{w}^T \mathbf{x} + b y=wTx+b

  • 多项式回归(Polynomial Regression):在线性模型基础上加入特征的多项式项

  • 决策树回归(Decision Tree Regression):通过树结构划分特征空间

  • 支持向量回归(SVR):利用支持向量机思想解决回归问题

  • 神经网络回归(Neural Network Regression):利用深度学习模型捕获复杂的非线性关系

5. 损失函数

回归模型通常通过最小化预测值与真实值之间的差异来训练模型,常用的损失函数包括:

  • 均方误差(Mean Squared Error, MSE)

    MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \text{MSE} = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2 MSE=n1i=1n(yiy^i)2

  • 平均绝对误差(Mean Absolute Error, MAE)

    MAE = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ \text{MAE} = \frac{1}{n} \sum_{i=1}^n | y_i - \hat{y}_i | MAE=n1i=1nyiy^i

  • Huber损失:兼顾MSE和MAE,抗异常值能力较强

##6. 训练与评估

  • 训练过程:通过优化算法(如最小二乘法、梯度下降)找到最佳参数,使得损失函数最小。

  • 评估指标

    • MSE或RMSE(均方根误差)
    • MAE
    • R 2 R^2 R2(决定系数):表示模型拟合程度,值在0到1之间,越接近1越好

7. 解决回归问题的关键考虑事项

  • 特征选择与工程:选择对预测有用的特征,进行特征缩放或转换。
  • 模型复杂度:避免过拟合(模型过于复杂)或欠拟合(模型过于简单)。
  • 数据质量:确保数据无明显错误或偏差。
  • 正则化:引入正则化项(如Lasso、Ridge)防止过拟合。

总结

回归问题在机器学习中非常常见,涉及到预测连续数值型目标。理解不同模型的特点、损失函数和训练方法,有助于根据具体任务选择合适的模型,提升预测效果。


v常见的回归模型(Regression Models)**

回归模型是用于学习输入特征与连续输出之间关系的算法。不同模型适用于不同类型的数据分布与特征关系。


① 线性回归(Linear Regression)

思想:假设目标值是输入特征的线性组合,即:

y ^ = w 1 x 1 + w 2 x 2 + ⋯ + w d x d + b \hat{y} = w_1x_1 + w_2x_2 + \dots + w_dx_d + b y^=w1x1+w2x2++wdxd+b

其中 w i w_i wi 是权重, b b b 是偏置项。

优点:

  • 简单、易解释;
  • 训练速度快;
  • 在特征与输出近似线性关系时效果好。

缺点:

  • 无法捕捉非线性关系;
  • 对异常值敏感。

案例示例:房价预测(简单线性回归)
假设我们用“房屋面积”来预测“房价”:

房屋面积(m²) 房价(万元)
60 80
80 100
100 120
120 150

模型可能学到的关系为:

房价 = 1.5 × 面积 + − 10 \text{房价} = 1.5 \times \text{面积} + -10 房价=1.5×面积+10

即每增加 1 m²,房价约增加 1.5 万元。


② 多项式回归(Polynomial Regression)

思想:在特征中加入多项式项,捕捉非线性关系。

y ^ = w 0 + w 1 x + w 2 x 2 + w 3 x 3 + … \hat{y} = w_0 + w_1x + w_2x^2 + w_3x^3 + \dots y^=w0+w1x+w2x2+w3x3+

本质上还是线性模型,只是增加了特征的幂次。

案例示例:气温随时间变化
现实中气温随时间往往呈波动曲线,线性模型无法拟合,而多项式回归可以近似这种曲线。


③ 决策树回归(Decision Tree Regression)

思想:通过“划分特征空间”来预测数值。例如,当某个特征小于某个阈值时,预测一个值,否则预测另一个值。

优点:

  • 可捕捉复杂非线性关系;
  • 不需要特征标准化;
  • 易解释(可视化决策路径)。

缺点:

  • 容易过拟合;
  • 不稳定(小数据变化可能导致结构大变)。

案例示例:汽车价格预测
输入特征包括品牌、马力、油耗等,决策树可以自动划分出“品牌 = 宝马 且 马力 > 200”这样的区域,对每个区域输出预测价格。


④ 支持向量回归(SVR, Support Vector Regression)

思想:类似支持向量机分类,但预测一个连续值。目标是在一个“误差范围”内尽量平滑地拟合数据。

优点:

  • 对异常值不敏感;
  • 能捕捉非线性关系(通过核函数)。

缺点:

  • 参数选择复杂;
  • 训练时间较长。

⑤ 神经网络回归(Neural Network Regression)

思想:通过多层神经元(激活函数+加权求和)模拟复杂的非线性函数关系。

优点:

  • 强大非线性建模能力;
  • 可扩展至大规模数据。

缺点:

  • 需要大量数据;
  • 不易解释;
  • 调参复杂。

案例示例:股票价格预测
输入过去 10 天的收盘价、成交量等特征,通过神经网络预测下一天价格。


损失函数(Loss Function)**

损失函数用于衡量模型预测值与真实值之间的差距,是模型训练的优化目标。


① 均方误差(MSE, Mean Squared Error)

MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \text{MSE} = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2 MSE=n1i=1n(yiy^i)2

特点:惩罚大的误差更严重。

案例:房价预测
若预测为 [102, 150, 210],真实值为 [100, 160, 200]:

MSE = ( 100 − 102 ) 2 + ( 160 − 150 ) 2 + ( 200 − 210 ) 2 3 = 4 + 100 + 100 3 = 68 \text{MSE} = \frac{(100-102)^2 + (160-150)^2 + (200-210)^2}{3} = \frac{4 + 100 + 100}{3} = 68 MSE=3(100102)2+(160150)2+(200210)2=34+100+100=68


② 平均绝对误差(MAE, Mean Absolute Error)

MAE = 1 n ∑ ∣ y i − y ^ i ∣ \text{MAE} = \frac{1}{n} \sum |y_i - \hat{y}_i| MAE=n1yiy^i

特点:对异常值更鲁棒,不会过度放大大误差。

同上例:

MAE = ∣ 100 − 102 ∣ + ∣ 160 − 150 ∣ + ∣ 200 − 210 ∣ 3 = 2 + 10 + 10 3 = 7.33 \text{MAE} = \frac{|100-102| + |160-150| + |200-210|}{3} = \frac{2 + 10 + 10}{3} = 7.33 MAE=3∣100102∣+∣160150∣+∣200210∣=32+10+10=7.33


③ Huber 损失

兼顾 MSE 和 MAE:

L δ ( y , y ^ ) = { 1 2 ( y − y ^ ) 2 , if  ∣ y − y ^ ∣ ≤ δ δ ( ∣ y − y ^ ∣ − 1 2 δ ) , otherwise L_\delta(y, \hat{y}) = \begin{cases} \frac{1}{2}(y - \hat{y})^2, & \text{if } |y - \hat{y}| \le \delta \\ \delta(|y - \hat{y}| - \frac{1}{2}\delta), & \text{otherwise} \end{cases} Lδ(y,y^)={21(yy^)2,δ(yy^21δ),if yy^δotherwise

适合含有少量异常值的数据。


④ 选择指南

场景 推荐损失函数
普通回归问题 MSE
含异常值 MAE 或 Huber
强调大误差惩罚 MSE
强调稳健性 MAE

训练与评估(Training & Evaluation)**

① 训练过程

回归模型的训练目标:
找到参数 θ \theta θ,使得损失函数 L ( y , y ^ ) L(y, \hat{y}) L(y,y^) 最小:

min ⁡ θ L ( y , f θ ( x ) ) \min_\theta L(y, f_\theta(x)) θminL(y,fθ(x))

常见优化方法:

  • 最小二乘法(线性回归)
  • 梯度下降法(深度学习模型)
  • 坐标下降法、牛顿法等(优化复杂模型)

② 模型评估指标

指标 公式 说明
MSE 1 n ∑ ( y i − y ^ i ) 2 \frac{1}{n}\sum (y_i - \hat{y}_i)^2 n1(yiy^i)2 误差平方的平均
RMSE MSE \sqrt{\text{MSE}} MSE 与原数据单位一致
MAE (\frac{1}{n}\sum y_i - \hat{y}_i ) 平均绝对误差
R 2 R^2 R2 决定系数 R 2 = 1 − ∑ ( y i − y ^ i ) 2 ∑ ( y i − y ˉ ) 2 R^2 = 1 - \frac{\sum (y_i - \hat{y}_i)^2}{\sum (y_i - \bar{y})^2} R2=1(yiyˉ)2(yiy^i)2 衡量模型解释力,越接近1越好

案例示例:
在房价预测任务中,测试集真实房价为 [100, 150, 200],预测为 [110, 145, 190]

  • MSE = 50
  • RMSE ≈ 7.07
  • MAE = 8.33
  • R 2 ≈ 0.95 R^2 ≈ 0.95 R20.95,说明模型拟合程度很好。

③ 模型验证方法

为了避免模型过拟合,常用以下方法评估模型泛化性能:

  • 训练集 / 测试集划分(如 80% / 20%)
  • 交叉验证(K-Fold Cross Validation)
  • 留一法(LOOCV)

案例:
在 5 折交叉验证中,数据被平均分为 5 份,每次用 4 份训练、1 份验证,最后取平均得分。


④ 模型调优与正则化

为防止模型过拟合:

  • L1正则化(Lasso):稀疏特征(促使部分权重为0)
  • L2正则化(Ridge):平滑参数,防止权重过大
  • 早停法(Early Stopping):在验证集损失不再下降时停止训练

总结:

阶段 核心任务 案例
模型选择 线性 / 决策树 / 神经网络等 房价、气温、股票预测
损失函数 衡量预测误差 MSE、MAE、Huber
模型评估 检验泛化性能 MSE、R²、交叉验证

波士顿房价预测(Boston Housing Price Prediction)

🚩内容包含:
1️⃣ 数据加载与了解
2️⃣ 数据预处理
3️⃣ 建立回归模型(线性回归)
4️⃣ 模型训练与预测
5️⃣ 模型评估(MSE、MAE、R²)
6️⃣ 可视化分析


🧩 1. 数据集简介

“波士顿房价数据集”是经典的小型回归数据集(506条记录,13个特征),目标是预测每个区域的房价中位数(MEDV)

主要特征说明:

特征名 含义
CRIM 城镇人均犯罪率
ZN 住宅用地所占比例
INDUS 非零售商业用地比例
CHAS 是否邻近查尔斯河(1是,0否)
NOX 一氧化氮浓度
RM 平均房间数
AGE 1940年前建成房屋的比例
DIS 距离波士顿五个中心区的加权距离
RAD 公路可达性指数
TAX 财产税税率
PTRATIO 师生比例
B 黑人比例指标
LSTAT 低收入人群比例
MEDV 房价中位数(目标变量)

🧮 2. 导入库与加载数据

# 导入基础库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import seaborn as sns

# 加载波士顿房价数据集
boston = load_boston()

# 转换为 DataFrame
df = pd.DataFrame(boston.data, columns=boston.feature_names)
df["MEDV"] = boston.target

# 显示前5行
print(df.head())

⚠️ 注意:load_boston() 在新版 scikit-learn 已被弃用,你可以从 seaborn 的示例数据或Kaggle上下载替代版本。
若无法使用,可用 fetch_california_housing() 替代(我后面也会说明)。


📊 3. 数据探索性分析(EDA)

# 查看数据基本信息
print(df.info())
print(df.describe())

# 查看相关性
plt.figure(figsize=(10, 8))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm')
plt.title("Feature Correlation Matrix")
plt.show()

🔍 分析结果:

  • RM(房间数)与 MEDV 正相关(越多房间越贵)
  • LSTAT(低收入比例)与 MEDV 强负相关
  • PTRATIO(师生比)也有一定负相关性

🧱 4. 划分数据集与建模

# 特征与目标
X = df.drop("MEDV", axis=1)
y = df["MEDV"]

# 划分训练集与测试集(80% / 20%)
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)

🔮 5. 模型预测与评估

# 预测
y_pred = model.predict(X_test)

# 评估指标
mse = mean_squared_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"均方误差 (MSE): {mse:.2f}")
print(f"平均绝对误差 (MAE): {mae:.2f}")
print(f"决定系数 (R²): {r2:.2f}")

📈 输出示例:

均方误差 (MSE): 24.29
平均绝对误差 (MAE): 3.35
决定系数 (R²): 0.72

➡️ 表明模型能解释约 72% 的房价变化,效果尚可,但还有改进空间。


🎨 6. 可视化分析

# 实际值 vs 预测值
plt.figure(figsize=(6, 6))
plt.scatter(y_test, y_pred, alpha=0.7)
plt.xlabel("实际房价 (MEDV)")
plt.ylabel("预测房价 (Predicted)")
plt.title("实际值 vs 预测值")
plt.plot([0, 50], [0, 50], '--', color='red')
plt.show()

# 残差分析
residuals = y_test - y_pred
plt.figure(figsize=(8, 5))
sns.histplot(residuals, bins=30, kde=True)
plt.title("残差分布")
plt.xlabel("残差值")
plt.show()

📊 分析解读:

  • 散点图接近红色对角线 → 模型预测较准确;
  • 残差图大致呈正态分布 → 没有明显系统偏差;
  • 若出现强偏斜或模式,则说明模型欠拟合或特征需调整。

🚀 7. 模型改进思路

  • 尝试 多项式回归(PolynomialFeatures) 捕捉非线性关系;
  • 使用 正则化模型(Ridge、Lasso)防止过拟合;
  • 决策树或随机森林 捕获非线性特征交互;
  • 对特征做标准化 / PCA 降维;
  • 增加交叉验证提高泛化能力。

⚡ 附:新版替代数据集

因为 load_boston() 已弃用,可以改用 加州房价数据集

from sklearn.datasets import fetch_california_housing

data = fetch_california_housing()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target

这套数据更大(2万条记录),模型训练效果更稳定。


✅ 总结

阶段 内容 示例
数据加载 获取真实世界特征与目标变量 波士顿房价数据
数据探索 查看分布与相关性 RM、LSTAT 对房价影响大
模型选择 建立线性回归模型 LinearRegression()
训练与预测 拟合并预测房价 fit / predict
模型评估 MSE, MAE, R² R² = 0.72
可视化 预测对比、残差图 拟合效果与误差分析

用同一个数据集(比如波士顿房价或加州房价)对比多种回归模型的效果

  1. 线性回归(Linear Regression)
  2. 多项式回归(Polynomial Regression)
  3. 决策树回归(Decision Tree Regressor)
  4. 支持向量回归(SVR)
  5. 神经网络回归(MLPRegressor)

🧮 一、导入库与加载数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVR
from sklearn.neural_network import MLPRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

📊 二、加载与准备数据

# 加载加州房价数据
data = fetch_california_housing()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target

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

# 特征标准化(用于SVR、神经网络)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

⚙️ 三、定义一个通用的评估函数

def evaluate_model(name, model, X_train, X_test, y_train, y_test):
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)
    mae = mean_absolute_error(y_test, y_pred)
    r2 = r2_score(y_test, y_pred)
    print(f"{name}:")
    print(f"  MSE = {mse:.3f}")
    print(f"  MAE = {mae:.3f}")
    print(f"  R²  = {r2:.3f}")
    print("-" * 40)
    return name, mse, mae, r2

🚀 四、训练与评估各模型

① 线性回归

lr = LinearRegression()
result_lr = evaluate_model("线性回归", lr, X_train, X_test, y_train, y_test)

② 多项式回归(Polynomial Regression)

由于多项式特征会大幅增加维度,这里只对少数重要特征(例如RM, LSTAT 类似的)进行演示。
我们简化用2阶多项式。

poly = PolynomialFeatures(degree=2)
X_train_poly = poly.fit_transform(X_train_scaled)
X_test_poly = poly.transform(X_test_scaled)

poly_lr = LinearRegression()
result_poly = evaluate_model("多项式回归(2阶)", poly_lr, X_train_poly, X_test_poly, y_train, y_test)

③ 决策树回归(Decision Tree Regression)

tree = DecisionTreeRegressor(max_depth=6, random_state=42)
result_tree = evaluate_model("决策树回归", tree, X_train, X_test, y_train, y_test)

④ 支持向量回归(SVR)

svr = SVR(kernel='rbf', C=100, epsilon=0.1)
result_svr = evaluate_model("支持向量回归", svr, X_train_scaled, X_test_scaled, y_train, y_test)

⑤ 神经网络回归(Neural Network Regression)

mlp = MLPRegressor(hidden_layer_sizes=(64, 32), max_iter=500, random_state=42)
result_mlp = evaluate_model("神经网络回归", mlp, X_train_scaled, X_test_scaled, y_train, y_test)

📈 五、结果汇总与可视化

results = pd.DataFrame([result_lr, result_poly, result_tree, result_svr, result_mlp],
                       columns=["模型", "MSE", "MAE", "R²"])
print(results)

# 可视化 R²
plt.figure(figsize=(8, 5))
sns.barplot(x="模型", y="R²", data=results, palette="viridis")
plt.title("不同回归模型性能对比 (R² 越高越好)")
plt.show()

📊 六、示例输出结果(示意)

模型 MSE MAE
线性回归 0.54 0.58 0.60
多项式回归(2阶) 0.46 0.52 0.68
决策树回归 0.35 0.44 0.75
支持向量回归 0.32 0.41 0.78
神经网络回归 0.29 0.39 0.81

✅ 从结果可以看出:

  • 线性回归性能一般;
  • 多项式回归捕捉到部分非线性;
  • 决策树与SVR明显提升;
  • 神经网络在数据量较大时效果最佳。

🔍 七、可视化对比预测效果(示例)

# 比较神经网络与线性回归的预测
y_pred_lr = lr.predict(X_test)
y_pred_mlp = mlp.predict(X_test_scaled)

plt.figure(figsize=(6,6))
plt.scatter(y_test, y_pred_lr, alpha=0.6, label="Linear")
plt.scatter(y_test, y_pred_mlp, alpha=0.6, label="Neural Network")
plt.plot([0, 5], [0, 5], 'r--')
plt.xlabel("真实房价")
plt.ylabel("预测房价")
plt.legend()
plt.title("线性回归 vs 神经网络回归")
plt.show()

你会看到神经网络预测点更接近对角线,说明拟合更好。


✅ 八、总结对比表

模型 特征关系 是否非线性 优点 缺点
线性回归 线性 简单、易解释 表达能力弱
多项式回归 多项式 能捕捉非线性 容易过拟合
决策树回归 任意划分 可解释、非线性 容易过拟合
SVR 核函数 对异常值鲁棒 训练慢、参数多
神经网络回归 深层网络 ✅✅ 高度灵活 需大量数据与调参

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐