Python 为什么Keras的假阴性计数为负数(例如-10)?

Python 为什么Keras的假阴性计数为负数(例如-10)?,python,tensorflow,machine-learning,keras,dataset,Python,Tensorflow,Machine Learning,Keras,Dataset,我正在尝试调试一个用于文本二进制分类的keras模型,该模型的性能非常差 我关掉了所有的铃铛和哨子,我试着用两个不同的数据集(数据集的相同X数据,但不同的Y标签)来拟合它: Y0:所有Y=0 Y1:所有Y=1 每个数据集大约1K个样本 然后,我尝试多次拟合该模型,改变一些参数,如学习率、层的大小、在单词的一次热编码和整数编码表示之间切换 令人惊讶的是,该测试显示一些指标给了我错误的结果: 为什么FN计数为负数 我做了一些检查。 似乎负计数(例如:-87)会影响其他指标,如回忆(偶数>1)、

我正在尝试调试一个用于文本二进制分类的keras模型,该模型的性能非常差

我关掉了所有的铃铛和哨子,我试着用两个不同的数据集(数据集的相同X数据,但不同的Y标签)来拟合它:

  • Y0:所有Y=0
  • Y1:所有Y=1
每个数据集大约1K个样本

然后,我尝试多次拟合该模型,改变一些参数,如学习率、层的大小、在单词的一次热编码和整数编码表示之间切换

令人惊讶的是,该测试显示一些指标给了我错误的结果:

为什么FN计数为负数

我做了一些检查。 似乎负计数(例如:-87)会影响其他指标,如回忆(偶数>1)、MAE、准确度

以下是我正在运行的(简化)代码:

