机器学习012:监督学习【回归算法】(对比)-- AI预测世界的“瑞士军刀”

今天我们要聊的是回归算法------这是AI世界里最实用、最基础的工具箱。

想象一下这样的场景:

  • 你想根据广告投入,预测下个月的销售额
  • 医生想根据病人的检查指标,判断是否有某种疾病的风险
  • 网站想根据用户特征,预测点击广告的概率

这些看似不同的问题,其实都需要从数据中找到规律,做出预测或判断。今天我们就来认识回归算法家族的"五大明星"。

回归算法:AI的"预测引擎"

回归算法是监督学习中最重要的一类方法。什么是监督学习?就像老师教学生认字:

  • 老师先给出很多"带答案的例题"(标注好的数据)
  • 学生通过学习这些例题,掌握规律
  • 然后学生就能自己认新字了(预测新数据)

回归算法主要解决两大类问题:

  1. 数值预测:预测具体的数值(比如房价、销售额)
  2. 概率预测:预测某个事件发生的可能性(比如患病概率)

让我们看看回归算法在整个AI大家庭中的位置:
机器学习 监督学习 无监督学习 强化学习 分类算法 回归算法 线性回归 逻辑回归 岭回归 Lasso回归 多项式回归 预测具体数值 预测概率 处理多重共线性 自动特征选择 拟合曲线关系

好了,热身结束!现在让我们一一认识这五位"预测高手"。


第一位:线性回归 ------ 简单直接的"直尺"

这位高手的特点:简单、直观、易理解

线性回归是所有回归算法中最基础、最简单的一位。它就像一个直尺,认为世界上的关系都是直线的。

生活化类比

你想预测外卖送餐时间。线性回归会这样思考:

复制代码
送餐时间 = 0.5 × 距离 + 2 × 天气系数 + 10
  • 距离越远,时间越长
  • 天气越差,时间越长
  • 10分钟是基础准备时间

它是如何工作的?(底层原理)

线性回归的核心是找到一条最佳拟合直线

文字描述核心逻辑

  1. 假设输出值(y)和输入特征(x₁, x₂...)之间是直线关系
  2. 开始时随便画一条直线
  3. 计算这条直线和所有真实数据点的"距离"(误差)
  4. 不断调整直线,让总误差最小
  5. 找到的那条"最佳直线"就是我们的模型

图示理解
否 是 输入数据 假设直线关系 计算预测值 计算误差 误差最小? 调整直线参数 得到最终模型

公式表示

y=β0+β1x1+β2x2+...+βpxp+εy = β₀ + β₁x₁ + β₂x₂ + ... + βₚxₚ + εy=β0+β1x1+β2x2+...+βpxp+ε

  • y:要预测的值
  • x₁, x₂...:特征(影响因素)
  • β₀, β₁...:权重(每个特征的重要性)
  • ε:随机误差

它的局限性

  1. 只能处理线性关系:如果真实关系是曲线,它就画不准

    • 为什么:就像只能用直尺画图,遇到弯曲的线条就没办法了
  2. 对异常值敏感:几个极端值就能把整条直线"拉偏"

    • 为什么:就像拔河比赛,几个大力士就能改变胜负
  3. 多重共线性问题:如果特征之间高度相关,结果会不稳定

    • 为什么:就像几个人说同样的话,你分不清谁的意见更重要

适合它解决的问题

最适合

  • 影响因素和结果之间确实是直线关系
  • 需要快速得到初步结果
  • 需要模型容易解释的业务场景

不适合

  • 影响因素和结果是复杂的曲线关系
  • 数据中有很多异常值
  • 特征之间高度相关

它的实际应用

  1. 房价预测

    • 作用:根据面积、地段、房龄预测房价
    • 公式:房价 = a×面积 + b×地段评分 + c×房龄 + d
  2. 销售额预测

    • 作用:根据广告投入、促销力度预测销售额
    • 帮助制定营销预算
  3. 学生学习时间与成绩关系

    • 作用:分析学习时间对成绩的影响程度
    • 帮助制定学习计划

第二位:逻辑回归 ------ 预测概率的"尺子"

这位高手的特点:专门预测"可能性"

虽然名字里有"回归",但逻辑回归实际上主要用于分类问题 。它不预测具体数值,而是预测概率------某事发生的可能性有多大。

生活化类比

