我有一个二分类问题,我使用以下代码来获取我的加权平均精确度
、加权平均召回率
、加权平均F-measure
和roc_auc
。
df = pd.read_csv(input_path+input_file)X = df[features]y = df[["gold_standard"]]clf = RandomForestClassifier(random_state = 42, class_weight="balanced")k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)scores = cross_validate(clf, X, y, cv=k_fold, scoring = ('accuracy', 'precision_weighted', 'recall_weighted', 'f1_weighted', 'roc_auc'))print("accuracy")print(np.mean(scores['test_accuracy'].tolist()))print("precision_weighted")print(np.mean(scores['test_precision_weighted'].tolist()))print("recall_weighted")print(np.mean(scores['test_recall_weighted'].tolist()))print("f1_weighted")print(np.mean(scores['test_f1_weighted'].tolist()))print("roc_auc")print(np.mean(scores['test_roc_auc'].tolist()))
我对同一数据集的两种不同特征设置得到了以下结果。
特征设置1 ('accuracy', 'precision_weighted', 'recall_weighted', 'f1_weighted', 'roc_auc'): 0.6920, 0.6888, 0.6920, 0.6752, 0.7120特征设置2 ('accuracy', 'precision_weighted', 'recall_weighted', 'f1_weighted', 'roc_auc'):0.6806 0.6754 0.6806 0.6643 0.7233
因此,我们可以看到,在特征设置1
中,与特征设置2
相比,’accuracy’, ‘precision_weighted’, ‘recall_weighted’, ‘f1_weighted’ 的结果更好。
然而,当涉及到’roc_auc’时,特征设置2
比特征设置1
更好。我觉得这很奇怪,因为其他所有指标在特征设置1
中都更好。
一方面,我怀疑这是因为我对precision, recall和f-measure
使用了加权
分数,而对roc_auc
没有使用。是否可以在sklearn中对二分类进行加权roc_auc
?
这个奇怪的roc_auc
结果的真正问题是什么?
回答:
这并不奇怪,因为将所有这些其他指标与AUC进行比较就像是在比较苹果和橘子。
以下是整个过程的高层次描述:
- 概率分类器(如这里的RF)产生概率输出
p
在[0, 1]
中。 - 为了获得硬类预测(
0/1
),我们对这些概率应用一个阈值;如果没有明确设置(如这里),这个阈值被隐式地认为是0.5,即如果p>0.5
则class=1
,否则class=0
。 - 像accuracy, precision, recall和f1-score这样的指标是基于硬类预测
0/1
计算的,即在应用阈值之后计算的。 - 相比之下,AUC测量的是二分类器在所有可能阈值范围内的平均性能,而不是针对特定阈值的性能。
所以,这种情况确实可能发生,确实可能导致新从业者的困惑。
我在这个类似问题中的回答的第二部分可能会对更多细节有所帮助。引用如下:
根据我的经验,至少,大多数机器学习从业者认为AUC分数衡量的东西与它实际上衡量的东西不同:常见的(不幸的)用法就像任何其他越高越好的指标一样,比如accuracy,这自然可能导致像你表达的那样困惑的谜题。