来自不平衡数据的分层平衡采样(机器学习)[重复]

Posted

技术标签:

【中文标题】来自不平衡数据的分层平衡采样(机器学习)[重复]【英文标题】:Stratified balanced sampling from unbalanced data (Machine learning) [duplicate] 【发布时间】: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()"。 【参考方案1】:

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

如this 回答中所建议的那样

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

他还给出了Stratified Cross Validation 和stratified sampling之间的一些区别

希望这会有所帮助

【讨论】:

以上是关于来自不平衡数据的分层平衡采样(机器学习)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

机器学习之类别不平衡问题 —— 采样方法

数据不平衡的解决办法

数据不平衡不平衡采样调整分类阈值过采样欠采样SMOTEEasyEnsemble加入数据平衡的流程代价敏感学习BalanceCascade

训练测试拆分后不平衡数据的欠采样

scikit-learn 中的不平衡

python使用imbalanced-learn的RepeatedEditedNearestNeighbours方法进行下采样处理数据不平衡问题