python - 精度和 F 分数定义不明确,在没有预测样本的标签中设置为 0.0。“精度”、“预测”、平均值、warn_for)
问题描述
我正在尝试为多类分类问题绘制 ROC 曲线,代码取自https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html
我从神经模型传递标签和预测的 softmax 概率。我收到以下错误
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples.
'precision', 'predicted', average, warn_for)
问题是什么?
代码
def plot_multiclass_ROC(y_test, y_score, n_classes=7):
y_test = label_binarize(y_test, classes=[0, 1, 2, 3, 4, 5, 6])
# Import some data to play with
lw = 2
# Compute ROC curve and ROC area for each class
fpr = dict()
tpr = dict()
roc_auc = dict()
# print(y_test.shape, y_score.shape)
# print(y_test)
# print(y_score)
# exit()
for i in range(n_classes):
fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
roc_auc[i] = auc(fpr[i], tpr[i])
# Compute micro-average ROC curve and ROC area
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])
# Compute macro-average ROC curve and ROC area
# First aggregate all false positive rates
all_fpr = np.unique(np.concatenate([fpr[i] for i in range(n_classes)]))
# Then interpolate all ROC curves at this points
mean_tpr = np.zeros_like(all_fpr)
for i in range(n_classes):
mean_tpr += interp(all_fpr, fpr[i], tpr[i])
# Finally average it and compute AUC
mean_tpr /= n_classes
fpr["macro"] = all_fpr
tpr["macro"] = mean_tpr
roc_auc["macro"] = auc(fpr["macro"], tpr["macro"])
# Plot all ROC curves
plt.figure()
plt.plot(fpr["micro"], tpr["micro"],
label='micro-average ROC curve (area = {0:0.2f})'
''.format(roc_auc["micro"]),
color='deeppink', linestyle=':', linewidth=4)
plt.plot(fpr["macro"], tpr["macro"],
label='macro-average ROC curve (area = {0:0.2f})'
''.format(roc_auc["macro"]),
color='navy', linestyle=':', linewidth=4)
colors = cycle(['aqua', 'darkorange', 'cornflowerblue', "red", "green", "brown", "purple"])
for i, color in zip(range(n_classes), colors):
plt.plot(fpr[i], tpr[i], color=color, lw=lw,
label='ROC curve of class {0} (area = {1:0.2f})'
''.format(i, roc_auc[i]))
plt.plot([0, 1], [0, 1], 'k--', lw=lw)
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Some extension of Receiver operating characteristic to multi-class')
plt.legend(loc="lower right")
plt.show()
解决方案
它会警告您要通过评估的测试集仅包含 1 个标签,因此 f-1 分数以及在测试集中未找到的标签的精度和召回率将设置为 0.0 。
推荐阅读
- python - 来自 .csv Pandas 的数据框第一列中的意外字符(在底部编辑)
- python - 如何将字符串方法应用于数据框的多列
- reporting-services - SSRS 使用一个数据集输出报表的多个实例,在文档级别进行迭代
- javascript - 如何验证具有特定数字 os caracteres 的表单
- javascript - 将 Ajax 响应下载为 zip 文件?
- callback - 使用宏变量名调用宏
- javascript - 有效的 JSON 文件可以只包含一个对象的描述吗?
- php - 拆分为具有相同行为的 preg_split 替代方案
- sql - 使用 (T-)SQL 截断字符串中的每个单词
- json - 如何在 vue.js 中获取嵌套的 JSON 数据