-1

我很抱歉我的粗心。如果您需要平衡二次采样的方法,请访问以下链接。有各种各样的答案。

Scikit-learn 平衡子采样


如何从不平衡数据中进行分层平衡抽样?

我需要解决 40 个类的分类问题。数据是从 13 个传感器实时收集的,包括 13 列(传感器数量)乘 368816 行(简单来说,就像一个时间段)。我打算把数据放到循环神经网络中。

因此,我将其标记为 0 到 40 级。数据属于0类表示进程的正常状态,其他表示异常状态和产生问题的地方。

数据由 13 列 x 368816 行组成。每行表示每个数据集。368816 个数据集中的每一个都属于 0 到 40 类。但是,它是不平衡的。属于 0 类的数据集数量为 103260,约占整个数据集的 22%。

属于其他类别的数据数量,1-40,类似。

我想从不平衡的数据中制作平衡的样本数据。例如,如果最小的类有 7000 个数据,我想采样 7000*41(nb of class) 数据。

我尝试在 scikit-learn 包中使用 StratifiedShuffleSplit 方法。脚本如下所示。

data=StratifiedShuffleSplit(n_splits=1, test_size=0.3, random_state=99)
data.get_n_splits(x_data,dummy_y)         #dummy_y means one-hot encoded y
for train_index, test_index in data.split(x_data,dummy_y):
    x_train,x_test=x_data[train_index], x_data[test_index]
    y_train,y_test=dummy_y[train_index], dummy_y[test_index]
print("nb of train data:", len(y_train), "nb of test data:", len(y_test))

如果我的采样逻辑是正确的,nb_train 和 nb_test 的总和应该小于 368816。因为我从不平衡的数据中进行了平衡采样。

但 nb_train 是 258171 而 nb_test 是 110645。

如何从不平衡数据中进行分层平衡抽样?

我尝试了scikit-learn方法中的Stratified Train/Test-split 。但是,我失败了。我使用的脚本如下。

x_train,x_test,y_train,y_test=train_test_split(x_data,dummy_y,stratify=y,random_state=99,test_size=0.3)
4

1 回答 1

2

您需要按照评论中的建议进行StratifiedShuffleSplit,并且您不需要对其使用交叉验证。

正如这个答案中所建议的

但是,如果一个类在数据集中没有太多代表,因为您计划对少数类进行过采样,所以在您的数据集中可能就是这种情况,那么分层抽样可能会在训练和测试集中产生与随机抽样不同的目标类分布采样可能会产生。

他还给出了分层交叉验证分层抽样之间的一些区别

希望这会有所帮助

于 2017-09-21T14:31:53.260 回答