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

机器学习数据预处理:数据拆分

机器学习数据预处理:数据拆分(超通俗完整版)

数据拆分是把数据集分成训练集、验证集、测试集,让模型“学、调、考”分开,是评估模型真实能力的必做步骤,本科/研究生入门必看、面试常考。


一、什么是数据拆分?为什么必须拆?

1. 一句话理解

把全部数据分成互不重叠的几部分,分别用来训练模型、调参、最终打分,防止模型“作弊、死记硬背”。

2. 不拆分的后果

  • 模型在训练集上考100分(过拟合)
  • 遇到新数据一塌糊涂(泛化能力差)
  • 实验结果不可信,论文/项目不被认可

3. 三大集合职责

  • 训练集 Train:教模型知识(学)
  • 验证集 Val:调参数、选模型(练)
  • 测试集 Test:最终考试,不许偷看(考)

二、最常用拆分比例

  • 简单场景:训练 : 测试 = 8 : 2
  • 标准场景:训练 : 验证 : 测试 = 6 : 2 : 2
  • 小样本:用K折交叉验证

三、3种核心拆分方法(通俗+原理)

1. Hold-Out 随机拆分(最简单)

直接按比例随机分。

  • 优点:快、简单
  • 缺点:运气差时分布不均匀

2. 分层拆分 Stratified Split(最常用!)

类别比例拆分,保证每类数据分布一致。

  • 优点:类别不平衡数据必用
  • 缺点:仅用于分类任务

3. K折交叉验证 K-Fold CV(最稳)

把数据分成 K 份,轮流当验证集。

  • 优点:结果稳定、充分利用数据
  • 缺点:速度慢

四、核心概念(论文/面试)

  • 经验误差:模型在训练集上的误差
  • 泛化误差:模型在新数据上的真实误差
  • 数据独立同分布:训练/测试集要来自同一分布
  • 信息泄露:严禁用测试集信息参与训练

五、完整可运行代码(乳腺癌数据集)

包含:随机拆分、分层拆分、K折交叉验证、PCA可视化、模型打分。

importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimport(train_test_split,StratifiedKFold)fromsklearn.linear_modelimportLogisticRegressionfromsklearn.metricsimportaccuracy_scorefromsklearn.decompositionimportPCA# ======================# 1. 加载数据# ======================data=load_breast_cancer()X=data.data y=data.targetprint("数据形状:",X.shape)# ======================# 2. 随机拆分 6:2:2# ======================X_temp,X_test,y_temp,y_test=train_test_split(X,y,test_size=0.2,random_state=42)X_train,X_val,y_train,y_val=train_test_split(X_temp,y_temp,test_size=0.25,random_state=42)print(f"训练集:{X_train.shape}")print(f"验证集:{X_val.shape}")print(f"测试集:{X_test.shape}")# ======================# 3. PCA 可视化分布# ======================pca=PCA(n_components=2,random_state=42)X_pca=pca.fit_transform(X)plt.figure(figsize=(12,5))plt.subplot(121)plt.scatter(X_pca[y==0,0],X_pca[y==0,1],label='恶',alpha=0.7)plt.scatter(X_pca[y==1,0],X_pca[y==1,1],label='良',alpha=0.7)plt.title('全体数据分布')plt.legend()# 训练/验证/测试X_train_pca=pca.transform(X_train)X_val_pca=pca.transform(X_val)X_test_pca=pca.transform(X_test)plt.subplot(122)plt.scatter(X_train_pca[:,0],X_train_pca[:,1],label='Train',alpha=0.7)plt.scatter(X_val_pca[:,0],X_val_pca[:,1],label='Val',alpha=0.7)plt.scatter(X_test_pca[:,0],X_test_pca[:,1],label='Test',alpha=0.7)plt.title('Train/Val/Test 拆分')plt.legend()plt.show()# ======================# 4. 训练与评估# ======================model=LogisticRegression(max_iter=10000,random_state=42)model.fit(X_train,y_train)acc_val=accuracy_score(y_val,model.predict(X_val))acc_test=accuracy_score(y_test,model.predict(X_test))print(f"验证集准确率:{acc_val:.4f}")print(f"测试集准确率:{acc_test:.4f}")# ======================# 5. 分层拆分(推荐)# ======================X_temp_s,X_test_s,y_temp_s,y_test_s=train_test_split(X,y,test_size=0.2,stratify=y,random_state=42)X_train_s,X_val_s,y_train_s,y_val_s=train_test_split(X_temp_s,y_temp_s,test_size=0.25,stratify=y_temp_s,random_state=42)# 训练model_s=LogisticRegression(max_iter=10000,random_state=42)model_s.fit(X_train_s,y_train_s)acc_val_s=accuracy_score(y_val_s,model_s.predict(X_val_s))acc_test_s=accuracy_score(y_test_s,model_s.predict(X_test_s))print("\n【分层拆分】")print(f"验证集:{acc_val_s:.4f}测试集:{acc_test_s:.4f}")# ======================# 6. K折交叉验证# ======================skf=StratifiedKFold(n_splits=5,shuffle=True,random_state=42)acc_list=[]fortrain_idx,val_idxinskf.split(X,y):X_tr,X_vl=X[train_idx],X[val_idx]y_tr,y_vl=y[train_idx],y[val_idx]clf=LogisticRegression(max_iter=10000)clf.fit(X_tr,y_tr)acc_list.append(accuracy_score(y_vl,clf.predict(X_vl)))print("\n【5折交叉验证】")print(f"平均准确率:{np.mean(acc_list):.4f}")print(f"标准差:{np.std(acc_list):.4f}")plt.boxplot(acc_list)plt.title('5折交叉验证准确率')plt.show()

