查看全课大纲(第 94 / 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.实战:通过移动设备行为数据预测性别和年龄

数据集准备及划分

约 13 分钟

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

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

在上一节中,我们直接在训练集上测试了模型,这就像用练习题来考试,无法真实评估模型面对未知数据的能力。本节我们将学习如何正确地准备数据集,并将其划分为训练集和测试集,从而科学地评估机器学习模型的性能。

💡 核心导读

  • 为什么需要划分数据集? 避免“练习题当考试”,确保模型评估的客观性。
  • 数据集的标准格式是什么? 特征矩阵 X(二维数组)和标签向量 y(一维数组)。
  • 如何进行划分? 使用 train_test_split 函数,并理解 test_size 和 random_state 参数的作用。
  • 完整的建模流程是怎样的? 从数据划分、模型训练、预测到性能评估(准确率计算)。

数据集的准备:标准格式

在将数据输入机器学习模型之前,我们需要将其整理成统一的格式。这主要包括两部分:

  1. 样本特征 X:一个二维数组(NumPy ndarray 或类似结构)。其形状为 (n_samples, n_features),其中:

    • n_samples:样本的数量(行数)。
    • n_features:特征的维度或数量(列数)。
    • 每一行代表一个样本,每一列代表一个特征。
  2. 标签 y:一个一维数组。其形状为 (n_samples,),即长度等于样本数量。对于分类任务,y 中的每个元素是该样本对应的类别标签。

特征矩阵 X (形状: n_samples × n_features)
┌─────────────────────────────────────┐
│ 样本1特征1, 样本1特征2, ..., 样本1特征m │
│ 样本2特征1, 样本2特征2, ..., 样本2特征m │
│ ...                                 │
│ 样本n特征1, 样本n特征2, ..., 样本n特征m │
└─────────────────────────────────────┘

标签向量 y (形状: n_samples, )
[ 样本1的标签, 样本2的标签, ..., 样本n的标签 ]

数据集的划分:训练集与测试集

为了避免在训练集上测试导致的评估偏差,标准做法是将手头所有的数据划分为两部分:

  • 训练集 (Training Set):用于“学习”或“训练”模型。模型会看到这部分数据的特征 X_train 和对应的真实标签 y_train。
  • 测试集 (Test Set):用于“考试”或“评估”模型。我们假设不知道这部分数据的标签,模型只接收特征 X_test 并做出预测 y_pred。然后,我们将预测结果 y_pred 与真实的、被我们“藏起来”的标签 y_test 进行比较,从而评估模型性能。

划分的比例没有固定标准,常见做法是:

  • 数据量很大时(如上百万),测试集可以很小(如 1/10 或 1/20)。
  • 数据量一般时,常用 7:3、8:2 或 4:1(即测试集占 20%-25%)。

使用 train_test_split 进行划分

Scikit-learn 提供了便捷的 train_test_split 函数来完成这项工作。

# 代码块1:构造示例数据集并查看格式
import numpy as np

# 构造一个简单的示例数据集:10个样本,每个样本2个特征
# 特征矩阵 X
X = np.array([
    [1.5, 2.0],
    [2.0, 2.5],
    [2.5, 3.0],
    [3.0, 3.5],
    [3.5, 4.0],
    [4.0, 4.5],
    [4.5, 5.0],
    [5.0, 5.5],
    [5.5, 6.0],
    [6.0, 6.5]
])
# 标签向量 y (假设是二分类,0和1)
y = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])

print("特征矩阵 X 的形状:", X.shape)
print("标签向量 y 的形状:", y.shape)
print("\n前3个样本的特征和标签:")
for i in range(3):
    print(f"样本{i}: X={X[i]}, y={y[i]}")
特征矩阵 X 的形状: (10, 2)
标签向量 y 的形状: (10,)

前3个样本的特征和标签:
样本0: X=[1.5 2. ], y=0
样本1: X=[2.  2.5], y=0
样本2: X=[2.5 3. ], y=0
# 代码块2:划分数据集 (完全自包含)
import numpy as np
from sklearn.model_selection import train_test_split

# 重新构造与代码块1相同的数据(保证本块独立)
X = np.array([
    [1.5, 2.0], [2.0, 2.5], [2.5, 3.0], [3.0, 3.5], [3.5, 4.0],
    [4.0, 4.5], [4.5, 5.0], [5.0, 5.5], [5.5, 6.0], [6.0, 6.5]
])
y = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])

# 划分数据集
# test_size: 测试集比例,这里设为 0.25 (25%,即10*0.25=2.5;scikit-learn 对比例参数采用向上取整 ceil,故测试集为3个样本,余下7个作为训练集)
# random_state: 随机种子,保证每次划分结果一致
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=10)

print("原始数据集样本数:", X.shape[0])
print("训练集样本数 (X_train):", X_train.shape[0])
print("测试集样本数 (X_test):", X_test.shape[0])
print("\n训练集标签 (y_train):", y_train)
print("测试集标签 (y_test):", y_test)
原始数据集样本数: 10
训练集样本数 (X_train): 7
测试集样本数 (X_test): 3

