【问题标题】:Oversampling Using SMOTE Removes a Label Category from y_train使用 SMOTE 过采样从 y_train 中删除标签类别
【发布时间】:2020-11-01 12:08:27
【问题描述】:

我通过使用具有 86% 正类样本和 14% 负类样本的不平衡数据集来使用 LSTM 进行情感分析。这是一个非常小的数据集,包含 472 个句子,但它们使用的是区域语言。 train_test_split 比率为 0.3。 我在实施中有两个问题:

1:训练和验证的准确性在整个过程中保持不变(没有 SMOTE)。 2:使用 SMOTE 进行过采样时,y_train 在过采样的 y_train.shape 中仅显示 1 个标签

from imblearn.over_sampling import SMOTE

ros = SMOTE()

X_train_oversample, y_train_oversample = ros.fit_sample(X_train_pad, y_train)

print(X_train_pad.shape)
print(X_train_oversample.shape)

print(y_train.shape)
print(y_train_oversample.shape)

y_train 的结果:

X_train_pad.shape                   (331, 832)
X_train_oversample.shape            (570, 832)
y_train.shape                       (331, **2**)
y_train_oversample.shape            (570, **1**)

但是,数据的实际形状如下:

Shape of X_train_pad tensor (331, 832)
Shape of y_train tensor (331, 2)
Shape of X_test_pad tensor (141, 832)
Shape of y_test tensor (141, 2)

因此,LSTM 训练给出错误信息

ValueError: Error when checking target: expected dense_1 to have shape (2,) but got array with shape (1,)

【问题讨论】:

    标签: machine-learning deep-learning sentiment-analysis oversampling smote


    【解决方案1】:

    SMOTE 的输出 y_train_oversample 没有像原来的 y 那样进行单热编码,因此您必须对其进行单热编码。如果您查看了y_train_oversample 中的值,您可能会明白这一点。

    假设它是一个 numpy 数组,您可以使用以下代码进行一次热编码。

    y_train_oversample = np.eye(2)[y_train_oversample.flatten()]
    

    请注意,我在那里进行了展平,因为如果输入 y 是矩阵,则输出将是 (n_row, 1),如果您直接对其进行热编码,则会遇到一些维度问题,因此展平是击球手先说吧。

    【讨论】:

    • 非常感谢@TYZ。解决方案奏效了。我面临的另一个问题是所有 epoch 的训练和验证准确率保持不变,并且保持 50%。如何增加?
    • @ErumKazi 这个问题太具体了,和你掌握的数据密切相关。我没有答案,不应该在这里处理。最好去stats.stackexchange.com问这样的问题。
    猜你喜欢
    • 2018-12-02
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 2018-12-27
    • 2018-07-05
    • 2015-10-29
    相关资源
    最近更新 更多