在训练测试拆分操作(scikit)后使数据平衡?

Posted

技术标签:

【中文标题】在训练测试拆分操作(scikit)后使数据平衡?【英文标题】:Make data balanced after train test split operation (scikit)? 【发布时间】:2020-03-18 08:38:31 【问题描述】:

我遇到了一个问题,将我的数据分成训练和测试数据后,我的测试集中完全缺少一个类。

Example on 60/40 split: <br/>
Training: 'Orange', 0,0,0, 'Orange' <br/>
Testdata: 0,0,0,0,0 

显然“橙色”这个词不包含在测试集中。如何确保拆分考虑到至少一些目标样本包含在测试集和训练集中?我以为 stratify 参数可以做到这一点,但不幸的是没有。

【问题讨论】:

train_test_splitstratify 输入参数是要走的路。请参阅我的答案以获取示例 【参考方案1】:

1.使用下面来拆分您的训练/测试数据 - 这使用 train_test_split 的分层选项

   from sklearn.model_selection import train_test_split 
   train, test = train_test_split(X, test_size=0.25, stratify=y) 

2.或者您可以尝试使用 - stratified K fold 这将应用 k 折交叉验证

【讨论】:

【参考方案2】:

当您使用不平衡的数据集时,我强烈建议您不要手动调整类中的平衡并改为运行交叉验证:https://scikit-learn.org/stable/modules/cross_validation.html

这将为您提供未来的稳定参数和更好的结果。这个想法是,您在不同的折叠上运行,并且训练和测试数据会发生变化,您的参数也会因此而调整。

一个小例子:

from sklearn.model_selection import cross_val_score
clf = svm.SVC(kernel='linear', C=1) #your classifier
scores = cross_val_score(clf, X, y, cv=5) #Assumming your features are X, and target is y

【讨论】:

【参考方案3】:

您可以根据类别将数据分成两组:

Group1: 'Orange', 'Orange'
Group2: 0,0,0,0,0,0,0,0

在每个组内进行拆分,然后像这样将它们重新组合在一起。

mylist = [''Orange',0,0,0 ,'Orange',...]
Oranges = mylist[mylist=='Orange'] 
zeros = mylist[mylist==0]
orange_data = [O.X for O in Oranges]
orange_label = [O.y for o in Oranges]
Orange_data_train, orange_data_test, orange_label_train, orange_label_test = train_test_split(orange_data, orange_labels) 

然后对零做同样的事情并将它们放在一起:

training_data = Orange_data_train + zero_data_train

请注意,如果类具有相似的样本量,许多分类算法效果最好,但这是另一个主题。

【讨论】:

【参考方案4】:

使用train_test_splitstratify 输入参数:

import numpy as np
from sklearn.model_selection import train_test_split
X = np.arange(100).reshape((25, 4))
y= [0,1,2,3,4] * 5

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y)

print(y_train)
print(y_test)

[0, 4, 1, 4, 3, 2, 1, 1, 0, 4, 0, 2, 4, 3, 1, 2, 3]
[1, 4, 3, 2, 0, 0, 2, 3]

【讨论】:

以上是关于在训练测试拆分操作(scikit)后使数据平衡?的主要内容,如果未能解决你的问题,请参考以下文章

训练测试拆分后不平衡数据的欠采样

没有 scikit-learn 的分层训练/验证/测试拆分

scikit learn 的训练测试拆分导致训练数据中只有一个唯一值的特征

Scikit-Learn One-hot-encode 在训练/测试拆分之前或之后

在 Python Scikit-Learn 中训练测试拆分得分高但 CV 得分低

scikit-learn 中的分层训练/验证/测试拆分