分层训练/测试划分,保证在强不平衡数据集上包含小类



我正在处理大规模、不平衡的数据集,需要选择分层训练集。然而,即使数据集非常不平衡,我仍然需要确保至少每个标签类在训练集中至少包含一次。sklearns train_ test_;担保;包括在内。

这里有一个例子:

import numpy as np
from sklearn.model_selection import train_test_split
X = np.arange(100).reshape((50, 2))
y = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,4,4]
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=4, random_state=42, stratify=y)
print(X_train, y_train)

结果是

[[80 81]
[48 49]
[18 19]
[30 31]] [2, 2, 1, 1]

因此,标签类3和4不包括在此训练拆分中。给定绝对train_size=4,这两个类不足以被包括在内。对于严格分层的划分,这是正确的。然而,对于较小的类,我至少需要确保算法";已经看到标签类";。因此,我需要对分层原则进行某种软化,并对较小的阶级进行某种比例包容。我已经写了很多代码来实现这一点,它首先删除较小的类,然后用比例分割分别处理它们。然而,删除后,由于班级数量/总规模的变化,这也会影响train_testrongplit。

有什么简单的函数/算法可以实现这种行为吗?

您检查过sklearn.model_selection.StratifiedKFold吗?尝试将n_folds设置为小于或等于填充最少的类中的成员数。如果有,那么我只能建议使用imbalanced-learn中的欠采样/过采样方法。

最新更新