1

我通过使用具有 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,)
4

1 回答 1

1

SMOTE 的输出y_train_oversample不会像原始文件一样进行一次热编码,y因此您必须对其进行一次热编码。如果您查看y_train_oversample.

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

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

请注意,我在此处进行了展平,因为如果输入y是矩阵,则输出将是(n_row, 1),并且如果您直接对其进行热编码,则会遇到一些维度问题,因此首先将其展平很容易。

于 2020-07-13T01:43:54.627 回答