在训练测试拆分操作(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_split
和 stratify
输入参数是要走的路。请参阅我的答案以获取示例
【参考方案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_split
和stratify
输入参数:
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 One-hot-encode 在训练/测试拆分之前或之后