训练集标签 (y_train): [1 0 0 0 1 0 1]
测试集标签 (y_test): [1 0 1]

关键参数解释:

  • test_size:指定测试集的比例(如 0.25)或绝对数量(如 2)。
  • random_state:随机数种子。这是为了保证结果的可复现性。如果不设置,每次运行都会得到不同的随机划分结果,不利于实验的重复和比较。设置一个固定的整数值(如 10)即可。

函数返回四个对象:X_train, X_test, y_train, y_test。命名约定上,大写 X 通常表示二维矩阵,小写 y 表示一维向量。

完整的建模与评估流程

划分好数据后,我们就可以进行标准的机器学习工作流了。

# 代码块3:模型训练、预测与评估 (完全自包含)
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 1. 准备数据 (使用与之前相同的示例数据,保证独立)
X = np.array([
    [1.5, 2.0], [2.0, 2.5], [2.5, 3.0], [3.0, 3.5], [3.5, 4.0],
    [4.0, 4.5], [4.5, 5.0], [5.0, 5.5], [5.5, 6.0], [6.0, 6.5]
])
y = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])

# 2. 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=10)

# 3. 选择并初始化模型 (这里使用K近邻分类器)
knn_model = KNeighborsClassifier(n_neighbors=3) # 指定近邻数k=3

# 4. 在训练集上训练模型 (输入: X_train, y_train)
knn_model.fit(X_train, y_train)

# 5. 在测试集上进行预测 (输入: X_test)
# 注意:预测时我们只输入特征,不提供标签,模拟真实预测场景
y_pred = knn_model.predict(X_test)

# 6. 评估模型性能
print("测试集真实标签 (y_test):", y_test)
print("测试集预测标签 (y_pred):", y_pred)
print("\n模型预测准确率:", accuracy_score(y_test, y_pred))
测试集真实标签 (y_test): [1 0 1]
测试集预测标签 (y_pred): [1 0 0]

模型预测准确率: 0.6666666666666666

流程总结:

  1. 准备数据:将原始数据处理成 (X, y) 格式。
  2. 划分数据:使用 train_test_split 得到 (X_train, X_test, y_train, y_test)。
  3. 训练模型:在训练集上调用模型的 .fit(X_train, y_train) 方法进行学习。
  4. 进行预测:在测试集上调用模型的 .predict(X_test) 方法得到预测结果 y_pred。
  5. 评估性能:比较 y_pred 和 y_test,使用 accuracy_score 等指标计算准确率。

如果模型在测试集上的性能(如准确率)符合预期,那么这个模型就可以被保存下来,用于对未来真正的未知数据进行预测。

📝 动手练一练

  1. 概念辨析:如果不设置 train_test_split 的 random_state 参数,直接用于划分数据并训练模型,可能会对项目开发带来什么影响?
👉 点击查看参考答案

答:如果不设置 random_state,每次运行代码时,数据都会被随机地重新划分到训练集和测试集。这会导致:

  • 结果不可复现:你这次运行得到的准确率是 90%,下次可能变成 88%,无法确定哪个结果更可靠,也难以向他人复现你的实验。
  • 模型评估不稳定:如果恰好某次划分的测试集比较简单或困难,会导致对模型性能的评估过于乐观或悲观,产生误导。
  • 调试困难:在开发调试阶段,如果每次数据都变,就很难确定模型性能的变化是由于代码修改引起的,还是由于数据划分的随机性引起的。

因此,在开发和实验阶段,固定 random_state 是保证结果稳定、可比较、可复现的重要实践。

  1. 动手实践:将上面代码块3中的 test_size 参数从 0.25 改为 0.4(即测试集占40%),重新运行代码。观察训练集和测试集的样本数量如何变化,并记录新的预测准确率。
👉 点击查看参考答案

修改 test_size=0.4 后,重新运行代码块3(需要包含所有import和数据构造)。关键变化如下:

  • 样本数量:原始10个样本,测试集将占 10 * 0.4 = 4 个,训练集占 6 个。
  • 准确率:由于划分不同,模型训练所用的数据量减少,测试集样本也不同,准确率可能会发生变化。例如,一次可能的运行结果是准确率 0.75(即4个测试样本中预测对了3个)。你的具体数值可能因环境略有差异,但应能观察到数量变化和准确率波动的可能性。

本章小结

本节我们解决了机器学习中一个至关重要的基础问题:如何公正地评估模型。核心在于理解并实践 数据集划分 这一标准流程。

📋 行动清单

  • 理解 为什么不能直接在训练集上测试模型(练习题当考试)。
  • 记住 数据集的标准格式:特征矩阵 X (n_samples, n_features) 和标签向量 y (n_samples,)。
  • 掌握 使用 sklearn.model_selection.train_test_split 划分数据集,并会使用 test_size 和 random_state 参数。
  • 实践 完整的“划分 → 训练 → 预测 → 评估”机器学习建模流程。

—— 小象教研组

配套资料 · 直接下载

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

  • 本节课件:数据集准备及划分
    PDF · 439KB
    下载
  • 全套课件打包(第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 数据库
    下载