当前位置: 首页 > news >正文

用鸢尾花数据集实战:5分钟搞定sklearn数据划分,附Jupyter Notebook完整代码

鸢尾花数据集实战:5分钟掌握sklearn数据划分技巧

第一次接触机器学习时,最让人头疼的往往不是算法本身,而是如何正确处理数据。记得我刚开始学习时,花了整整一个下午才搞明白怎么把数据集分成训练集和测试集。现在,让我们用最简单的鸢尾花数据集,带你快速上手sklearn的数据划分功能。

1. 环境准备与数据加载

在开始之前,确保你的Python环境中已经安装了以下库:

pip install numpy pandas scikit-learn jupyter

打开Jupyter Notebook,我们首先导入必要的库并加载鸢尾花数据集:

from sklearn.datasets import load_iris import pandas as pd # 加载数据集 iris = load_iris()

鸢尾花数据集是机器学习中最经典的数据集之一,包含150个样本,每个样本有4个特征:

  1. 萼片长度(cm)
  2. 萼片宽度(cm)
  3. 花瓣长度(cm)
  4. 花瓣宽度(cm)

这些特征对应三种鸢尾花的类别标签(0:山鸢尾,1:变色鸢尾,2:维吉尼亚鸢尾)。我们可以用pandas查看前5个样本:

df = pd.DataFrame(iris.data, columns=iris.feature_names) df['target'] = iris.target df.head()

2. 理解数据划分的重要性

在机器学习中,我们通常不会使用全部数据来训练模型。原因很简单:我们需要一些"没见过"的数据来评估模型的真实表现。这就好比考试前,老师不会把考题直接给你背,而是留一部分题目作为真正的测试。

数据划分的基本原则:

  • 训练集:用于模型训练,通常占70-80%
  • 验证集:用于调参和模型选择(可选)
  • 测试集:用于最终评估,通常占20-30%

注意:测试集应该只用于最终评估,不要在调参过程中反复使用,否则会导致评估结果过于乐观。

3. 使用train_test_split进行数据划分

sklearn的train_test_split函数是最常用的数据划分工具。让我们看看它的基本用法:

from sklearn.model_selection import train_test_split # 基本划分 X_train, X_test, y_train, y_test = train_test_split( iris.data, # 特征数据 iris.target, # 标签数据 test_size=0.2, # 测试集比例 random_state=42 # 随机种子 ) print(f"训练集样本数: {len(X_train)}") print(f"测试集样本数: {len(X_test)}")

关键参数说明:

参数说明默认值
test_size测试集比例0.25
random_state随机种子None
shuffle是否打乱数据True
stratify是否分层抽样None

实际项目中,我强烈建议设置random_state,这样可以确保每次运行结果一致,便于调试和复现。

4. 高级划分技巧

4.1 分层抽样

当数据类别分布不均衡时,简单的随机划分可能导致某些类别在训练集或测试集中代表性不足。这时可以使用分层抽样:

