在火车测试拆分操作(scikit)之后使数据平衡吗?

时间:2019-11-22 09:42:10

标签: python scikit-learn classification

我遇到的问题是,将我的数据分为训练和测试数据后,我的测试集中完全没有一个类。

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

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

4 个答案:

答案 0 :(得分: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倍交叉验证

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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]

答案 3 :(得分:0)

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

enter image description here

这将为您将来提供稳定的参数,并获得更好的结果。想法是,您在不同的褶皱处奔跑,火车和测试数据不断变化,因此您的参数正在调整。

一个小例子:

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