python - CNN模型Keras中分类预测结果的巨大差异
问题描述
我CNN
用 Keras 训练了一个模型df
,921 rows x 10165 columns
每行是一个带有10160
特征的样本。然后我使用预训练模型进行预测。
我确保训练数据平衡良好,大约 50% 的样本带有 label 0
,其余 50% 带有 label 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
所有样本中样本的比例。问题是,鉴于输入数据具有平衡的数量1
和0
,我预计该分数约为 50% 左右,但计算出的分数介于范围0.08
~ 0.98
(如果不是更极端的话)之间存在巨大差异。可能出了什么问题?
解决方案
改为使用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 而不是概率。
推荐阅读
- regex - 正则表达式 - 在字符串中的任何位置查找 url 中的参数
- reactjs - 在函数中单击按钮时对更改文本做出反应
- flutter - Flutter 无法以文本形式显示数据
- jupyter-notebook - 访问远程服务器上的 Jupyter notebook
- css - Angular - 如何为应用程序跨组件组织 CSS 覆盖
- shell - 如何删除稍后在文件中显示为子字符串的项目?
- php - PHP,如何逐级从关联数组中获取值
- javascript - Javascript LiveValidation disable() 在复选框上不起作用
- javascript - JavaScript 在本地测试时有效,但在服务器上访问时无效
- unity3d - 将游戏对象转换为图像?