预测明天会不会下雨。逻辑回归给出的是:

  • 下雨的概率:73%
  • 不下雨的概率:27%
    然后我们可以设定一个阈值(比如50%),超过就判断为"会下雨"。

它是如何工作的?(底层原理)

逻辑回归的核心是S型函数,它能把任意数值压缩到0-1之间。

关键概念解释

  • Sigmoid函数:一个特殊的S形曲线,能把任何数变成0到1之间的概率值
  • 对数几率:用"发生概率/不发生概率"的对数来表示关系

文字描述核心逻辑

  1. 先用线性回归的思路计算一个分数
  2. 把这个分数通过Sigmoid函数"挤压"成0-1之间的概率
  3. 概率接近1表示很可能发生,接近0表示不太可能发生
  4. 通常设定0.5为阈值,超过就判断为"是"

图示理解
是 否 输入特征 线性组合计算分数 Sigmoid函数转换 得到概率值0-1 概率大于0.5? 预测为1 是/真 预测为0 否/假

公式表示

P(y=1)=1/(1+e(−z))P(y=1) = 1 / (1 + e^(-z))P(y=1)=1/(1+e(−z))

其中 z = β₀ + β₁x₁ + ... + βₚxₚ

  • P(y=1):事件发生的概率
  • e:自然常数(约2.718)
  • z:线性组合的结果

它的局限性

  1. 只能处理线性边界:分类边界必须是直线(或超平面)

    • 为什么:它的决策边界是由线性方程决定的
  2. 对特征相关性敏感:特征之间相关性太强会影响效果

    • 为什么:就像投票时几个人意见完全一样,会扭曲结果
  3. 需要较大样本量:样本太少时效果不稳定

    • 为什么:就像调研太少人,结论可能不靠谱

适合它解决的问题

最适合

  • 二分类问题(是/否,成功/失败等)
  • 需要知道概率而不仅仅是分类结果
  • 特征和结果之间是线性可分

不适合

  • 多分类问题(需要改造)
  • 复杂的非线性分类边界
  • 特征之间存在复杂交互作用

它的实际应用

  1. 垃圾邮件识别

    • 作用:判断一封邮件是不是垃圾邮件
    • 给出"是垃圾邮件"的概率,比如87%
  2. 疾病风险预测

    • 作用:根据检查指标,预测患病风险
    • 医生可以看到具体的风险概率
  3. 信用卡欺诈检测

    • 作用:判断一笔交易是否可疑
    • 银行可以设定不同的风险阈值

第三位:岭回归 ------ 稳重的"调解员"

这位高手的特点:在过拟合和欠拟合之间找平衡

当特征之间存在高度相关(多重共线性)时,线性回归的结果会很不稳定。岭回归通过增加一点点约束来解决这个问题。

生活化类比

几个专家给你建议,但他们意见都差不多。你不知道该听谁的。岭回归就像说:

"大家的意见我都听,但我不完全相信任何一个人,我会把大家的意见都考虑一点,但不过分依赖某个专家。"

它是如何工作的?(底层原理)

岭回归在损失函数中增加了一个惩罚项,限制系数的大小。

关键概念解释

  • 正则化:给模型添加约束,防止它太复杂
  • L2正则化:惩罚项是系数的平方和

文字描述核心逻辑

  1. 和线性回归一样,想找最佳拟合
  2. 但加了一个条件:系数不能太大
  3. 在"拟合好数据"和"系数小"之间找平衡
  4. 通过调节λ参数控制平衡点

图示理解
输入数据 计算两个目标 目标1:拟合误差小 目标2:系数平方和小 寻找最佳平衡点 通过λ控制权重 得到稳定模型

公式表示

复制代码
损失函数 = Σ(y - ŷ)² + λ × Σβᵢ²
  • 前半部分:拟合误差(和线性回归一样)
  • 后半部分:惩罚项,系数平方和
  • λ:调节参数,控制惩罚力度

它的局限性

  1. 不进行特征选择:所有特征都保留,只是缩小系数

    • 为什么:它只是让不重要的特征系数变小,但不归零
  2. 需要调节λ参数:λ选不好效果可能变差

    • 为什么:惩罚太重会欠拟合,太轻又解决不了共线性
  3. 对异常值仍然敏感:虽然比线性回归稳定,但还是受影响

    • 为什么:惩罚项主要解决共线性,对异常值帮助有限

适合它解决的问题

