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

时间:2017-09-21 09:46:56

标签: machine-learning split scikit-learn balance

对不起我很抱歉。如果您需要平衡子采样的方法,请访问以下链接。有各种答案。

Scikit-learn balanced subsampling

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

我需要解决40个班级的分类问题。数据实时从13个传感器收集,其中包括13列(传感器数量)368816行(简单地说,就像一个时间段)。我计划将数据放入Recurrent Neural Network。

所以,我把它标记为0到40级。数据属于0类意味着正常的进程状态,其他意味着异常状态和产生问题的地方。

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

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

我想从不平衡数据中获取平衡的样本数据。例如,如果最小的类有7000个数据,我想抽样7000 * 41(nb类)数据。

我尝试在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)

1 个答案:

答案 0 :(得分:0)

您需要在评论中建议StratifiedShuffleSplit,并且您不需要对其进行交叉验证。

作为this 回答中的建议

  

但是如果一个类在数据集中没有多少表示,那么可能是   数据集中的情况,因为您计划对少数群体进行过采样   然后,分层抽样可以产生不同的目标类别   在列车和测试集中的分布比随机抽样可能   产率。

他还在Stratified Cross Validation stratified sampling

之间给出了一些区别

希望这会有所帮助