【发布时间】:2018-03-02 14:46:03
【问题描述】:
我很抱歉我的粗心大意。如果您需要平衡二次采样的方法,请访问以下链接。有各种各样的答案。
Scikit-learn balanced subsampling
如何从不平衡数据中进行分层平衡抽样?
我需要解决 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。
如何从不平衡数据中进行分层平衡抽样?
我尝试了Stratified Train/Test-split in scikit-learn 方法。但是,我失败了。我使用的脚本如下。
x_train,x_test,y_train,y_test=train_test_split(x_data,dummy_y,stratify=y,random_state=99,test_size=0.3)
【问题讨论】:
-
你的数据在哪个数据结构中?
-
我有 13 列乘以 431116 行的数据。每行表示一个数据集。它是二维矩阵数据。每个数据集都与每个类别标签相关联。
-
所以你基本上是想拆分不平衡的数据吧?
-
如果您将StratifiedShuffleSplit 与
n_splits=1一起使用会怎样?它会起作用吗? -
我尝试使用 Vivek Kumar 推荐的方法,但在版本中不起作用。 0.18。当我使用脚本“x_train,x_test,y_train,y_test=train_test_split(x_data,y_encoded,stratify=y,random_state=99,test_size=0.3)”时,它会打印出一些错误消息,例如“TypeError:'bool'类型的对象没有 len()"。
标签: machine-learning split scikit-learn balance