【问题标题】:Huge disparity in classification prediction results in CNN model KerasCNN模型Keras中分类预测结果的巨大差异
【发布时间】:2020-05-31 21:47:54
【问题描述】:

我用 Keras 训练了一个 CNN 模型,其中 df921 rows x 10165 columns 每一行都是具有 10160 特征的样本。然后我使用预训练模型进行预测。

我确保训练数据平衡良好,大约 50% 的样本带有标签 0,其余 50% 的样本带有标签 1。模型准确性看起来不错,但在预测过程中存在问题。

所以输入数据是这样的:

X = df.iloc[:,0:10160]  
X = X.to_numpy()                      
X = X.reshape([X.shape[0], X.shape[1],1]) 
X_train_1 = X[:,0:10080,:]
X_train_2 = X[:,10080:10160,:].reshape(921,80)      
Y = df.iloc[:,10163:10165]
Y = Y.to_numpy()

我用代码预测了带有预测标签“1”(label_1)的样本数:

prediction = pd.DataFrame(model.predict([X_train_1,X_train_2])) 
prediction['label_1'] = ['0' if x < 0.5 else '1' for x in prediction['prob']]

prediction[prediction['label_1'] == '1'].shape[0]/921

第二行代码计算所有样本中label_1 ==1 的样本比例。问题是,鉴于输入数据具有平衡的10 数量,我预计该分数约为 50% 左右,但计算出的分数介于0.08~0.98 之间(如果不是更极端)具有巨大的差异。可能出了什么问题?

【问题讨论】:

  • 你是怎么在prediction = pd.DataFrame(model.predict([X_train_1,X_train_2]))之后得到prediction['prob']的?它的结果应该是DataFrame,其列名中包含类名。

标签: python machine-learning keras prediction conv-neural-network


【解决方案1】:

请改用model.predict_classes()。否则你会得到概率。

prediction = pd.DataFrame(model.predict_classes([X_train_1,X_train_2])) 
prediction[prediction['label_1'] == '1'].shape[0]/921

如果您使用的是函数式 API,请使用 np.argmax()

np.argmax(model.predict([X_train_1,X_train_2]), axis=1)

然后你需要你需要的预测,作为 0 和 1 而不是概率。

【讨论】:

  • 您好 Nicolas,感谢您的回答。代码返回AttributeError: 'Model' object has no attribute 'predict_classes' 我猜是因为我使用Model 而不是Sequential 类..
  • 嗨 Nicolas,代码有效,但我认为问题仍然存在。如果概率> 0.5,我实际上定义了1,否则定义0。使用您的方法,它返回Counter({0: 921}),这意味着有921 个0 和0 个1,这是我主要关心的问题,因为01 的数量严重不平衡..希望这能稍微解释一下我的问题更清晰。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 2018-10-10
  • 2020-10-14
  • 2018-11-03
  • 2023-04-11
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多