从不平衡数据中分层平衡抽样(机器学习)

Stratified balanced sampling from unbalanced data (Machine learning)

我很抱歉我的粗心大意。如果您需要平衡子采样的方法,请访问下面的link。有各种各样的答案。

Scikit-learn balanced subsampling


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

我需要解决 40 classes 的 classification 问题。数据是从13个传感器实时采集的,包括13列(传感器数量)×368816行(简单来说,就像一个时间段)。我打算将数据放入递归神经网络。

所以,我将其标记为 0 到 40 class。属于0的数据class代表进程正常状态,其他代表异常状态和出问题的地方。

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

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

我想从不平衡的数据中得到一个平衡的样本数据。例如,如果最小的 class 有 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.

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

我尝试了方法。但是,我失败了。我使用的脚本如下。

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

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

this 答案中的建议

But if one class isn't much represented in the data set, which may be the case in your dataset since you plan to oversample the minority class, then stratified sampling may yield a different target class distribution in the train and test sets than what random sampling may yield.

他还给出了Stratified Cross Validation and stratified sampling

之间的一些区别

希望这会有所帮助