scikit-learn中的StratifiedKFold与KFold

我使用以下代码来测试KFoldStratifiedKFold

import numpy as npfrom sklearn.model_selection import KFold,StratifiedKFoldX = np.array([    [1,2,3,4],    [11,12,13,14],    [21,22,23,24],    [31,32,33,34],    [41,42,43,44],    [51,52,53,54],    [61,62,63,64],    [71,72,73,74]])y = np.array([0,0,0,0,1,1,1,1])sfolder = StratifiedKFold(n_splits=4,random_state=0,shuffle=False)floder = KFold(n_splits=4,random_state=0,shuffle=False)for train, test in sfolder.split(X,y):    print('Train: %s | test: %s' % (train, test))print("StratifiedKFold done")for train, test in floder.split(X,y):    print('Train: %s | test: %s' % (train, test))print("KFold done")

我发现StratifiedKFold能够保持标签的比例,而KFold则不能。

Train: [1 2 3 5 6 7] | test: [0 4]Train: [0 2 3 4 6 7] | test: [1 5]Train: [0 1 3 4 5 7] | test: [2 6]Train: [0 1 2 4 5 6] | test: [3 7]StratifiedKFold doneTrain: [2 3 4 5 6 7] | test: [0 1]Train: [0 1 4 5 6 7] | test: [2 3]Train: [0 1 2 3 6 7] | test: [4 5]Train: [0 1 2 3 4 5] | test: [6 7]KFold done

看起来StratifiedKFold更好,那么KFold就不应该使用了吗?

在什么情况下应该使用KFold而不是StratifiedKFold


回答:

我认为你应该问“在什么情况下应该使用StratifiedKFold而不是KFold?”。

你需要先了解什么是“KFold”和“Stratified”。

KFold是一种将数据集划分为k个部分的交叉验证器。

Stratified确保数据集的每个部分都具有相同比例的特定标签的观察值。

因此,这意味着StratifiedKFoldKFold的改进版本

所以,这个问题的答案是在处理类别分布不平衡的分类任务时,我们应该优先选择StratifiedKFold而不是KFold


例如

假设有一个包含16个数据点的数据集,并且类别分布不平衡。在该数据集中,12个数据点属于类别A,其余(即4个)属于类别B。类别B与类别A的比例为1/3。如果我们使用StratifiedKFold并设置k = 4,那么在每次迭代中,训练集将包括来自类别A的9个数据点和来自类别B的3个数据点,而测试集将包括来自类别A的3个数据点和来自类别B的一个数据点。

正如我们所见,StratifiedKFold在划分中保留了数据集的类别分布,而KFold则不考虑这一点。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注