使用Keras模型时混淆矩阵中TN和FN均为0的原因排查
问题:Keras文本分类模型混淆矩阵TN和FN均为0的原因
尝试使用Keras进行神经网络文本分类时,生成的混淆矩阵中True Negative(TN)和False Negative(FN)均为0,但使用相同数据和超参数的sklearn MLPClassifier模型无此问题。
Keras模型代码
model3 = Sequential() model3.add(Dense(300, input_dim= Train_X2_Tfidf.shape[1], activation='sigmoid')) model3.add(Dense(1, activation='sigmoid')) opt = Adam (learning_rate=0.01) model3.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy']) model3.summary() es = EarlyStopping(monitor="val_loss",mode='min',patience=10) history3 = model3.fit(Train_X2_Tfidf, Train_Y2, epochs=400, verbose=1, validation_split=0.2, batch_size=32, callbacks =[es])
Keras模型生成的混淆矩阵及相关代码
y_pred = np.argmax(model3.predict(Test_X2_Tfidf), axis=-1) print(confusion_matrix(Test_Y2, y_pred)) print(classification_report(Test_Y2, y_pred)) print('Confusion matrix:') confusion_matrix(Test_Y2, y_pred) from nltk.metrics.scores import precision import seaborn as sns import matplotlib.pyplot as plt f, ax = plt.subplots(figsize=(8,5)) sns.heatmap(confusion_matrix(Test_Y2, y_pred), annot=True, fmt=".0f", ax=ax) plt.xlabel("y_head") plt.ylabel("y_true") plt.show() cm = confusion_matrix(Test_Y2, y_pred) # 输出结果 [[186 0] [557 0]]
sklearn MLPClassifier模型的混淆矩阵
[[146 40] [ 35 522]]
问题原因及解决方法
核心问题:预测结果处理错误
你的Keras模型最后一层是Dense(1, activation='sigmoid'),这是二分类任务的标准输出形式,输出值是0到1之间的概率,代表样本属于类别1的概率。但你用了np.argmax()来获取预测标签:
- 由于模型输出是单维度数组(形状为
(样本数, 1)),np.argmax()会始终返回0(唯一元素的索引就是0),导致所有预测结果都被判定为类别0,因此混淆矩阵中第二列(预测为类别1的样本数)全为0,出现TN和FN均为0的异常结果。
正确的预测标签转换方式
应该设定一个概率阈值(通常取0.5),将概率值转换为类别标签:
y_pred_proba = model3.predict(Test_X2_Tfidf) y_pred = (y_pred_proba > 0.5).astype(int)
额外优化建议
- 调整学习率:Adam优化器的默认学习率是0.001,你设置的0.01偏高,可能导致模型训练不稳定,难以收敛到最优状态,建议降低学习率尝试。
- 更新输入层写法:使用
Input层替代input_dim参数,更符合Keras的现代API规范:model3 = Sequential() model3.add(Input(shape=(Train_X2_Tfidf.shape[1],))) model3.add(Dense(300, activation='sigmoid')) model3.add(Dense(1, activation='sigmoid'))
内容的提问来源于stack exchange,提问作者andryan86
相关产品推荐
相关产品推荐

