如何在保持类别比例的情况下将数据集拆分为训练集和验证集?

我有一个多类分类问题,我的数据库是倾斜的,例如,我有一个特定类别的100个实例,而另一个类别只有10个实例,所以我想在拆分数据集时保持类别之间的比例。如果我有一个特定类别的100个实例,并且我想让30%的记录进入训练集,那么我希望在训练集中有这个100个记录类别的30个实例,以及那个10个记录类别的3个实例,依此类推。


回答:

你可以使用sklearn的StratifiedKFold,根据在线文档说明:

分层K折交叉验证迭代器

提供训练/测试索引以将数据拆分为训练测试集。

这种交叉验证对象是KFold的一种变体,它返回分层折叠。折叠是通过保持每个类别的样本百分比来制作的。

>>> from sklearn import cross_validation>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])>>> y = np.array([0, 0, 1, 1])>>> skf = cross_validation.StratifiedKFold(y, n_folds=2)>>> len(skf)2>>> print(skf)  sklearn.cross_validation.StratifiedKFold(labels=[0 0 1 1], n_folds=2,                                         shuffle=False, random_state=None)>>> for train_index, test_index in skf:...    print("TRAIN:", train_index, "TEST:", test_index)...    X_train, X_test = X[train_index], X[test_index]...    y_train, y_test = y[train_index], y[test_index]TRAIN: [1 3] TEST: [0 2]TRAIN: [0 2] TEST: [1 3]

这将保持你的类别比例,使拆分保留类别比例,这对于pandas数据框也适用。

正如@Ali_m建议,你可以使用StratifiedShuffledSplit,它接受一个拆分比例参数:

sss = StratifiedShuffleSplit(y, 3, test_size=0.7, random_state=0)

将产生70%的拆分比例。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

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