在CNN模型Keras中分类预测结果存在巨大差异

我使用Keras训练了一个CNN模型,数据集df921行 x 10165列,每行是一个样本,包含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.080.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,而不是概率值。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注