sklearn中使用cross_val_score当scoring=“recall“或者“precision“的时候,正类(positive)是哪个类?(针对二分类)

想看结论直接拉到最下面。

我们知道,使用sklearn中的交叉验证cross_var_score来测试自己机器模型时,可以比单独train_test_split划分测试集,数据集测试更能显示模型的泛化性,使结果更具说服力。

我在测试的时候需要用到precision,recall,f1这三个指标,我就会使用

cross_val_score(clf,X_var0,Y.values.ravel(),cv=10,scoring="precision").mean()
cross_val_score(clf,X_var0,Y.values.ravel(),cv=10,scoring="recall").mean()
cross_val_score(clf,X_var0,Y.values.ravel(),cv=10,scoring="f1").mean()

但是自己现在却突然发现了一个问题,就是你怎么知道sklearn在训练的时候把哪个标签当做了正类(positive,就是上面公式中的P)?
precision,recall,f1的公式如下:

  1. precision=TP/(TP+TN)
  2. recall=TP/(TP+FN)
  3. f1=(2 * precision * recall)/(precision+recall)

上文搜索相关博客,没有发现描述相关问题的。
只好去看官方文档
(都是英文,本来不想看的,o(╥﹏╥)o,没办法)
发现在cross_var_score这章也没有明确说明,只是说在scoring这个属性的用法和cross_validate
sklearn中使用cross_val_score当scoring=“recall“或者“precision“的时候,正类(positive)是哪个类?(针对二分类)_第1张图片

所以决定自己动手测试一下这个问题:
在看下面的这个例子前,我们需要知道一个东西
sklearn.metrics.precision_score(y_true, y_pred, *, label,s=None, pos_label=1, average=‘binary’, sample_weight=None, zero_division=‘warn’)
中有一个pos_label属性,这个属性是决定precision_score中的正类是哪一个的。

数据集是这个
在这里插入图片描述
运行程序报错:
ValueError: pos_label=1 is not a valid label: array([2, 3])
sklearn中使用cross_val_score当scoring=“recall“或者“precision“的时候,正类(positive)是哪个类?(针对二分类)_第2张图片

这就说明两点,第一,cross_val_score中scoring="precision"时,默认正类是数据集中标签为1的那类;第二,pos_label可以决定哪个是正类标签
自己又尝试,把标签3改成标签1,结果:
sklearn中使用cross_val_score当scoring=“recall“或者“precision“的时候,正类(positive)是哪个类?(针对二分类)_第3张图片
上面报错是说pos_label=1不是一个有效的标签,现在在数据集上加上label=1,不报错了,说明此时precision是以"1"为正类。这再一次佐证,cross_val_score以数据集中标签为1的类为正类来计算precision。
其实当scoring=recall或者f1都是如此,cross_val_score中默认正类是数据集中标签为1的那类,可按照我上面的步骤自行验证。

查看sklearn官方文档:
sklearn.metrics.precision_score
也算是在官方中看到了相应解释,当pos_label没有被设置时,默认为1。
sklearn中使用cross_val_score当scoring=“recall“或者“precision“的时候,正类(positive)是哪个类?(针对二分类)_第4张图片


总结:
cross_val_score(clf,X_var0,Y.values.ravel(),cv=10,scoring=“precision”).mean()时,默认正类为数据集中标签为"1"的类。

你可能感兴趣的:(python机器学习专栏)