六、各种拆分方法对比(一张表看懂)

方法保持类别比例稳定性速度适用场景
随机拆分最快大数据量
分层拆分分类/不平衡数据
K折CV小样本
分层K折CV最高较慢小样本+不平衡
时间序列拆分时序数据

七、使用建议(工业界标准)

  1. 分类任务一律用分层拆分
  2. 数据量小 → 用分层K折
  3. 数据量大 → 用 8:2 或 6:2:2
  4. 时序数据不能随机拆,必须按时间拆
  5. 测试集只用一次,严禁反复调参

八、总结(面试速背)

  1. 数据拆分 = 训练+验证+测试,防止过拟合
  2. 分类优先分层拆分
  3. 小样本用K折,大数据直接分
  4. 测试集是最终标准,绝不参与训练
  5. 好的拆分比复杂模型更重要
http://www.cnnetsun.cn/news/2050717.html

相关文章:

  • 工业级VSCode配置泄露(仅限产线工程师内部流通):2026新内核下Modbus TCP断点调试失效的3个隐藏补丁
  • 别再只盯着VINS-Mono了!聊聊那些开源VIO项目(ORB-SLAM3、Basalt等)的实战选型与避坑心得
  • 告别Cityscapes!用IDD数据集训练你的自动驾驶语义分割模型(附完整代码与可视化教程)
  • 你的startup.s正在杀死大模型推理!20年IC老兵亲授:向量表重定向、中断嵌套抑制与cache预热三重硬核调试术
  • 3分钟搞定Figma中文界面:设计师的母语设计解决方案终极指南
  • 告别眼瞎式排查:用Log Parser 2.2快速揪出Windows服务器登录异常(附实战SQL)
  • 机器人持续学习基准LIBERO系列5——robosuite环境搭建与核心任务剖析
  • PotPlayer智能字幕翻译终极体验:告别外语观影障碍的完整解决方案
  • 【2024高频AI工程岗压轴题】:如何用Span<T> + Unsafe.As<T>零拷贝加载GGUF模型权重?(附Benchmark对比图)
  • ArcGIS JS 态势标绘教程:燕尾箭头(Swallowtail Arrow)
  • 超市收银员必看:托利多BCOM条码秤这5个设置没调好,小心月底对账出大麻烦
  • 如何高效捕获网页媒体资源:猫抓浏览器扩展的完整使用指南
  • 从‘边缘效应’聊起:用PyTorch的ReflectionPad2d和ReplicationPad2d提升你的CNN模型效果
  • 汽车音响常见全景声类别简单介绍
  • 2026最新GEO优化服务商推荐:GEO服务商哪家好
  • 3分钟快速解锁加密音乐:Unlock-Music免费浏览器解密终极指南
  • 从草图到总装:用CREO骨架模型(Skeleton)搞定复杂产品TOP-DOWN设计全流程
  • 别再手动拼接行缓存了!用Vivado的SHIFT RAM IP核,5分钟搞定3x3图像卷积窗口
  • 保姆级教程:手把手教你读懂汽车CAN总线DBC文件(附Python解析脚本)
  • 【权威发布|西门子微软联合验证】:VSCode 2026工业适配白皮书核心配置(附TIA Portal v18.0双向同步实操清单)
  • 找出1000之内的所有完数
  • real-anime-z高效生成指南:12步出图+反向提示词压制坏手糊脸技巧
  • 从“瞎推车”到“平衡大师”:一文读懂强化学习里的策略梯度法(小白也能懂)
  • 别再死记硬背了!手把手带你从磁通量Φ推导出电感L=μN²Ae
  • 别再用盗版了!手把手教你从官网下载并安装最新版SPSS(附学生版申请指南)
  • Keil5快捷键设置
  • WSL2 unbutu 调用CUDA机制
  • 从JetSnack源码实战出发:手把手教你用Immutable集合和@Stable优化Compose列表性能
  • 远程登录--浅谈
  • 精读双模态检测论文十七|法国 ONERA 宇航院原创!CVPRW CAFF-DINO !通用跨注意力融合范式,弱对齐 / 低光场景全场景 SOTA!