X_train, X_test, y_train, y_test = train_test_split( iris.data, iris.target, test_size=0.2, stratify=iris.target, # 按标签分层 random_state=42 )

4.2 多输出划分

如果你的数据有多个输出(比如多标签分类),train_test_split也能处理:

# 假设我们有两个输出 import numpy as np y2 = np.random.randint(0, 2, size=len(iris.target)) X_train, X_test, y_train, y_test, y2_train, y2_test = train_test_split( iris.data, iris.target, y2, test_size=0.2, random_state=42 )

4.3 时间序列数据划分

对于时间序列数据,我们通常不希望打乱顺序:

X_train, X_test, y_train, y_test = train_test_split( iris.data, iris.target, test_size=0.2, shuffle=False # 不打乱顺序 )

5. 完整示例代码

下面是一个完整的Jupyter Notebook示例,包含了数据加载、划分和简单可视化:

# 完整代码示例 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split import pandas as pd import matplotlib.pyplot as plt # 加载数据 iris = load_iris() df = pd.DataFrame(iris.data, columns=iris.feature_names) df['target'] = iris.target # 数据划分 X_train, X_test, y_train, y_test = train_test_split( iris.data, iris.target, test_size=0.2, stratify=iris.target, random_state=42 ) # 可视化类别分布 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4)) df['target'].value_counts().plot(kind='bar', ax=ax1, title='原始数据分布') pd.Series(y_train).value_counts().plot(kind='bar', ax=ax2, title='训练集分布') plt.show() print("训练集形状:", X_train.shape) print("测试集形状:", X_test.shape)

运行这段代码,你会看到原始数据和训练集的类别分布对比,确保划分后的数据保持了原始分布。

6. 常见问题与解决方案

在实际项目中,数据划分可能会遇到各种问题。以下是我总结的一些常见情况及解决方法:

问题1:数据集太小,划分后训练样本不足

解决方案:

  • 使用交叉验证代替简单划分
  • 尝试数据增强技术
  • 调整test_size参数,减少测试集比例

问题2:类别极度不均衡

解决方案:

  • 使用分层抽样(stratify参数)
  • 考虑过采样或欠采样技术
  • 使用类别权重参数

问题3:特征和标签不在同一个DataFrame中

解决方案:

# 假设features和labels是两个独立的DataFrame X_train, X_test, y_train, y_test = train_test_split( features.values, # 转换为numpy数组 labels.values.ravel(), # 确保是一维数组 test_size=0.2 )

问题4:需要划分多个数据集

解决方案:

# 划分训练、验证、测试集 X_train, X_temp, y_train, y_temp = train_test_split( X, y, test_size=0.4, random_state=42 ) X_val, X_test, y_val, y_test = train_test_split( X_temp, y_temp, test_size=0.5, random_state=42 )

7. 实际应用建议

经过多个项目的实践,我发现这些技巧特别有用:

  1. 保持一致性:在整个项目中固定random_state值,确保每次运行结果一致
  2. 尽早划分:在数据探索前就划分好测试集,避免数据泄露
  3. 考虑业务场景:某些场景可能需要按时间划分(如预测未来数据)
  4. 文档记录:记录划分比例、随机种子等参数,便于复现

对于初学者,我建议先从简单的划分开始,等熟悉基本流程后,再尝试更复杂的交叉验证方法。记住,数据划分是机器学习工作流中最基础的步骤之一,但也是最容易出错的地方。

http://www.jsqmd.com/news/679959/

相关文章:

  • 2026年比较好的运动木地板定制优质厂家推荐榜 - 品牌宣传支持者
  • 告别双for循环!用NumPy的np.where()函数6倍速搞定医学图像分割可视化(附Synapse数据集实战代码)
  • 如何在 Discord.py 中限制按钮仅由特定角色用户点击
  • 隐写术渗透攻防全谱系解析:从 LSB 像素隐写到 AI 生成式隐写,原理・实战・防御・未来趋势
  • 别再只用summary-method算总计了!手把手教你用Element UI的el-table实现多行动态统计(含后端数据绑定)
  • 【独家首发】微软Build 2026内部泄露PPT节选:C# 14 AOT对Dify客户端冷启动耗时的影响建模(含真实POC数据集)
  • 手把手教你用Docker Compose在Ubuntu 22.04上部署LangSmith监控平台(含PostgreSQL+Redis+ClickHouse配置)
  • 2026冰袋生产厂家选购维度深度解析:冰袋生产厂家/大号加厚泡沫箱/生物医用泡沫箱/干冰配送/泡沫箱生产厂家/选择指南 - 优质品牌商家
  • iLQR vs DDP实战选型指南:自动驾驶场景下,到底该用哪个?
  • 2026 保姆级教程:4GB 显存微调 7B 大模型 LoRA 与 QLoRA 原理 + 完整代码 + 工业级部署
  • Python操作Minio避坑指南:从‘ImportError’到生产环境部署的8个常见问题
  • 企业AI转型最大的障碍是什么?
  • STM32F407上,用CubeMX和HAL库搞定FreeRTOS+FreeModbus从机(附环形队列优化串口)
  • 保姆级教程:用‘差分计数’这道题,彻底搞懂算法竞赛中的‘桶’与哈希表优化
  • AI 时代程序员必备:提示词工程高级技巧与实战模板全攻略(2026.4最新)
  • 如何分析enq- TM - contention_外键未建索引导致的表级锁阻塞
  • 从天线设计到声学分析:手把手教你用Python贝塞尔函数解决5个经典工程问题
  • 微积分基本定理实战:5个常见积分上限函数求导案例解析
  • 2026金属舵机选购指南:航模车模舵机/舵机云台/舵机公司/舵机厂家/舵机定制/舵机精度/转台舵机/转向能机/金属舵机/选择指南 - 优质品牌商家
  • 告别混乱提示!用SE91消息类统一管理你的SAP Fiori/ABAP程序用户交互
  • 海康iSC平台API对接门禁权限,别再乱调接口了!四种场景保姆级调用流程与避坑指南
  • 智能茅台预约系统:解放双手的自动化解决方案完全指南
  • 如何在响应式网页中精准居中表单(CSS绝对定位 + transform技巧)
  • 兔抗MLL1抗体亲和纯化,批次间稳定,低背景,高信噪比
  • 从战场到物流:多无人机路径规划中的A*、RRT和MPC到底该怎么选?
  • 从Victim Cache到CAM:深入ARM A78 CPU,看现代处理器如何‘抢救’Cache Miss
  • RTKLIB数据处理全流程实战:从观测文件下载到RTKPOST解算出图
  • 如何在 Go 方法中正确修改切片类型
  • 兔抗ASH2抗体亲和纯化,四平台验证,满足表观遗传学全流程需求
  • 别再乱设random.seed了!PyTorch模型可复现性实战指南(附完整代码)