我开发了一个用于分类的神经网络,准确率达到了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
你可以在这里找到更多信息和其他详细解释的解决方案 这里。