机器学习数据工程之基石:论数据集划分之道与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等工具,将理论封装为数行代码,使吾等工程师得以聚焦于模型与业务本身。

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

相关推荐
轻竹办公PPT2 小时前
AI生成PPT好用吗?工作总结场景下的工具排名更新
人工智能·python·powerpoint
沐知全栈开发2 小时前
MySQL 分组
开发语言
SCBAiotAigc2 小时前
bash前面的(base)实现的原理
人工智能·python·ubuntu
AI小怪兽2 小时前
YOLO-Master:基于混合专家模型加速与专用变换器的增强实时检测
人工智能·深度学习
wa的一声哭了2 小时前
内积空间 内积空间二
java·开发语言·python·spring·java-ee·django·maven
QQ_4376643142 小时前
C++ 可变参数模板、折叠表达式、泛型 Lambda 与引用折叠
开发语言·c++
Coder_Boy_2 小时前
基于SpringAI的智能AIOps项目:部署相关容器化部署管理技术
人工智能·spring boot·k8s·运维开发
Web极客码2 小时前
深入解析WordPress的functions.php文件及其高效使用方法
开发语言·php
极新2 小时前
生数科技商业化总监陈鹤天:视频生成破瓶颈,AI赋能漫剧产业|2025极新AIGC峰会演讲实录
人工智能·科技·aigc