最适合

  • 特征之间存在高度相关(多重共线性)
  • 所有特征都可能有贡献,不想丢弃任何特征
  • 需要比线性回归更稳定的预测

不适合

  • 需要进行特征选择的场景
  • 特征数量特别多,大部分是噪声
  • 希望得到稀疏解(很多系数为0)

它的实际应用

  1. 经济预测

    • 作用:预测GDP增长,各种经济指标高度相关
    • 保留所有指标,但降低不稳定的影响
  2. 基因数据分析

    • 作用:分析基因表达与疾病的关系
    • 很多基因功能相似,存在共线性
  3. 股票市场分析

    • 作用:预测股价,多种技术指标相关
    • 稳定比极端准确更重要

第四位:Lasso回归 ------ 精明的"精简师"

这位高手的特点:自动选择重要特征

Lasso回归和岭回归类似,也添加惩罚项,但惩罚方式不同。Lasso能让不重要的特征的系数直接变成0,实现自动特征选择

生活化类比

你要去旅行,带了很多东西。Lasso就像个经验丰富的旅行家:

"这个需要,带上;那个用不上,扔掉;这个偶尔有用但太重,也不带。"

最后你只带最必要的几样东西。

它是如何工作的?(底层原理)

Lasso使用L1正则化,惩罚项是系数的绝对值之和。

关键概念解释

  • L1正则化:惩罚项是系数的绝对值之和
  • 特征选择:不重要的特征系数变为0,相当于被移除

文字描述核心逻辑

  1. 和线性回归一样想最小化误差
  2. 但加了一个条件:所有系数的绝对值之和不能太大
  3. 这个条件会让一些不重要的系数直接变成0
  4. 实现自动选择重要特征

为什么能产生稀疏解

  • 数学上,L1惩罚的几何形状是"菱形"
  • 在优化过程中,容易碰到菱形的"角"
  • 在角上,一些坐标正好是0

图示理解
所有特征 Lasso处理 特征重要性评估 重要特征 不重要特征 系数较大 系数变为0 最终模型:只含重要特征

公式表示

复制代码
损失函数 = Σ(y - ŷ)² + λ × Σ|βᵢ|
  • 前半部分:拟合误差
  • 后半部分:L1惩罚项,系数绝对值之和
  • λ越大,越多系数变为0

它的局限性

  1. 群组选择问题:如果有一组高度相关的特征,可能只随机选一个

    • 为什么:它不知道这些特征本质相关,可能任意选一个代表
  2. 特征数>样本数时有限制:最多只能选择样本数个特征

    • 为什么:数学上的限制
  3. 不稳定:数据微小变化可能导致选择不同的特征

    • 为什么:边界情况可能让系数在0附近波动

适合它解决的问题

最适合

  • 特征数量很多,想自动选择重要特征
  • 希望得到稀疏模型(很多系数为0)
  • 解释性要求高,想知道哪些特征真正重要

不适合

  • 所有特征都可能重要,不想丢弃任何特征
  • 高度相关的特征组需要全部保留
  • 特征数远大于样本数且需要选很多特征

它的实际应用

  1. 基因组学特征选择

    • 作用:从上万个基因中找出与疾病相关的几十个
    • 极大简化模型,提高可解释性
  2. 文本分类特征选择

    • 作用:从大量词汇中选择关键词汇
    • 减少维度,提高效率
  3. 消费者行为分析

    • 作用:从数百个消费特征中找出关键影响因素
    • 帮助制定精准营销策略

第五位:多项式回归 ------ 灵活的"曲线拟合师"

这位高手的特点:用曲线捕捉复杂关系

当变量之间的关系不是直线而是曲线时,多项式回归就派上用场了。它通过添加特征的幂次项来拟合曲线。

生活化类比

小孩身高随年龄增长:

  • 0-2岁:长得快(曲线较陡)
  • 2-12岁:匀速增长(接近直线)
  • 12-18岁:青春期快速长高(又变陡)
  • 18岁后:基本停止(平缓)
    这需要用曲线而不是直线来描述。

它是如何工作的?(底层原理)

多项式回归本质上是线性回归的扩展,只是把特征的高次幂也作为新特征。

关键概念解释

  • 多项式特征:x, x², x³等作为新特征
  • 仍用线性回归:只是特征空间扩展了

