二进制分类玩具问题

数据挖掘 分类 喀拉斯 二进制
2021-09-17 02:10:20

我正在尝试构建一个玩具模型,它可以识别两个变量之间的恒定差异:(if variable1- variable2>10 then 1 else 0).

对于任何回归模型来说,这应该是一个非常简单的任务,但我想用 NN 来解决它。然而,我构建的所有简单神经网络都不能给我超过 51% 的准确率。

这是我不明白的事情吗?

我的代码:

seed = 7
np.random.seed(seed)

x1 = np.arange(50000)
x2 = x1+10+(0.5-np.random.rand(len(x1)))
X = np.column_stack((x1,x2))

Y = (x2-x1)>10

encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)

train_X, test_X, train_y, test_y = train_test_split(
    X, Y, train_size=0.9, random_state=0)

model = Sequential()
model.add(Dense(2, input_dim=2,activation='relu'))
model.add(Dense(16, activation='relu'))
model.add(Dense(1,  activation='sigmoid'))

model.compile(optimizer=RMSprop(lr=0.001), 
  loss=binary_crossentropy, metrics=[binary_accuracy])

history = model.fit(train_X, train_y, epochs=1000, batch_size=10,
  validation_data=(test_X, test_y), verbose=1)
1个回答

您的问题是,当输入未缩放到简单范围时,神经网络效果不佳。通常的选择是缩放和偏移每一列,使其具有平均值 0 和标准偏差 1。

在你的情况下,x1x20 到 49999 和大约 10 到 50009 不等。这个输入范围会导致很多数字问题。

有了一个平衡的数据集,51% 的准确率基本上只是猜测(在实验误差范围内),所以网络什么也没学到。再试一次缩放 - 例如

x1 = (x1 - 25000) / 14433
x2 = (x2 - 25000) / 14433

我已经用这个添加测试了你的代码,它在第一个 epoch 内获得了 100% 的验证准确度。

如果您想在稍后的测试中评估其他值,您将需要以相同的方式缩放它们。

请注意,您的预测在测试时可能会偏离x1并且x2不接近 10,因为您只使用了接近 10 的示例进行训练。如果不是这种情况,网络的行为方式 - 例如对于 x1 = 100 和 x2 = 1000,或 x1 = 90 和 x2 = 15 的输入,与原始比较函数相比,可能无法很好地概括。