python 划分训练集——K折交叉验证

本文介绍如何使用Python和sklearn库中的StratifiedKFold进行五折交叉验证的数据集划分,确保训练集和测试集的类别分布一致,适用于监督学习任务。

首先来生成一个训练集

import pandas as pd
import numpy as np
from sklearn.model_selection import StratifiedKFold

filename_label = {'filename':[str(i)+'.jpg' for i in range(100)], 'label':[np.random.randint(0,5) for i in range(100)]}
train = pd.DataFrame(filename_label)

print(train['label'].value_counts())
'''
2    23
1    23
0    20
4    18
3    16
Name: label, dtype: int64
'''
train.head(10)

在这里插入图片描述

接下来使用 sklearn.model_selection.StratifiedKFold,把这个 CSV 文件分成 2K 个文件,即 K 个训练集加 K 个测试集:

n_splits = 5  # K
x = train['filename'].values
y = train['label'].values
skf = StratifiedKFold(n_splits=n_splits, random_state=42, shuffle=True)

for index,(train_index,test_index) in enumerate(skf.split(x,y), start=1):
    res_train = pd.DataFrame()
    res_train['filename'] = train['filename'].iloc[train_index]
    res_train['label'] = train['label'].iloc[train_index]
    res_train.to_csv("train_{}.csv".format(index),index=False)

    res_train = pd.DataFrame()
    res_train['filename'] = train['filename'].iloc[test_index]
    res_train['label'] = train['label'].iloc[test_index]
    res_train.to_csv("test_{}.csv".format(index),index=False)

在这里插入图片描述
因为是 5 折交叉验证,所以训练集和测试集的行数之比为 4:1

### 划分数据集为训练集、验证集和测试集的方法 在机器学习项目中,将数据划分训练集、验证集和测试集是一个常见的需求。以下是通过 Python 实现这一目标的具体方法。 可以利用 `train_test_split` 函数来自 `scikit-learn` 库来完成多步拆分操作。以下是一种常见的方式: #### 方法描述 首先,将整个数据集分成两部分:一部分作为初始的训练/验证组合,另一部分作为最终的测试集。接着,在剩余的数据集中进一步划分出单独的训练集和验证集[^1]。 ```python from sklearn.model_selection import train_test_split # 假设 X 是特征矩阵,y 是标签向量 X_train_val, X_test, y_train_val, 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_train_val, y_train_val, test_size=0.25, random_state=42 ) ``` 上述代码中的 `test_size` 参数定义了每次切分的比例。第一次调用时保留 80% 的数据用于后续的训练和验证,剩下 20% 数据分配给测试集;第二次调用则从这 80% 中继续提取 75% 作训练集,其余 25% 成为验证集[^2]。 这样做的好处是可以确保每类子集之间保持相对独立性,并且能够有效评估模型性能而不受单一随机抽样偏差的影响。 另外需要注意的是,如果采用简单的随机打乱方式可能会遇到某些重要特性始终未被抽取到特定组别的情况。为了避免这种情况发生,还可以考虑使用交叉验证技术如 k 交叉验证(k-fold cross-validation)。 对于更复杂的场景比如自然语言处理(NLP),当涉及到不同长度序列时,则需借助专门工具如HuggingFace提供的 DataCollator 来帮助管理batch内的padding等问题[^3]. 最后提醒一点关于超参调节方面的小技巧——虽然我们这里讨论的重点是如何分离数据而不是调整算法本身的行为模式,但是记住总是应该基于验证结果而非仅仅依靠观察训练过程来进行任何必要的更改哦!毕竟只有这样才能真正获得对未知实例预测能力更强健可靠的解决方案[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颹蕭蕭

白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值