如何使用 python 打印精度、召回率、f 分数?

Posted

技术标签:

【中文标题】如何使用 python 打印精度、召回率、f 分数?【英文标题】:how can i print precision, recall, fscore using python? 【发布时间】:2020-07-12 23:28:21 【问题描述】:

我想在 python 中使用 sklearn.metrics 计算和打印精度、召回率、fscore 和支持。 我是 doig NLP,所以我的 y_test 和 y_pred 基本上是矢量化步骤之前的单词。

下面的一些信息可以帮助你:

y_test:  [0 0 0 1 1 0 1 1 1 0]
y_pred [0.86 0.14 1.   0.   1.   0.   0.04 0.96 0.01 0.99 1.   0.   0.01 0.99
 0.41 0.59 0.02 0.98 1.   0.  ]

x_train 50
y_train 50
x_test 10
y_test 10
x_valid 6
y_valid 6

y_pred dimension:  (20,)
y_test dimension:  (10,)

完整的引用错误:

  Traceback (most recent call last):
  File "C:\Users\iduboc\Documents\asd-dev\train.py", line 324, in <module>
    precision, recall, fscore, support = score(y_test, y_pred)
  File "C:\Users\iduboc\Python1\envs\asd-v3-1\lib\site-packages\sklearn\metrics\classification.py", line 1415, in precision_recall_fscore_support
    pos_label)
  File "C:\Users\iduboc\Python1\envs\asd-v3-1\lib\site-packages\sklearn\metrics\classification.py", line 1239, in _check_set_wise_labels
    y_type, y_true, y_pred = _check_targets(y_true, y_pred)
  File "C:\Users\iduboc\Python1\envs\asd-v3-1\lib\site-packages\sklearn\metrics\classification.py", line 71, in _check_targets
    check_consistent_length(y_true, y_pred)
  File "C:\Users\iduboc\Python1\envs\asd-v3-1\lib\site-packages\sklearn\utils\validation.py", line 205, in check_consistent_length
    " samples: %r" % [int(l) for l in lengths])
ValueError: Found input variables with inconsistent numbers of samples: [10, 20]

我的代码:

 from sklearn.metrics import precision_recall_fscore_support as score
    precision, recall, fscore, support = score(y_test, y_pred)
    print('precision: '.format(precision))
    print('recall: '.format(recall))
    print('fscore: '.format(fscore))
    print('support: '.format(support))

我预测值的代码:

elif clf == 'rndforest':

    # No validation data in rnd forest
    x_train = np.concatenate((x_train, x_valid))
    y_train = np.concatenate((y_train, y_valid))

    model = RandomForestClassifier(n_estimators=int(clf_params['n_estimators']),
                                   max_features=clf_params['max_features'])
    model.fit(pipe_vect.transform(x_train), y_train)

    datetoday = datetime.today().strftime('%d-%b-%Y-%H_%M')
    model_name_save = abspath(os.path.join("models", dataset,  name_file + '-' + 
    vect + reduction + '-rndforest'\
                                   + datetoday + '.pickle'))
    print("Model d'enregistrement : ", model_name_save)




    x_test_vect = pipe_vect.transform(x_test)

    y_pred = model.predict_proba(x_test_vect)  

【问题讨论】:

您正在尝试比较不同维度的向量,y_pred dimension (20,)y_test dimension: (10,)。检查您如何生成这些数据集,在您的代码中我们看不到 pipe_vect 在做什么。请删除所有不必要的代码并给我们一个最小可重现示例 -> ***.com/help/minimal-reproducible-example(包括 pipe_vect 定义) 【参考方案1】:

错误是由于预测向量和地面实况向量的大小不同造成的。函数precision_recall_fscore_support 仅在这些大小相同时才有效。

查看文档:

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_fscore_support.html

此外,上述函数期望接收非连续值,否则。如果您将浮点数在 0 和 1 之间的列表(y_pred 列表)作为参数传递,您将遇到下一个错误:

ValueError: Classification metrics can't handle a mix of binary and continuous targets

产生错误的示例代码如下:

y_test =  [0., 0., 0., 1., 1.]
y_pred = [0.86, 0.14, 1., 0., 1.]

from sklearn.metrics import precision_recall_fscore_support as score

precision, recall, fscore, support = score(y_test, y_pred)
print('precision: '.format(precision))
print('recall: '.format(recall))
print('fscore: '.format(fscore))
print('support: '.format(support))

因此,如果您想计算这些指标,您必须以某种方式决定预测向量的哪些值是 1(正预测),哪些是 0(负预测)。例如,您可以使用一个阈值(例如 0.5)或多个阈值,然后选择最佳的一个或绘制一条具有不同阈值水平(例如 0.1、0.2、0.3 等)的不同指标的曲线。

【讨论】:

是的,谢谢,但我的问题似乎是 y_pred 和 y_test 尺寸的值,你知道我该如何解决这个错误吗? 要修复此错误,我首先需要查看用于预测这些值的代码。 pipe_vect.transform(x_test) 的作用是什么? x_test_vect的大小实际上是10吗? pipe_vect.transform(x_test) 将单词转换为向量,是的,他的大小是 10

以上是关于如何使用 python 打印精度、召回率、f 分数?的主要内容,如果未能解决你的问题,请参考以下文章

一次性计算精度、召回率和 F 分数 - python

第一次预测的精度、F 分数和召回率高

y_pred 和 y_true 具有不同大小时的精度、召回率、f 分数

如何从 Python 中的混淆矩阵中获取精度、召回率和 f 度量 [重复]

精度、召回率、F1 分数等于 sklearn

决策树的分类报告参数(精度、召回率、f1 分数、支持)为 1.0