查看全课大纲(第 89 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.3D绘图 -- mplot3d
  82. 82.3D曲线可视化
  83. 83.3D散点图可视化
  84. 84.3D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

机器学习建模介绍 (2) -- 回归

约 8 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

回归算法:从原理到实战

小象实战讲义 · Python数据分析实战

在上一节我们学习了分类算法,它用于预测离散的类别标签。本节我们将转向另一类核心的机器学习问题——回归。回归算法旨在预测一个连续的数值,例如预测房价、公司业务增长量或冰激凌的销量。理解回归的原理及其与分类的区别,是构建预测模型的关键一步。

💡 核心导读

  • 回归的定义与应用:理解回归算法用于预测连续数值的核心场景,如房价预测、销量分析。
  • 线性回归原理:掌握如何通过拟合一条直线(或曲线)来建立输入特征与连续输出目标之间的关系。
  • 回归 vs. 分类:清晰区分两类算法的根本差异——预测值是连续的还是离散的。
  • 实战:冰激凌销量预测:使用 scikit-learn 实现一个完整的线性回归案例,从数据准备到模型预测。

什么是回归?

回归算法是一种监督学习方法,其目标是根据属性的历史数据去预测一个未来的连续趋势值。

核心思想:我们假设存在某种已知类型的函数(例如一条直线)可以较好地拟合已有的历史数据点。然后,通过某种方法(通常是最小化预测误差)从无数可能的函数中,找出一个与历史数据拟合程度最好的函数。这个学习到的函数就是我们的预测模型。

举例说明:

  • 预测房价:假设房价只与房屋面积(平方米)有关。我们收集了一批历史数据:每个数据点包括面积(x)和对应的房价(y)。将这些点画在图上,x轴是面积,y轴是房价。回归算法的任务就是找到一条最能代表这些点分布趋势的线。之后,对于一个新房子,只要知道其面积,就可以通过这条线预测出其大致的房价。
  • 预测公司业务增长量:基于过去几年的月度营收数据,预测未来几个季度的营收趋势。
  • 预测冰激凌销量:基于气温的历史数据,预测在不同温度下的冰激凌销量。

这些预测值(房价、营收、销量)都不是非此即彼的离散标签,而是一个可以在一定范围内连续变化的数值,这正是回归问题的特征。

回归的原理:以线性回归为例

让我们通过一个简单的线性回归例子来直观理解其原理。线性回归假设输入特征 x 和输出目标 y 之间存在线性关系,即可以用一条直线 y = w * x + b 来拟合,其中 w 是斜率,b 是截距。

  1. 数据表示:我们有一组历史数据,每个样本由一对 (x, y) 组成。例如,x 是房屋面积,y 是对应房价。在坐标系中,每个样本就是一个散点。
  2. 模型假设:我们假设这些散点大致分布在一条直线附近。
  3. 学习目标:从无数条可能的直线中,找到一条“最好”的直线。如何定义“最好”?通常是指这条直线到所有历史数据点的预测误差总和最小(常用均方误差来衡量)。
  4. 进行预测:一旦找到了这条最优直线,对于任意一个新的 x 值,我们只需将其代入直线方程,计算出的 y 值就是模型的预测结果。

下面的代码构造了一个简单的线性关系数据集,并演示了如何使用 scikit-learn 找到那条最优直线。

# 回归原理演示:构造数据并拟合直线
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 使用 matplotlib 的非交互式后端,确保代码在任何环境下都能运行
plt.switch_backend('Agg')

# 1. 构造模拟数据:假设冰激凌销量与气温呈线性关系
# 硬编码数据,确保每次运行结果一致
np.random.seed(42)  # 固定种子仅用于生成数据点,不用于印刷输出
temperature = np.array([55, 60, 65, 70, 75, 80, 85, 90]).reshape(-1, 1)  # 气温(华氏度)
sales = np.array([ 20,  25,  30,  40,  50,  60,  70,  80])               # 销量(份)

# 2. 创建并训练线性回归模型
model = LinearRegression()
model.fit(temperature, sales)  # 模型在此学习最优的 w 和 b

# 3. 获取学习到的模型参数
slope = model.coef_[0]
intercept = model.intercept_
print(f"学习到的线性模型为:销量 = {slope:.2f} * 温度 + {intercept:.2f}")
print(f"模型斜率 (w): {slope:.2f}")
print(f"模型截距 (b): {intercept:.2f}")
学习到的线性模型为:销量 = 1.77 * 温度 + -81.73
模型斜率 (w): 1.77
模型截距 (b): -81.73

模型告诉我们,学习到的最优直线方程是 销量 = 1.77 * 温度 - 81.73。接下来,我们可视化这条直线以及它是如何用于预测的。

# 可视化拟合直线与预测过程
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

plt.switch_backend('Agg')

# 重新构造完全相同的数据和模型,确保本代码块自包含
temperature = np.array([55, 60, 65, 70, 75, 80, 85, 90]).reshape(-1, 1)
sales = np.array([20, 25, 30, 40, 50, 60, 70, 80])
model = LinearRegression()
model.fit(temperature, sales)

# 生成用于绘制直线的x值范围
x_fit = np.linspace(50, 95, 100).reshape(-1, 1)
# 使用模型预测对应的y值
y_fit = model.predict(x_fit)

# 进行具体预测:当气温为72华氏度时,销量是多少?
temp_to_predict = np.array([[72]]) # 注意保持二维输入
predicted_sales = model.predict(temp_to_predict)[0]
print(f"预测:当气温为72华氏度时,冰激凌销量约为 {predicted_sales:.1f} 份。")

# 重新绘图,展示数据点、拟合直线和预测点
fig, ax = plt.subplots(figsize=(8, 5))
ax.scatter(temperature, sales, color='orange', s=80, label='历史数据点 (样本)', zorder=5)
ax.plot(x_fit, y_fit, color='green', linewidth=2, label='拟合的线性模型')
ax.scatter(temp_to_predict, predicted_sales, color='red', s=120, marker='*', label='预测点 (72°F)', zorder=6)
ax.axvline(x=72, color='gray', linestyle='--', alpha=0.5)
ax.axhline(y=predicted_sales, color='gray', linestyle='--', alpha=0.5)

ax.set_xlabel('气温 (华氏度)')
ax.set_ylabel('冰激凌销量 (份)')
ax.set_title('线性回归:根据气温预测冰激凌销量')
ax.legend()
ax.grid(True, alpha=0.3)
# 在讲义中,我们通常不实际保存图片,此处关闭图形释放内存
plt.close(fig)
print("可视化图形已生成(在本地运行可调用 plt.show() 查看)。")
预测:当气温为72华氏度时,冰激凌销量约为 46.0 份。
可视化图形已生成(在本地运行可调用 plt.show() 查看)。

通过图表可以清晰看到:绿色直线是我们学习到的模型,它尽可能穿过所有橙色历史数据点的中心。对于新的输入 x=72(灰色虚线),我们沿直线找到对应的输出 y≈46.0(红色星点),这就是模型的预测值。

回归与分类的关键区别

回归和分类是监督学习的两大主要类别,它们的根本区别在于预测值的性质。

特性分类 (Classification)回归 (Regression)
预测输出离散的类别标签。连续的数值。
输出空间有限的、可数的集合。通常是实数域或其连续子集。
例子预测图片是“猫”还是“狗”;判断邮件是“垃圾邮件”或“正常邮件”;鸢尾花品种分类(Setosa, Versicolor, Virginica)。预测房价(如 115.5 万元);预测公司季度营收增长量(如 12.3%);预测冰激凌日销量(如 54 份)。
算法目标找到决策边界,将不同类别的样本分开。找到输入特征与连续目标之间的映射函数。

简单判断准则:问自己“模型的预测结果是否仅限于几个固定的选项?”如果是,就是分类问题;如果预测结果可以是某个范围内的任意数值,就是回归问题。

综合实战:完整的回归预测流程

现在,让我们整合以上知识,完成一个从数据到预测的完整回归案例。我们将使用自包含的代码块,模拟根据房屋面积预测房价的场景。

# 综合实战:房屋面积预测房价(完整流程)
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# 1. 数据准备:硬编码构造小型数据集
data = {
    '面积_平方米': [50, 70, 90, 110, 130, 150, 170, 190],
    '价格_万元': [180, 230, 280, 320, 380, 420, 470, 520]
}
df = pd.DataFrame(data)
print("历史房价数据集:")
print(df.to_string(index=False))
print()

# 2. 划分特征(X)与目标(y)
X = df[['面积_平方米']].values  # 特征矩阵,保持二维
y = df['价格_万元'].values       # 目标向量

# 3. 创建并训练模型
model = LinearRegression()
model.fit(X, y)

# 4. 模型评估(在训练集上,仅作演示)
y_pred = model.predict(X)
mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)
print(f"模型方程:价格 = {model.coef_[0]:.2f} * 面积 + {model.intercept_:.2f}")
print(f"均方误差 (MSE): {mse:.2f}")
print(f"决定系数 (R²): {r2:.4f} (越接近1,拟合越好)")
print()

