Python实现K折交叉验证

训练集

​  训练集(Training Dataset)是用来训练模型使用的,在机器学习的7个步骤中,训练集主要在训练阶段使用。

OJLhb6.png

验证集

  当我们的模型训练好之后,我们并不知道模型表现的怎么样,这个时候就可以使用验证集(Validation Dataset)来看看模型在新数据(验证集和测试集是不用的数据)上的表现如何。同时通过调整超参数,让模型处于最好的状态。

  验证集有2个主要的作用:

    ①评估模型效果,为了调整超参数而服务

    ②调整超参数,使得模型在验证集上的效果最好

  验证集不像训练集和测试集,它是非必需的。如果不需要调整超参数,就可以不使用验证集,直接用测试集来评估效果。验证集评估出来的效果并非模型的最终效果,主要是用来调整超参数的,模型最终的效果以测试集的评估结果为准。

OJOBQA.png

测试集

  我们通过测试集(Test Dataset)来做最终的评估。通过测试集的评估,我们会得到一些最终的评估指标:准确率、精确率、召回率、F1值等。

  三种数据集之间的关系好比:训练集相当于上课学知识;验证集相当于课后的练习题,用来纠正和强化学到的知识;测试集相当于期末考试,用来最终评估学习效果的。

数据划分

  1. 对于小规模样本集(几万量级),常用的分配比例是 60% 训练集、20% 验证集、20% 测试集
  2. 对于大规模样本集(百万级以上),只要验证集和测试集的数量足够即可,例如有 100w 条数据,那么留 1w 验证集,1w 测试集即可。1000w 的数据,同样留 1w 验证集和 1w 测试集
  3. 超参数越少,或者超参数很容易调整,那么可以减少验证集的比例,更多的分配给训练集

k 折交叉验证(k-fold cross validation)

  静态的“留出法”对数据的划分方式比较敏感,有可能不同的划分方式得到了不同的模型。“k 折交叉验证”是一种动态验证的方式,这种方式可以降低数据划分带来的影响。具体步骤如下:

  • 将数据集分为训练集和测试集,将测试集放在一边
  • 将训练集分为 k 份
  • 每次使用 k 份中的 1 份作为验证集,其他全部作为训练集
  • 通过 k 次训练后,我们得到了 k 个不同的模型
  • 评估 k 个模型的效果,从中挑选效果最好的超参数
  • 使用最优的超参数,然后将 k 份数据全部作为训练集重新训练模型,得到最终模型

OJvEqI.png

代码

from sklearn.model_selection import KFold

kf = KFold(n_splits = 5, shuffle=True, random_state=0)
for train_index, test_index in kf.split(data):
    clt = model.fit(data[train_index], four_label[train_index])
    curr_score = curr_score + clt.score(data[test_index], four_label[test_index])
    print(clt.score(data[test_index], four_label[test_index]))

avg_score = curr_score / 5
print("平均准确率为:", avg_score)

其中data为训练集数据,four_label为标签。n_splits = 5,表示进行5折交叉验证,分别计算每一次的准确率,最后求得平均准确率

参考自:训练集、验证集、测试集(附:分割方法+交叉验证) - 云+社区 - 腾讯云 (tencent.com)

猜你喜欢

转载自blog.csdn.net/CBB_FT/article/details/124677978