如何拆分具有相同类别比例的训练/测试数据集

数据挖掘 scikit-学习 熊猫 预测建模 训练
2021-10-09 02:08:56

我想知道如何将以下内容分成相等的数量

Target
0    1586
1     318

为了在数据集中有相同比例的 0 和 1 类进行训练,如果我的数据集被称为 df 并且包括 10 列,包括数字和分类。

我会考虑以下

y=df['Target']
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.1, stratify=y)

所以做一个分层,但我不知道它是否正确,如果你能确认它或提供一个替代方案,我将不胜感激。

数据样本

Fin                 Eco   Target
High percentage     12      1
Low percentage      5       0
Medium percentage   48      0
NA                  3       1
TBC                 NA      1
Low percentage      25      0
Medium percentage   12      0

我如何检查它是否实际上在我的数据集中按相等的类比例拆分?我认为训练模型的最佳方法应该是具有相等比例的 0 和 1 值。现在我有 5 次数据,目标 = 0。

2个回答

如果您想要做的是在拆分中保持相同的比例,那么您所做的就是正确的。

为了正确验证您的模型,类分布应该与不同的拆分(训练、验证、测试)保持一致。

火车测试拆分文档中,您可以找到参数:

stratifyarray-like, default=None 如果不是 None,数据以分层方式拆分,使用它作为类标签。

超越一步将是使用Stratified K-Folds cross-validator

此交叉验证对象是返回分层折叠的 KFold 的变体。通过保留每个类别的样本百分比来进行折叠。

scikit learn中还有更多的拆分技术可以使用,看看吧。

为了检查函数在做什么,只需计算拆分中的百分比:

 np.unique(y_train, return_counts=True)
 np.unique(y_val, return_counts=True)

但这会让你在整个数据中拥有相同的比例,如果你的原始标签比例是 1/5,那么你将有 1/5 的训练和 1/5 的测试

如果您想要的是具有相同比例的类 50% - 0 和 50% - 1然后有两种技术过采样和欠采样。但我不会为你的问题推荐这个。你的标签看起来相当平衡 1/5 它的比例很大。

这个库仍然有一些实现可以做到这一点

在此博客中,您可以看到不平衡数据集的概述,但您的不是。选择合适的指标更为重要。

你可以试试分层抽样法

from sklearn.model_selection import StratifiedShuffleSplit
split=StratifiedShuffleSplit(n_split=1, test_size=0.2, random_state=9)