预测全零

我开发了一个用于分类的神经网络,准确率达到了0.93,但问题是我预测的所有结果都是零,因为数据的分布所致。

数据分布

我该如何解决这个问题?我是否应该从神经网络改用其他算法?

提前感谢

编辑:我刚检查了一下,我的模型对每一行预测的概率都是相同的。

该模型是一个具有5层的NN,并使用tf.nn.relu6作为激活函数。成本函数是tf.nn.sigmoid_cross_entropy_with_logits

为了预测值,我使用的是:

predicted = tf.nn.sigmoid(Z5)correct_pred = tf.equal(tf.round(predicted), Y)accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

编辑2

我已经“解决”了类别不平衡问题(对0和1进行了欠采样和过采样),但网络仍然对每一行预测相同的值:

预测

我尝试将激活函数改为tanh或sigmoid,但结果输出了NaN值


回答:

对于不平衡数据,有多种解决方案。但首先,准确率并不是评估不平衡数据的好指标,因为如果你只有5个正例和95个负例,你的准确率将是95%地预测负例。你应该检查敏感性和特异性,或者其他适用于不平衡数据的指标,如LIFT分数

要用不平衡数据训练模型,有多种解决方案。其中之一是上采样少数类

上采样是随机复制少数类观察结果以增强其信号的过程。

你可以使用如下代码进行数据上采样:

from sklearn.utils import resample# 分离多数类和少数类df_majority = df[df.balance==0]df_minority = df[df.balance==1]# 上采样少数类df_minority_upsampled = resample(df_minority,                                  replace=True,     # 替换抽样                                 n_samples=576,    # 匹配多数类                                 random_state=123) # 可重现结果# 合并多数类与上采样的少数类df_upsampled = pd.concat([df_majority, df_minority_upsampled])# 显示新类别计数df_upsampled.balance.value_counts()# 1    576# 0    576# Name: balance, dtype: int64

你可以在这里找到更多信息和其他详细解释的解决方案 这里

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中创建了一个多类分类项目。该项目可以对…

发表回复

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