鸢尾花案例之切分训练集和测试集
1 课程概览
本课讲解如何使用train_test_split函数将数据集划分为训练集和测试集。详细讲解函数的参数(特征数据、标签数据、测试集比例、随机种子)和返回值(x_train, x_test, y_train, y_test),并强调随机种子的重要性——固定种子可保证每次划分结果一致。
2 核心概念与定义
- train_test_split:sklearn.model_selection模块中的函数,用于切分训练集和测试集。
- test_size:测试集比例,如0.2表示20%数据作为测试集。
- random_state:随机种子,固定后每次划分结果一致。
- 训练集(Train Set):用于训练模型的数据。
- 测试集(Test Set):用于评估模型的数据。
3 算法与模型详解
3.1 数据集划分比例
| 划分方式 | 训练集 | 测试集 |
|---|---|---|
| 8:2 | 80% | 20% |
| 7:3 | 70% | 30% |
鸢尾花150条数据,8:2划分:训练集120条,测试集30条。
3.2 train_test_split函数
导入:
from sklearn.model_selection import train_test_split
参数:
| 参数 | 说明 | 示例 |
|---|---|---|
| 参1 | 特征数据 | iris_data.data |
| 参2 | 标签数据 | iris_data.target |
| test_size | 测试集比例 | 0.2 |
| random_state | 随机种子 | 23 |
返回值(元组):
x_train, x_test, y_train, y_test = train_test_split(...)
| 返回值 | 说明 | 数据量(150条,8:2) |
|---|---|---|
| x_train | 训练集特征 | 120条×4列 |
| x_test | 测试集特征 | 30条×4列 |
| y_train | 训练集标签 | 120条×1列 |
| y_test | 测试集标签 | 30条×1列 |
3.3 随机种子的重要性
| 情况 | 结果 |
|---|---|
| 不指定random_state | 每次划分结果不同(随机种子为当前时间毫秒值) |
| 指定random_state | 每次划分结果固定一致 |
为什么需要固定随机种子:
- 保证实验可复现
- 便于对比不同模型的效果
- 避免因数据划分不同导致的分析偏差
random_state的值可任意指定(如23、100等),不同值对应不同的划分方案。
4 数学原理与推导
本课无数学推导。
5 代码示例
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
def dm03_split_train_test():
# 1. 加载数据集
iris_data = load_iris()
# 2. 按照8:2的比例切分训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(
iris_data.data, # 特征数据
iris_data.target, # 标签数据
test_size=0.2, # 测试集比例20%
random_state=23 # 随机种子(固定后每次结果一致)
)
# 3. 打印切分后的结果
print("训练集的特征:", len(x_train)) # 120
print("训练集的标签:", len(y_train)) # 120
print("测试集的特征:", len(x_test)) # 30
print("测试集的标签:", len(y_test)) # 30
if __name__ == '__main__':
dm03_split_train_test()
输出:
训练集的特征: 120
训练集的标签: 120
测试集的特征: 30
测试集的标签: 30
6 重难点与易错提醒
- ❗重点:train_test_split返回值为元组,按x_train, x_test, y_train, y_test顺序接收。
- ❗重点:random_state固定后,每次划分结果一致,保证实验可复现。
- ❗重点:test_size=0.2表示20%数据作为测试集,80%作为训练集。
- ⚠️易错:不指定random_state时,每次运行结果不同(随机种子为当前时间)。
- ⚠️易错:返回值顺序是x_train, x_test, y_train, y_test,不要写反。
- 💡深入理解:random_state的值可任意指定,不同值对应不同的划分方案。
7 课堂问答精选
Q: 为什么需要固定随机种子?
A: 如果不固定随机种子,每次运行程序时数据划分结果都不同(随机种子为当前时间毫秒值),导致无法复现实验结果,也不便对比不同模型的效果。固定随机种子后,每次划分结果一致,保证实验可复现。
Q: random_state的值必须写23吗?
A: 不是。random_state的值可以任意指定(如23、100、42等),不同值对应不同的划分方案。写23只是因为班级是23期,实际开发中可以写任意值。
8 本课小结
- train_test_split用于切分训练集和测试集,位于sklearn.model_selection。
- 参数:特征数据、标签数据、test_size(测试集比例)、random_state(随机种子)。
- 返回值:x_train, x_test, y_train, y_test(元组顺序)。
- 固定random_state可保证每次划分结果一致,实验可复现。
9 延伸思考与实践
- 实践:修改test_size为0.3,观察训练集和测试集数量变化。
- 思考:为什么返回值顺序是x_train, x_test, y_train, y_test?
- 预习:鸢尾花案例的模型训练、评估和预测。