文字描述核心逻辑

  1. 生成新的多项式特征
    • 原始特征:x
    • 新特征:x², x³, x⁴...
  2. 把这些新特征和原始特征一起作为输入
  3. 用线性回归方法拟合
  4. 结果是一个多项式函数

图示理解

公式表示

复制代码
y = β₀ + β₁x + β₂x² + β₃x³ + ... + βₚxᵖ + ε
  • x², x³...:特征的高次项
  • 虽然是非线性关系,但对参数β仍是线性的
  • 所以仍可用线性回归的方法求解

它的局限性

  1. 容易过拟合:阶数太高会完美拟合训练数据但泛化差

    • 为什么:就像用复杂曲线连每个点,但对新点预测差
  2. 外推能力差:超出训练数据范围时预测不可靠

    • 为什么:多项式在两端可能急剧上升或下降
  3. 特征维度爆炸:多特征时多项式项增长极快

    • 为什么:3个特征2次多项式就有10项,3次就有20项

适合它解决的问题

最适合

  • 变量之间是曲线关系
  • 数据范围有限,不需要外推
  • 关系模式明确,知道大概是什么曲线

不适合

  • 需要预测训练范围之外的值
  • 特征很多,维度会爆炸
  • 关系非常复杂,不是简单多项式能描述

它的实际应用

  1. 物理实验曲线拟合

    • 作用:拟合实验数据曲线,如弹簧伸长与力的关系
    • 验证物理定律
  2. 经济增长趋势拟合

    • 作用:拟合GDP增长曲线
    • 分析经济增长阶段
  3. 药物剂量反应曲线

    • 作用:拟合药效随剂量变化曲线
    • 确定最佳用药剂量

五大回归算法对比总结

算法 核心思想 优点 缺点 最适合场景
线性回归 最佳直线拟合 简单、快速、易解释 只能处理线性关系 简单线性预测
逻辑回归 预测概率 输出概率值、用于分类 只能线性分类 二分类概率预测
岭回归 L2正则化 稳定、抗共线性 不进行特征选择 特征相关时的稳定预测
Lasso回归 L1正则化 自动特征选择、稀疏解 可能丢弃重要特征 高维特征选择
多项式回归 曲线拟合 拟合非线性关系 易过拟合、外推差 已知曲线形式的拟合

Python实践案例:房价预测大比拼

下面我们用Python实际体验这五种回归算法。我们会用同一个房价数据集,看不同算法的表现。

环境准备

python 复制代码
# 安装必要的库(如果还没安装)
# pip install numpy pandas matplotlib scikit-learn seaborn

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.linear_model import LinearRegression, LogisticRegression, Ridge, Lasso
from sklearn.metrics import mean_squared_error, r2_score, accuracy_score

# 设置中文字体和美观样式
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
sns.set_style("whitegrid")

数据准备和探索

python 复制代码
# 创建模拟的房价数据集
np.random.seed(42)  # 确保可重复性

# 生成200条数据
n_samples = 200

# 特征1:面积(平方米,50-200)
area = np.random.uniform(50, 200, n_samples)

# 特征2:房间数(1-5)
rooms = np.random.randint(1, 6, n_samples)

# 特征3:到地铁距离(公里,0.1-5)
distance = np.random.uniform(0.1, 5, n_samples)

# 特征4:房龄(年,0-50)
age = np.random.uniform(0, 50, n_samples)

# 特征5:是否学区房(0/1)
school = np.random.randint(0, 2, n_samples)

# 生成房价(万元)
# 真实关系:面积和房间数主要影响,但存在非线性
price = (0.8 * area + 
         15 * rooms + 
         -3 * distance + 
         -0.5 * age + 
         20 * school +
         0.02 * area**2 +  # 非线性项
         np.random.normal(0, 15, n_samples))  # 随机噪声

# 创建DataFrame
data = pd.DataFrame({
    '面积': area,
    '房间数': rooms,
    '地铁距离': distance,
    '房龄': age,
    '学区房': school,
    '房价': price
})

print("数据概览:")
print(f"数据形状:{data.shape}")
print("\n前5行数据:")
print(data.head())
print("\n基本统计信息:")
print(data.describe())

# 可视化特征与房价的关系
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
axes = axes.flatten()

