Keras 神经网络只能从二元类预测一类

Keras 神经网络只能从二元类预测一类,keras,neural-network,classification,mlp,Keras,Neural Network,Classification,Mlp,我的任务是在工厂里学习有缺陷的物品。这意味着,我试图检测有缺陷的商品或优质商品。这导致了一个问题,即一个类别主导其他类别(一个类别占99.7%的数据),因为缺陷项目非常罕见。训练精度为0.9971,验证精度为0.9970。听起来很神奇。 但问题是,该模型只预测一切都是0级,这是好货。也就是说,它没有对任何有缺陷的货物进行分类。 我怎样才能解决这个问题?我已经检查了其他问题并进行了尝试,但我仍然有这种情况。总数据点为122400行和5个特征 最后,我的测试集混淆矩阵是这样的 array([[305

我的任务是在工厂里学习有缺陷的物品。这意味着,我试图检测有缺陷的商品或优质商品。这导致了一个问题,即一个类别主导其他类别(一个类别占99.7%的数据),因为缺陷项目非常罕见。训练精度为0.9971,验证精度为0.9970。听起来很神奇。 但问题是,该模型只预测一切都是0级,这是好货。也就是说,它没有对任何有缺陷的货物进行分类。 我怎样才能解决这个问题?我已经检查了其他问题并进行了尝试,但我仍然有这种情况。总数据点为122400行和5个特征

最后,我的测试集混淆矩阵是这样的

array([[30508,     0],
       [   92,     0]], dtype=int64)
这工作做得很糟糕

我的代码如下:

le = LabelEncoder()
y = le.fit_transform(y)



ohe = OneHotEncoder(sparse=False)
y = y.reshape(-1,1)
y = ohe.fit_transform(y)


scaler = StandardScaler()
x = scaler.fit_transform(x)


x_train, x_test, y_train, y_test = train_test_split(x,y,test_size = 0.25, random_state = 777) 




#DNN Modelling


epochs = 15
batch_size =128
Learning_rate_optimizer = 0.001



model = Sequential() 

model.add(Dense(5, 
                kernel_initializer='glorot_uniform',
                activation='relu', 
                input_shape=(5,)))  

model.add(Dense(5,
                kernel_initializer='glorot_uniform', 
                activation='relu'))   
model.add(Dense(8,
                kernel_initializer='glorot_uniform', 
                activation='relu'))

model.add(Dense(2,
                kernel_initializer='glorot_uniform', 
                activation='softmax')) 



model.compile(loss='binary_crossentropy',
              optimizer=Adam(lr = Learning_rate_optimizer), 
              metrics=['accuracy']) 


history = model.fit(x_train, y_train,
                    batch_size=batch_size, 
                    epochs=epochs,  
                    verbose=1, 
                    validation_data=(x_test, y_test))



y_pred = model.predict(x_test)

confusion_matrix(y_test.argmax(axis=1), y_pred.argmax(axis=1)) 

谢谢

听起来您的数据集高度不平衡,模型只学习如何对优质商品进行分类。 您可以尝试以下列出的方法之一:

最好的尝试是首先获取两个类几乎相等的数据部分,将它们分成训练测试val,训练分类器,并对完整的数据集进行彻底的测试。您还可以尝试对其他集合使用数据扩充技术,以从同一集合中获取更多数据。继续迭代,甚至尝试更改损失函数以适应您的情况。

您的数据不平衡。尝试在model.fit中使用类权重并检查结果