想看结论直接拉到最下面。
我们知道,使用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的公式如下:
上文搜索相关博客,没有发现描述相关问题的。
只好去看官方文档
(都是英文,本来不想看的,o(╥﹏╥)o,没办法)
发现在cross_var_score这章也没有明确说明,只是说在scoring这个属性的用法和cross_validate
所以决定自己动手测试一下这个问题:
在看下面的这个例子前,我们需要知道一个东西
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])
这就说明两点,第一,cross_val_score中scoring="precision"时,默认正类是数据集中标签为1的那类;第二,pos_label可以决定哪个是正类标签。
自己又尝试,把标签3改成标签1,结果:
上面报错是说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。
总结:
cross_val_score(clf,X_var0,Y.values.ravel(),cv=10,scoring=“precision”).mean()时,默认正类为数据集中标签为"1"的类。