机器学习数据工程之基石:论数据集划分之道与sklearn实践

机器学习数据工程之基石:论数据集划分之道与sklearn实践

  • [一、 数据集划分:机器学习工程的"定盘星"](#一、 数据集划分:机器学习工程的“定盘星”)
    • [1.1 经典三分法:训练集、验证集与测试集](#1.1 经典三分法:训练集、验证集与测试集)
    • [1.2 常用划分比例](#1.2 常用划分比例)
    • [1.3 进阶之法:交叉验证(Cross-Validation)](#1.3 进阶之法:交叉验证(Cross-Validation))
  • [二、 sklearn利器:化理论为实践的桥梁](#二、 sklearn利器:化理论为实践的桥梁)
    • [2.1 基础划分:`train_test_split`](#2.1 基础划分:train_test_split)
    • [2.2 高级武器:交叉验证生成器与执行器](#2.2 高级武器:交叉验证生成器与执行器)
    • [2.3 终极整合:`GridSearchCV`与`RandomizedSearchCV`](#2.3 终极整合:GridSearchCVRandomizedSearchCV)
  • [三、 应用案例:鸢尾花分类项目流程演示](#三、 应用案例:鸢尾花分类项目流程演示)
  • 结语

夫机器学习之成,首在数据;数据之用,贵在划分。若划分失当,则模型如盲人摸象,或过拟合而失泛化,或欠拟合而难精进。故曰:"工欲善其事,必先利其器;器欲尽其用,必先明其法。" 今撰此文,详述数据集划分之要义,并辅以scikit-learn(sklearn)之利器,以飨读者。


一、 数据集划分:机器学习工程的"定盘星"

数据集划分,非随意切割也,乃为评估模型泛化能力之关键步骤。其核心思想在于:将可用数据分割为互不相交的子集,用于模型训练、验证与最终测试

1.1 经典三分法:训练集、验证集与测试集

此乃最通行之法,其结构如下图所示:
原始数据集
训练集 Training Set
验证集 Validation Set
测试集 Test Set
用于模型参数学习
用于超参数调优与模型选择
用于最终模型性能评估

  • 训练集(Training Set) :模型由此窥见规律,学习参数。如匠人得良材,方可雕琢。
  • 验证集(Validation Set) :用于调整模型超参数(如学习率、树深度),或在不同模型架构间抉择。此集关乎"选择",而非"学习"
  • 测试集(Test Set) :模型训练与调优完毕后,方得一见。用于无偏估计 模型在未知数据上的表现,是衡量其泛化能力的"最终考场"。测试集绝不可用于任何形式的训练或调参,否则评估结果将过于乐观,失其公允【1†source】。

1.2 常用划分比例

比例无定法,视数据量多寡而定。常见比例如下:

数据规模 建议比例 (训练:验证:测试) 说明
大型数据集 (>100,000样本) 98 : 1 : 1 数据充沛,少量验证/测试已具统计意义。
中型数据集 (10,000 - 100,000) 70 : 15 : 15 或 80 : 10 : 10 均衡分配,兼顾学习与评估。
小型数据集 (<10,000) 需采用交叉验证 数据珍贵,宜反复利用,后文详述。

:对于类别不平衡数据,划分时需使用分层抽样,确保各子集中类别比例与原始数据集一致,避免因划分引入偏差。

1.3 进阶之法:交叉验证(Cross-Validation)

当数据量稀少时,三分法捉襟见肘。交叉验证(CV)应运而生,尤以k折交叉验证为著。其法将训练数据均分为k份("折"),依次取其一为验证集,余下k-1份为训练集,循环k次,取k次性能之平均为最终评估结果。
渲染错误: Mermaid 渲染失败: Lexical error on line 2. Unrecognized text. graph LRsubgraph "k折交叉验证流程 (以5折为例)" -----------------^

此法优势在于:充分利用有限数据,评估结果更为稳健,尤其适用于超参数调优与模型比较【1†source】。然其计算成本倍增,因需训练模型k次。


二、 sklearn利器:化理论为实践的桥梁

scikit-learn库为此提供了简洁而强大的API,使划分工作轻而易举。

2.1 基础划分:train_test_split

此函数可实现一次性的简单划分,是入门首选。

python 复制代码
from sklearn.model_selection import train_test_split
from sklearn import datasets

# 载入示例数据
X, y = datasets.load_iris(return_X_y=True)

# 进行一次划分,测试集占比30%,并设置随机种子确保可复现
X_train, X_test, y_train, y_test = train_test_split(
    X, y, 
    test_size=0.3, 
    random_state=42,  # 关键参数,确保每次划分一致
    stratify=y  # 关键参数,进行分层抽样,保持类别比例
)

print(f"训练集样本数: {X_train.shape[0]}, 测试集样本数: {X_test.shape[0]}")

代码点睛

  • test_size:可指定测试集比例或绝对数量。
  • random_state至关重要,固定此值可使每次运行划分结果相同,保证实验可复现。
  • stratify:按目标变量y进行分层抽样,处理不平衡数据之利器。

2.2 高级武器:交叉验证生成器与执行器

sklearn将交叉验证的"数据划分"与"评估过程"解耦,设计精妙。

  • 划分器(Splitter) :如KFold, StratifiedKFold,负责生成索引。

    python 复制代码
    from sklearn.model_selection import StratifiedKFold
    import numpy as np
    
    X = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
    y = np.array([0, 0, 1, 1, 1])
    
    skf = StratifiedKFold(n_splits=3, shuffle=True, random_state=42)
    for train_index, val_index in skf.split(X, y):
        print(f"训练索引: {train_index}, 验证索引: {val_index}")
        # 可根据索引获取具体数据: X_train, X_val = X[train_index], X[val_index]
  • 执行器(Evaluator) :如cross_val_score,一站式完成训练与评估。

    python 复制代码
    from sklearn.model_selection import cross_val_score
    from sklearn.ensemble import RandomForestClassifier
    
    model = RandomForestClassifier(random_state=42)
    # 使用交叉验证直接评估模型
    scores = cross_val_score(model, X, y, cv=StratifiedKFold(3), scoring='accuracy')
    print(f"交叉验证准确率: {scores.mean():.3f} (+/- {scores.std() * 2:.3f})")

2.3 终极整合:GridSearchCVRandomizedSearchCV

将交叉验证与超参数搜索完美结合,是模型调优的自动化流水线。

python 复制代码
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

# 定义参数网格
param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}
# 创建搜索对象,内部使用交叉验证评估每个参数组合
grid_search = GridSearchCV(SVC(), param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)

print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳交叉验证分数: {grid_search.best_score_:.3f}")
# 最佳模型已在完整训练集上重新训练,可直接用于测试集评估
best_model = grid_search.best_estimator_
test_score = best_model.score(X_test, y_test)
print(f"测试集分数: {test_score:.3f}")

重要提示GridSearchCV返回的best_estimator_默认会使用找到的最佳参数,在传入的全部训练数据(X_train 上重新拟合一个最终模型。因此,其best_score_是基于交叉验证的估计,而最终在独立测试集(X_test)上的评估才是泛化性能的真实反映【1†source】。


三、 应用案例:鸢尾花分类项目流程演示

以下以一个完整的微型项目流程,串联上述知识:

  1. 数据准备与初始划分 :使用train_test_split分出最终测试集。
  2. 模型选择与调优 :在训练集上,使用GridSearchCV配合交叉验证选择SVM模型的最佳参数。
  3. 最终评估:用最佳模型在从未见过的测试集上进行最终评估。
python 复制代码
# 步骤1: 数据准备与划分
X_train_val, X_test, y_train_val, y_test = train_test_split(
    X, y, test_size=0.2, stratify=y, random_state=42
)

# 步骤2: 在训练验证集上定义参数网格并进行搜索
param_grid = {'C': [0.1, 1, 10, 100], 'gamma': [1, 0.1, 0.01, 'scale']}
grid_search = GridSearchCV(
    SVC(random_state=42),
    param_grid,
    cv=StratifiedKFold(5, shuffle=True, random_state=42), # 使用5折分层CV
    scoring='accuracy',
    n_jobs=-1 # 使用所有CPU核心加速
)
grid_search.fit(X_train_val, y_train_val)

# 步骤3: 最终评估
final_model = grid_search.best_estimator_
final_accuracy = final_model.score(X_test, y_test)
print(f"项目完成!模型在独立测试集上的准确率为: {final_accuracy:.2%}")

结语

数据集划分,虽为机器学习流程之初步,实乃决定项目成败之根基。训练、验证、测试三集各司其职,犹如鼎之三足,缺一不可。交叉验证之法,善用数据,于小样本中求稳健。幸有sklearn库,API设计精良,train_test_splitcross_val_scoreGridSearchCV等工具,将理论封装为数行代码,使吾等工程师得以聚焦于模型与业务本身。

"础润而雨,月晕而风" ,数据划分之细微处,可见模型泛化之端倪。掌握此道,方能在机器学习的海洋中,扬帆远航,不至迷失。望读者诸君,勤加练习,深悟其理,则工程实践,必能事半功倍,游刃有余矣!

相关推荐
喵手15 小时前
Python爬虫零基础入门【第三章:Requests 静态爬取入门·第4节】列表页→详情页:两段式采集(90%项目都这样)!
爬虫·python·python爬虫实战·python爬虫工程化实战·python爬虫零基础入门·requests静态爬取·两段式采集
言之。15 小时前
2026 年 1 月 15 日 - 21 日国内外 AI 科技大事及热点深度整理报告
人工智能·科技
zzZ··*15 小时前
自动登录上海大学校园
python·网络协议·selenium
weisian15115 小时前
进阶篇-4-数学篇-3--深度解析AI中的向量概念:从生活到代码,一文吃透核心逻辑
人工智能·python·生活·向量
这儿有一堆花15 小时前
AI视频生成的底层逻辑与技术架构
人工智能·音视频
写代码的【黑咖啡】15 小时前
Python中的Msgpack:高效二进制序列化库
开发语言·python
Fairy要carry15 小时前
面试-Encoder-Decoder预训练思路
人工智能
杭州泽沃电子科技有限公司15 小时前
“不速之客”的威胁:在线监测如何筑起抵御小动物的智能防线
人工智能·在线监测
MistaCloud15 小时前
Pytorch进阶训练技巧(二)之梯度层面的优化策略
人工智能·pytorch·python·深度学习
永远都不秃头的程序员(互关)15 小时前
【决策树深度探索(一)】从零搭建:机器学习的“智慧之树”——决策树分类算法!
算法·决策树·机器学习