features = ['面积', '房间数', '地铁距离', '房龄', '学区房']
for i, feature in enumerate(features):
    axes[i].scatter(data[feature], data['房价'], alpha=0.6)
    axes[i].set_xlabel(feature)
    axes[i].set_ylabel('房价(万元)')
    axes[i].set_title(f'{feature} vs 房价')

# 最后一个子图显示房价分布
axes[5].hist(data['房价'], bins=30, edgecolor='black', alpha=0.7)
axes[5].set_xlabel('房价(万元)')
axes[5].set_ylabel('频次')
axes[5].set_title('房价分布')

plt.tight_layout()
plt.show()

数据预处理

python 复制代码
# 准备特征和目标变量
X = data[['面积', '房间数', '地铁距离', '房龄', '学区房']]
y = data['房价']

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

print(f"训练集大小:{X_train.shape}")
print(f"测试集大小:{X_test.shape}")

# 特征标准化(对正则化方法很重要)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

1. 线性回归

python 复制代码
print("=" * 50)
print("1. 线性回归")
print("=" * 50)

# 创建和训练模型
lr = LinearRegression()
lr.fit(X_train_scaled, y_train)

# 预测和评估
y_pred_lr = lr.predict(X_test_scaled)
mse_lr = mean_squared_error(y_test, y_pred_lr)
r2_lr = r2_score(y_test, y_pred_lr)

print(f"均方误差(MSE):{mse_lr:.2f}")
print(f"R²分数:{r2_lr:.3f}")
print("\n模型系数(权重):")
for feature, coef in zip(X.columns, lr.coef_):
    print(f"  {feature}: {coef:7.3f}")
print(f"截距:{lr.intercept_:.3f}")

2. 岭回归

python 复制代码
print("\n" + "=" * 50)
print("2. 岭回归")
print("=" * 50)

# 创建和训练模型(尝试不同的alpha值)
ridge = Ridge(alpha=1.0)  # alpha就是λ
ridge.fit(X_train_scaled, y_train)

# 预测和评估
y_pred_ridge = ridge.predict(X_test_scaled)
mse_ridge = mean_squared_error(y_test, y_pred_ridge)
r2_ridge = r2_score(y_test, y_pred_ridge)

print(f"均方误差(MSE):{mse_ridge:.2f}")
print(f"R²分数:{r2_ridge:.3f}")
print("\n模型系数(权重):")
for feature, coef in zip(X.columns, ridge.coef_):
    print(f"  {feature}: {coef:7.3f}")
print(f"截距:{ridge.intercept_:.3f}")

# 比较与线性回归的系数变化
print("\n系数变化(岭回归 vs 线性回归):")
for feature, coef_lr, coef_ridge in zip(X.columns, lr.coef_, ridge.coef_):
    change = coef_ridge - coef_lr
    print(f"  {feature}: {change:7.3f}")

3. Lasso回归

python 复制代码
print("\n" + "=" * 50)
print("3. Lasso回归")
print("=" * 50)

# 创建和训练模型
lasso = Lasso(alpha=0.1)  # alpha就是λ
lasso.fit(X_train_scaled, y_train)

# 预测和评估
y_pred_lasso = lasso.predict(X_test_scaled)
mse_lasso = mean_squared_error(y_test, y_pred_lasso)
r2_lasso = r2_score(y_test, y_pred_lasso)

print(f"均方误差(MSE):{mse_lasso:.2f}")
print(f"R²分数:{r2_lasso:.3f}")
print("\n模型系数(权重):")
for feature, coef in zip(X.columns, lasso.coef_):
    print(f"  {feature}: {coef:7.3f}")
print(f"截距:{lasso.intercept_:.3f}")

# 查看哪些特征被选择了(系数不为0)
selected_features = [feature for feature, coef in zip(X.columns, lasso.coef_) if abs(coef) > 0.001]
print(f"\nLasso选择的特征({len(selected_features)}个):{selected_features}")

4. 多项式回归

python 复制代码
print("\n" + "=" * 50)
print("4. 多项式回归(2次)")
print("=" * 50)

# 生成多项式特征(2次)
poly = PolynomialFeatures(degree=2, include_bias=False)
X_train_poly = poly.fit_transform(X_train_scaled)
X_test_poly = poly.transform(X_test_scaled)

print(f"原始特征数:{X_train_scaled.shape[1]}")
print(f"多项式特征数(2次):{X_train_poly.shape[1]}")

# 使用线性回归拟合多项式特征
poly_lr = LinearRegression()
poly_lr.fit(X_train_poly, y_train)

