在flight delay dataset的版本中使用 LogisticRegression
中的 LogisticRegression
类 .
我使用 pandas
来选择一些列:
df = df[["MONTH", "DAY_OF_MONTH", "DAY_OF_WEEK", "ORIGIN", "DEST", "CRS_DEP_TIME", "ARR_DEL15"]]
我用0填写 NaN
值:
df = df.fillna({'ARR_DEL15': 0})
确保分类列标有“类别”数据类型:
df["ORIGIN"] = df["ORIGIN"].astype('category')
df["DEST"] = df["DEST"].astype('category')
然后从 pandas
调用 get_dummies()
:
df = pd.get_dummies(df)
现在我训练和测试我的数据集:
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
test_set, train_set = train_test_split(df, test_size=0.2, random_state=42)
train_set_x = train_set.drop('ARR_DEL15', axis=1)
train_set_y = train_set["ARR_DEL15"]
test_set_x = test_set.drop('ARR_DEL15', axis=1)
test_set_y = test_set["ARR_DEL15"]
lr.fit(train_set_x, train_set_y)
一旦我调用 score
方法,我就会得到0.867左右 . 但是,当我调用 roc_auc_score
方法时,我得到的数字大约低于0.583
probabilities = lr.predict_proba(test_set_x)
roc_auc_score(test_set_y, probabilities[:, 1])
有没有理由说ROC AUC比 score
方法提供的要低得多?
2 回答
首先,说0.583的AUC低于0.867的得分*,就像比较苹果和橙子一样 .
[*我假设你的score是准确的,但这对于这个讨论并不重要 - 原则上它可能是其他任何东西]
根据我的经验,至少大多数ML从业者认为AUC分数测量的东西与实际不同:普通(和不幸)使用就像任何其他更高更好的度量,如准确性,可能自然会导致像你自己表达的谜题 .
事实是,粗略地说,AUC衡量的是在所有可能的决策阈值中平均的二元分类器的性能 .
二进制分类中的(决定)threshold是我们决定将样本标记为1的值(回想一下,概率分类器实际上返回[0,1]中的值
p
,通常被解释为概率 - 在scikit中 - 学习它是什么predict_proba
返回) .现在,这个阈值,在像scikit-learn
predict
这样返回标签(1/0
)的方法中,是set to 0.5 by default,但这不是唯一的可能性,并且在一些情况下甚至可能不需要(例如,不 balancer 的数据) .带回家的重点是:
当你要求
score
(引擎盖uses predict,即标签而非概率)时,你也隐含地将此阈值设置为0.5当您要求AUC(相反,使用
predict_proba
返回的概率)时,不涉及阈值,并且您获得(类似)所有可能阈值的平均准确度鉴于这些澄清,您的特定示例提供 a very interesting case in point :
如果你的数据中的类表示是 reasonably balanced ,那么现在的答案应该是显而易见的:不,你不应该关心;对于所有实际案例,你关心的是一个使用特定阈值部署的分类器,以及这个分类器在纯粹的理论和抽象情况下所做的事情,当在所有可能的阈值中取平均值时,对于从业者来说应该没什么兴趣(它确实对一位研究人员提出了一种新的算法,但我认为这不是你的情况) .
(对于不 balancer 的数据,参数会发生变化;此处的准确性实际上是无用的,您应该考虑精度,召回和混淆矩阵) .
出于这个原因,AUC已经开始在文献中受到严厉的批评(不要误读这一点 - 对ROC曲线本身的分析具有很高的信息量和实用性); Wikipedia entry及其中提供的参考资料强烈推荐阅读:
强调我的 - 请参阅On the dangers of AUC ...
我不知道究竟是什么
AIR_DEL15
,你用它作为你的标签(它不在原始数据中) . 我的猜测是它是一个不 balancer 的特征,即还有更多的东西 . 在这种情况下,作为度量的准确性没有意义,您应该使用精度,召回和混淆矩阵 - 参见this thread) .就像一个极端的例子,如果87%的标签是0,你可以简单地获得87%的准确度“分类器”(和通过将所有样本分类为0;在这种情况下,你的AUC也很低(非常接近0.5,就像你的情况一样) .
对于更一般的(在我看来非常需要)讨论AUC究竟是什么,请参阅我的其他答案 .