python - 为什么 roc_auc 在 sklearn 中会产生奇怪的结果?
问题描述
我有一个二进制分类问题,我使用以下代码来获取我weighted avarege precision
的weighted avarege recall
,weighted avarege 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()))
对于具有 2 个不同功能设置的同一数据集,我得到了以下结果。
Feature setting 1 ('accuracy', 'precision_weighted', 'recall_weighted', 'f1_weighted', 'roc_auc'):
0.6920, 0.6888, 0.6920, 0.6752, 0.7120
Feature setting 2 ('accuracy', 'precision_weighted', 'recall_weighted', 'f1_weighted', 'roc_auc'):
0.6806 0.6754 0.6806 0.6643 0.7233
因此,我们可以看到,feature setting 1
与feature setting 2
.
然而,当谈到 'roc_auc' 时,它feature setting 2
比feature setting 1
. 我发现这很奇怪,因为其他所有指标都使用feature setting 1
.
一方面,我怀疑发生这种情况是因为我使用weighted
分数precision, recall and f-measure
而不是roc_auc
. 是否可以weighted roc_auc
在 sklearn 中进行二进制分类?
这个奇怪的 roc_auc 结果的真正问题是什么?
如果需要,我很乐意提供更多详细信息。
解决方案
这并不奇怪,因为将所有这些其他指标与 AUC 进行比较就像将苹果与橙子进行比较。
以下是整个过程的高级描述:
- 概率分类器(如此处的 RF)
p
在[0, 1]
. - 为了获得硬类预测 (
0/1
),我们对这些概率应用阈值;如果未明确设置(如此处),则此阈值隐式设为 0.5,即 ifp>0.5
thenclass=1
, elseclass=0
。 - 准确度、精确度、召回率和 f1 分数等指标是在硬类预测上计算的
0/1
,即在应用阈值之后。 - 相比之下,AUC 衡量的是在所有可能阈值范围内平均的二元分类器的性能,而不是针对特定阈值。
所以,它肯定会发生,而且确实会导致新从业者的困惑。
我在这个类似问题中的回答的第二部分可能有助于了解更多细节。报价:
至少根据我的经验,大多数机器学习从业者认为 AUC 分数所衡量的东西与其实际所做的不同:常见(也是不幸的)使用就像任何其他越高越好的指标,比如准确度,这可能自然会导致谜题,比如你表达自己的谜题。
推荐阅读
- c++ - Qt 错误:LNK1120:1 未解决的外部
- sql - 如何为表行实现类似 UNIX 的 ACL
- mysql - 重复的输入密钥 phpmyadmin
- python - matplotlib 中的 fill_between 函数有渐变功能吗?
- search - 如何使结果高于内容?Z-index 搜索字段问题
- java - 如何知道 Java 中 for-each 中的迭代值?
- html - html标签上的角度输入和本机html属性有什么区别
- javascript - 单击后如何显示和隐藏按钮?
- python - os.listdir() not showing contents of directory
- java - What is the best place to place a Comparator Class in Java