# 预测和评估
y_pred_poly = poly_lr.predict(X_test_poly)
mse_poly = mean_squared_error(y_test, y_pred_poly)
r2_poly = r2_score(y_test, y_pred_poly)

print(f"均方误差(MSE):{mse_poly:.2f}")
print(f"R²分数:{r2_poly:.3f}")

5. 逻辑回归(分类问题示例)

python 复制代码
print("\n" + "=" * 50)
print("5. 逻辑回归(分类问题)")
print("=" * 50)

# 创建一个分类问题:预测房价是否高于平均值
y_mean = np.mean(y)
y_class = (y > y_mean).astype(int)  # 1表示高价房,0表示低价房

# 重新划分数据
X_train_cls, X_test_cls, y_train_cls, y_test_cls = train_test_split(
    X, y_class, test_size=0.2, random_state=42
)

# 标准化
X_train_cls_scaled = scaler.fit_transform(X_train_cls)
X_test_cls_scaled = scaler.transform(X_test_cls)

# 逻辑回归模型
logistic = LogisticRegression(max_iter=1000)
logistic.fit(X_train_cls_scaled, y_train_cls)

# 预测和评估
y_pred_cls = logistic.predict(X_test_cls_scaled)
y_pred_prob = logistic.predict_proba(X_test_cls_scaled)[:, 1]  # 预测概率

accuracy = accuracy_score(y_test_cls, y_pred_cls)

print(f"准确率:{accuracy:.3f}")
print("\n模型系数(权重):")
for feature, coef in zip(X.columns, logistic.coef_[0]):
    print(f"  {feature}: {coef:7.3f}")
print(f"截距:{logistic.intercept_[0]:.3f}")

# 显示前5个样本的预测概率
print("\n前5个测试样本的预测概率:")
for i in range(min(5, len(y_test_cls))):
    print(f"样本{i+1}: 真实类别={y_test_cls.iloc[i]}, "
          f"预测类别={y_pred_cls[i]}, "
          f"高价房概率={y_pred_prob[i]:.3f}")

结果比较和可视化

python 复制代码
print("\n" + "=" * 50)
print("五种回归算法性能比较")
print("=" * 50)

# 汇总结果
results = pd.DataFrame({
    '算法': ['线性回归', '岭回归', 'Lasso回归', '多项式回归(2次)', '逻辑回归(分类)'],
    'MSE': [mse_lr, mse_ridge, mse_lasso, mse_poly, np.nan],
    'R²': [r2_lr, r2_ridge, r2_lasso, r2_poly, np.nan],
    '准确率': [np.nan, np.nan, np.nan, np.nan, accuracy]
})

print(results.to_string(index=False))

# 可视化比较
fig, axes = plt.subplots(2, 2, figsize=(14, 10))

# 1. 预测值 vs 真实值对比
models = [('线性回归', y_pred_lr), 
          ('岭回归', y_pred_ridge),
          ('Lasso回归', y_pred_lasso),
          ('多项式回归', y_pred_poly)]