# 5. 进行新预测
new_areas = np.array([[65], [145]]) # 两个新房屋的面积
predicted_prices = model.predict(new_areas)
for area, price in zip(new_areas.flatten(), predicted_prices):
    print(f"预测:面积为{area}平方米的房屋,价格约为 {price:.1f} 万元。")
历史房价数据集:
 面积_平方米  价格_万元
     50    180
     70    230
     90    280
    110    320
    130    380
    150    420
    170    470
    190    520

模型方程:价格 = 2.42 * 面积 + 60.00
均方误差 (MSE): 10.42
决定系数 (R²): 0.9992 (越接近1,拟合越好)

预测:面积为65平方米的房屋,价格约为 217.1 万元。
预测:面积为145平方米的房屋,价格约为 410.4 万元。

这个实战案例展示了回归分析的标准流程:数据准备、模型训练、评估与预测。R² 值非常接近1,说明我们构造的线性数据与模型拟合得非常好。

📝 动手练一练

  1. 概念辨析:以下场景中,哪些应该使用回归算法,哪些应该使用分类算法?
    • a) 根据用户历史行为预测其明天的APP使用时长。
    • b) 根据体检指标判断一个人是否患有某种疾病。
    • c) 根据电影的历史评分预测一部新电影的票房收入。
    • d) 识别一张图片中的动物是猫、狗还是兔子。
