tensorflow 遇见错误ValueError: Classification metrics can’t handle a mix of binary and continuous targets keras 遇见错误:ValueError: Classification metrics can’t handle a mix of binary and continuous targets 使用sklearn中的函数 confusion_matrix、classification_report 或者 accuracy_score 或者计算TP\FP\TN\FN出现错误
原因
这是因为sklearn函数的输入参数的数据类型不匹配导致的,有可能是输入的y_true为[0,1,1,0,1]的int型数据,而y_predict是[0.8,0.9,0.1,0.5]这样的概率数据。因此需要把概率数据转换为整型数据即可。可能使用了**model.predict_proba()**函数进行了预测
解决
方法一:
在预测时使用:
y_predict = model.predict_classes(x_test) # 输出 [0,1,1,1]格式的数据
y_scores = model.predict_proba(x_test)# 输出[ 负的概率], 正的概率] 格式的数据 根据预测任务的不同而不同
model是训练的模型。
这种方法就是将预测值与预测概率分开。
注意! 这种方法对有些编码方式可能不适用,请尽量使用方法二!
方法二(推荐):
使用model.predict_proba()预测之后将结果转化为int类型的数据
y_scores = model.predict_proba(x_test)# 输出[ 负的概率], 正的概率] 格式的数据
y_pred = y_socres[:,1] # 取第二列 正的概率,根据每个人的数据不同而不同!
y_pred = np.around(y_pred,0).astype(int) # .around()是四舍五入的函数 第二个参数0表示保留0位小数,也就只保留整数!! .astype(int) 将浮点数转化为int型
方法三(强烈推荐):
如果是在二分类任务中使用了one-hot编码,那么当 0 位置的概率 小于 1 位置的概率时 该值为 1 ,否则为0。如预测出来[0.6,0,8] 那么值为1,如预测出来[0.2,0,3] 值还是1,可如果以0.5为界限判断0、1显然是不合理的。因此使用以下代码更加合理:
yy_pred = model.predict(x_test, batch_size=b) # 预测出[[0.4,0.45],[0.8,0.3],[0.6,0.71]]
y_pred = np.argmax(yy_pred, axis=1) # 选择max值进行输出0,或1
总结:
使用上面三种方法预测的结果,就可以直接中sklearn的包进行求精确度等各种数据了