for idx, (name, y_pred) in enumerate(models):
    ax = axes[idx//2, idx%2]
    ax.scatter(y_test, y_pred, alpha=0.6)
    
    # 画完美预测线
    min_val = min(y_test.min(), y_pred.min())
    max_val = max(y_test.max(), y_pred.max())
    ax.plot([min_val, max_val], [min_val, max_val], 'r--', lw=2)
    
    ax.set_xlabel('真实房价')
    ax.set_ylabel('预测房价')
    ax.set_title(f'{name} - R²={results.loc[idx, "R²"]:.3f}')
    ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

# 系数比较图
fig, ax = plt.subplots(figsize=(12, 6))

x = np.arange(len(X.columns))
width = 0.2

rects1 = ax.bar(x - width*1.5, lr.coef_, width, label='线性回归')
rects2 = ax.bar(x - width/2, ridge.coef_, width, label='岭回归')
rects3 = ax.bar(x + width/2, lasso.coef_, width, label='Lasso回归')
rects4 = ax.bar(x + width*1.5, logistic.coef_[0], width, label='逻辑回归')

ax.set_xlabel('特征')
ax.set_ylabel('系数值')
ax.set_title('不同算法的特征系数比较')
ax.set_xticks(x)
ax.set_xticklabels(X.columns)
ax.legend()
ax.grid(True, alpha=0.3, axis='y')

plt.tight_layout()
plt.show()

用模型做新预测

python 复制代码
print("\n" + "=" * 50)
print("新房子预测示例")
print("=" * 50)

# 假设有一套新房子
new_house = pd.DataFrame({
    '面积': [120],
    '房间数': [3],
    '地铁距离': [1.5],
    '房龄': [10],
    '学区房': [1]
})

# 标准化
new_house_scaled = scaler.transform(new_house)

# 用不同模型预测
lr_pred = lr.predict(new_house_scaled)[0]
ridge_pred = ridge.predict(new_house_scaled)[0]
lasso_pred = lasso.predict(new_house_scaled)[0]

# 多项式特征转换
new_house_poly = poly.transform(new_house_scaled)
poly_pred = poly_lr.predict(new_house_poly)[0]

# 逻辑回归预测概率
logistic_prob = logistic.predict_proba(new_house_scaled)[0, 1]

print("新房特征:")
for feature in new_house.columns:
    print(f"  {feature}: {new_house[feature].values[0]}")
print()

print("不同模型的预测结果:")
print(f"线性回归预测房价:{lr_pred:.1f} 万元")
print(f"岭回归预测房价:{ridge_pred:.1f} 万元")
print(f"Lasso回归预测房价:{lasso_pred:.1f} 万元")
print(f"多项式回归预测房价:{poly_pred:.1f} 万元")
print(f"逻辑回归预测高价房概率:{logistic_prob:.1%}")
print(f"逻辑回归分类结果:{'高价房' if logistic_prob > 0.5 else '低价房'}")

给初学者的学习路径建议

  1. 先掌握线性回归:这是所有回归的基础,理解它才能理解其他变体

  2. 理解正则化的概念

    • 岭回归:L2正则化,让系数变小但不为0
    • Lasso回归:L1正则化,让不重要系数为0
  3. 分清使用场景

    • 预测数值:线性、岭、Lasso、多项式回归
    • 预测概率/分类:逻辑回归
  4. 动手实践最重要

    • 运行上面的代码
    • 修改参数,观察变化
    • 用自己的数据尝试
  5. 理解评估指标

    • 回归:MSE、RMSE、R²
    • 分类:准确率、精确率、召回率

总结:回归算法的核心价值

回归算法是从数据中学习规律,用规律预测未来的最基础工具。

一句话概括

  • 线性回归:找最佳直线
  • 逻辑回归:算发生概率
  • 岭回归:稳定中求准确
  • Lasso回归:精简中抓重点
  • 多项式回归:用曲线拟合复杂关系

无论你的目标是预测数值还是判断类别,无论你的数据是简单线性还是复杂非线性,回归算法家族都有合适的工具。选择哪种算法,取决于你的数据特点、业务需求和想要的结果形式。

记住,没有最好的算法,只有最合适的算法。希望通过今天的学习,你能:

  1. 理解每种回归算法的核心思想
  2. 知道何时该用哪种算法
  3. 能够用Python实现基本应用

回归算法是AI世界的基石,掌握它们,你就打开了预测分析的大门。祝你学习愉快,探索无限!

相关推荐
*星星之火*2 小时前
【大白话 AI 答疑】第9篇 深入浅出:sigmoid函数公式设计原理——为何是$e^{-x}$而非$e^x$
人工智能·机器学习
Java后端的Ai之路2 小时前
【AI编程工具】-CodeBuddy设置鼠标配合快捷键放大字体
人工智能·aigc·ai编程·codebuddy
我想我不够好。2 小时前
实操练习 12.20
学习
龙腾AI白云2 小时前
DNN案例一步步构建深层神经网络(4)
人工智能
爱笑的眼睛112 小时前
超越翻转与裁剪:面向生产级AI的数据增强深度实践与多模态演进
java·人工智能·python·ai
Crkylin2 小时前
尚硅谷Linux应用层学习笔记(一)GCC编译
linux·笔记·学习
车载测试工程师2 小时前
CAPL学习-AVB交互层-功能函数-监听器函数函数
网络·学习·tcp/ip·capl·canoe
百泰派克生物科技2 小时前
N端测序质谱分析
人工智能·科研·生物信息学分析·生化学
码上掘金2 小时前
基于YOLO与大语言模型的中医智能舌诊系统
人工智能·yolo·语言模型