👉 点击查看参考答案
  • a) 回归。APP使用时长是一个连续的数值(如120分钟)。
  • b) 分类。输出是离散的类别:“患病”或“健康”。
  • c) 回归。票房收入是一个连续的数值。
  • d) 分类。输出是有限的离散类别集合 {猫, 狗, 兔子}。
  1. 代码实践:在上面“综合实战”的代码中,模型学习到的方程是 价格 = 2.42 * 面积 + 60.00。请不运行代码,手动计算当房屋面积为 100平方米 时,模型的预测价格是多少?
👉 点击查看参考答案

根据方程:价格 = 2.42 * 面积 + 60.00 将面积 = 100 代入: 价格 = 2.42 * 100 + 60.00 = 242.0 + 60.0 = 302.0 因此,预测价格约为 302.0 万元。 你可以尝试修改上面实战代码的 new_areas 数组,加入 [[100]] 来验证计算结果。(小提示:模型内部保存的是未四舍五入的精确系数,代码验证的结果可能与手算的 302.0 有零点几的微小差异,这是正常的——方程里的 2.42 和 60.00 是保留两位小数的显示值。)

本章小结

本节我们深入探讨了机器学习中的回归算法。回归用于预测连续的数值输出,其核心思想是通过历史数据学习一个映射函数(如线性回归中的直线),并通过最小化预测误差来确定最优函数参数。关键在于区分回归与分类:前者预测连续值,后者预测离散标签。

📋 行动清单

  • 理解原理:能够用自己的话解释线性回归是如何通过“找一条最优直线”来进行预测的。
  • 区分问题:给定一个新的业务场景(如预测销售额、用户流失概率),能初步判断其属于回归还是分类问题。
  • 运行代码:将本节中的实战代码在本地或学习环境中运行一遍,尝试修改输入数据或预测值,观察模型结果的变化。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 本节课件:机器学习建模介绍 (2) -- 回归
    PDF · 311KB
    下载
  • 全套课件打包(第1-5章)
    ZIP · 12.8MB
    下载
  • 全套课件打包(第6-8章)
    ZIP · 15MB
    下载
  • 实战数据集:AppleStore 应用商城分析
    ZIP · 329KB
    下载
  • 实战数据集:女性服装电商分析
    ZIP · 2.8MB
    下载
  • Python 数据分析环境搭建指南
    PDF · 2MB
    下载
  • Scrapy 安装教程
    PDF · 12.7MB
    下载
  • 附加实战项目:AppleStore 应用商城数据分析
    ZIP · 0.3MB · ipynb + CSV 数据
    下载
  • 附加实战项目:银行电话营销数据分析
    ZIP · 0.4MB · ipynb + CSV 数据
    下载
  • 附加实战项目:女性服装电商评论数据分析
    ZIP · 2.7MB · ipynb + CSV 数据
    下载
  • 附加实战项目:美国化学学会杂志数据分析
    ZIP · 34.2MB · ipynb + SQLite 数据库
    下载