导入keras\u度量
默认\u内部\u激活='relu'
默认输出激活='softplus'
定义初始(自我、句子最大长度、ctx最大长度、密集特征尺寸、声音大小):
lstm_input_phrase=keras.layers.input(shape=(句子最大长度),name='L0'STC\u MyApp')
lstm_emb_phrase=keras.layers.lstm(默认的_MODEL_L1_STC_DIM,name='L1_STC_MyApp')(lstm_emb_phrase)
lstm\u emb\u phrase=keras.layers.density(默认的模型,名称为'L2\u STC\u MyApp',激活=默认的内部激活)(lstm\u emb\u phrase)
x=keras.layers.Dense(默认模型尺寸,激活=默认内部激活)(lstm\U emb\U短语)
x=keras.layers.Dense(默认模型尺寸,激活=默认内部激活)(x)
主输出=keras.layers.Dense(2,激活=默认输出\激活)(x)
self.model=keras.models.model(输入=lstm\u输入),
输出=主输出)
优化器=keras.optimizers.Adam(lr=self.LEARNING\u RATE)
compile(优化器=优化器,loss='binary\u crossentropy',metrics=['binary\u accurity',
"美",,
keras_度量精度(),
keras_metrics.recall(),
keras_度量。二进制_精度(),
keras_metrics.binary_recall(),
keras_metrics.binary_true_positive(),
keras_metrics.binary_true_negative(),
keras_metrics.binary_false_positive(),
keras_metrics.binary_false_negative())
def fit(self,x_lstm_短语,x_lstm_上下文,x_lstm_位置,x_密集,y):
x_arr=keras.preprocessing.sequence.pad_序列(x_lstm_短语)
y\u onehot=MyNN.onehot\u变换(y)
返回自我模型拟合(x_arr,
你知道吗,
批次大小=自身。批次大小,
epochs=self.max_epochs,
验证分割=自验证分割,
回调=[keras.callbacks.earlystoping(monitor='val_loss',
最小增量=0.0001,
耐心,
恢复最佳权重=真
)])
这是我从终端获得的第一部分输出的片段:

注意:这里有两个警告。我不认为这些警告会影响到这个问题。

Using TensorFlow backend.
2019-04-01 23:26:59.479064: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
WARNING:tensorflow:From [path_to_myApp]\venv\lib\site-packages\tensorflow\python\framework\op_def_library.py:263: colocate_with (f
rom tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.
WARNING:tensorflow:From [path_to_myApp]\venv\lib\site-packages\tensorflow\python\ops\math_ops.py:3066: to_int32 (from tensorflow.p
ython.ops.math_ops) is deprecated and will be removed in a future version.

 16/618 [..............................] - ETA: 38s - loss: 0.7756 - binary_accuracy: 0.5000 - mean_absolute_error: 0.5007 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 16.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00
 32/618 [>.............................] - ETA: 23s - loss: 0.7740 - binary_accuracy: 0.5000 - mean_absolute_error: 0.5000 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 32.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00
 48/618 [=>............................] - ETA: 17s - loss: 0.7725 - binary_accuracy: 0.5000 - mean_absolute_error: 0.4994 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 48.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00
 64/618 [==>...........................] - ETA: 15s - loss: 0.7711 - binary_accuracy: 0.5000 - mean_absolute_error: 0.4988 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 64.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00
 80/618 [==>...........................] - ETA: 13s - loss: 0.7697 - binary_accuracy: 0.5000 - mean_absolute_error: 0.4982 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 80.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00
 96/618 [===>..........................] - ETA: 12s - loss: 0.7682 - binary_accuracy: 0.5000 - mean_absolute_error: 0.4976 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 96.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00
112/618 [====>.........................] - ETA: 11s - loss: 0.7666 - binary_accuracy: 0.5000 - mean_absolute_error: 0.4970 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 112.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00
128/618 [=====>........................] - ETA: 10s - loss: 0.7650 - binary_accuracy: 0.5000 - mean_absolute_error: 0.4963 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 128.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00
144/618 [=====>........................] - ETA: 9s - loss: 0.7634 - binary_accuracy: 0.5000 - mean_absolute_error: 0.4956 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 144.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00 
160/618 [======>.......................] - ETA: 9s - loss: 0.7617 - binary_accuracy: 0.5000 - mean_absolute_error: 0.4949 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 160.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00
176/618 [=======>......................] - ETA: 8s - loss: 0.7600 - binary_accuracy: 0.5000 - mean_absolute_error: 0.4941 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 176.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00
192/618 [========>.....................] - ETA: 8s - loss: 0.7582 - binary_accuracy: 0.5000 - mean_absolute_error: 0.4934 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 192.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00

这是我开始得到负FN计数的时候:


256/618 [===========>..................] - ETA: 5s - loss: 0.3052 - binary_accuracy: 0.8750 - mean_absolute_error: 0.2778 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 256.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00
272/618 [============>.................] - ETA: 5s - loss: 0.2965 - binary_accuracy: 0.8824 - mean_absolute_error: 0.2791 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 272.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00
288/618 [============>.................] - ETA: 5s - loss: 0.2882 - binary_accuracy: 0.8889 - mean_absolute_error: 0.2807 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 288.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00
304/618 [=============>................] - ETA: 4s - loss: 0.2804 - binary_accuracy: 0.8947 - mean_absolute_error: 0.2828 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 304.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00
320/618 [==============>...............] - ETA: 4s - loss: 0.2730 - binary_accuracy: 0.9000 - mean_absolute_error: 0.2853 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 320.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00
336/618 [===============>..............] - ETA: 4s - loss: 0.2659 - binary_accuracy: 0.9048 - mean_absolute_error: 0.2882 - precision: 1.0000 - recall: 1.0000 - precision_1: 1.0000 - recall_1: 1.0000 - true_positive: 336.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: 0.0000e+00
352/618 [================>.............] - ETA: 4s - loss: 0.2591 - binary_accuracy: 0.8864 - mean_absolute_error: 0.2914 - precision: 1.0000 - recall: 1.0455 - precision_1: 1.0000 - recall_1: 1.0455 - true_positive: 368.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: -16.0000  
368/618 [================>.............] - ETA: 3s - loss: 0.2526 - binary_accuracy: 0.8696 - mean_absolute_error: 0.2950 - precision: 1.0000 - recall: 1.0870 - precision_1: 1.0000 - recall_1: 1.0870 - true_positive: 400.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: -32.0000
384/618 [=================>............] - ETA: 3s - loss: 0.2464 - binary_accuracy: 0.8542 - mean_absolute_error: 0.2989 - precision: 1.0000 - recall: 1.1250 - precision_1: 1.0000 - recall_1: 1.1250 - true_positive: 432.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: -48.0000
400/618 [==================>...........] - ETA: 3s - loss: 0.2404 - binary_accuracy: 0.8400 - mean_absolute_error: 0.3031 - precision: 1.0000 - recall: 1.1600 - precision_1: 1.0000 - recall_1: 1.1600 - true_positive: 464.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: -64.0000
416/618 [===================>..........] - ETA: 3s - loss: 0.2346 - binary_accuracy: 0.8269 - mean_absolute_error: 0.3076 - precision: 1.0000 - recall: 1.1923 - precision_1: 1.0000 - recall_1: 1.1923 - true_positive: 496.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: -80.0000
432/618 [===================>..........] - ETA: 2s - loss: 0.2291 - binary_accuracy: 0.8148 - mean_absolute_error: 0.3124 - precision: 1.0000 - recall: 1.2222 - precision_1: 1.0000 - recall_1: 1.2222 - true_positive: 528.0000 - true_negative: 0.0000e+00 - false_positive: 0.0000e+00 - false_negative: -96.0000

您知道如何解决此问题吗

编辑: 我试图删除所有使用的keras_指标,只留下二进制精度

仍然存在这个问题,因为损耗和Val_损耗几乎为零,而精度保持在0.5左右。

考虑到数据集的特殊性,它意味着#TP=#FN(对于Y1)和#TN+#FP(对于Y0)

如何能够用这种损失测量来进行这种精度测量

这是否与我正在使用

Dense(2, activation='softplus') 
层作为输出


你知道吗?

经过一些测试,我将激活功能从softplus更改为softmax

即使分类器表现不佳,所有度量现在都在正确的范围内


/H

您使用的是什么指标实施?Keras没有您使用的度量(如误报等)。我使用的是Keras_度量模块。你有这个模块的经验吗?与你的问题无关,但MAE只用于回归问题,实际上它在分类问题中没有位置,就像这里你是对的。我删除了上述编辑中解释的指标。