在flight delay dataset版本的LogisticRegression
中使用scikit-learn
课程。
我使用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')
然后从get_dummies()
致电pandas
:
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
方法提供的原因?
答案 0 :(得分:13)
首先,说AUC为0.583"更低"比得分* 0.867就像比较苹果和橘子一样。
[*我认为你的score是准确的,但这对于这个讨论并不重要 - 它原则上可能是其他任何东西]
根据我的经验,至少根据我的经验,大多数ML从业者认为AUC分数测量的东西与实际上的东西不同:普通(和不幸)的使用就像其他任何一个 - 更高 - 更好的指标,如准确性,这自然会导致像你自己表达的谜题。
事实是,粗略地说,AUC衡量的是在所有可能的决策阈值中平均的二进制分类器的性能。
二进制分类中的(决定)threshold是我们决定将样本标记为1的值(回想一下,概率分类器实际返回值p
[0,1],通常被解释为概率 - 在scikit中 - 学习它是predict_proba
返回的内容。
现在,这个阈值,像scikit-learn predict
这样返回标签(1/0
)的方法是set to 0.5 by default,但这不是唯一的在可能的情况下,甚至可能不需要(例如,不平衡的数据)。
回家的重点是:
score
(引擎盖uses predict
,即标签而不是概率)时,您还隐式将此阈值设置为0.5 predict_proba
返回的概率)时,不涉及任何阈值,并且您获得(类似)所有可能的平均的准确度阈值鉴于这些澄清,您的特定示例提供了一个非常有趣的案例:
我的模型得到了足够的准确率~87%;我是否应该关心这一点,根据0.58的AUC,我的分类器只比略微更好于随机猜测?
如果你的数据中的类表示是合理平衡,那么现在的答案应该是显而易见的:不,你不应该关心;对于所有实际案例,您关心的是使用特定阈值部署的分类器,以及当在所有可能的阈值中取平均值时,此分类器在纯粹的理论和抽象情况下所执行的操作对于从业者(它确实引起了研究员提出新算法的兴趣,但我认为这不是你的情况)。
(对于不平衡的数据,参数会发生变化;这里的精度几乎没用,你应该考虑精度,召回和混淆矩阵。)
出于这个原因,AUC已经开始在文献中受到严厉的批评(不要误解这一点 - 对 ROC曲线的分析本身具有很高的信息量和实用性); Wikipedia entry及其中提供的参考资料强烈推荐阅读:
因此,AUC测量的实际价值受到质疑,这增加了AUC实际上可能在机器学习分类准确性比较中引入更多不确定性而不是解决方案的可能性。
[...]
最近对ROC AUC问题的一个解释是,将ROC曲线减少到单个数字忽略了这样一个事实:它是关于不同系统或性能点之间的权衡,而不是单个系统的性能 强>
强调我的意见 - 另见On the dangers of AUC ......
答案 1 :(得分:3)
我不知道您用作标签的确切AIR_DEL15
是什么(它不在原始数据中)。我的猜测是它是一个不平衡的特征,即有比0更多的0;在这种情况下,作为指标的准确性没有意义,您应该使用精度,召回和混淆矩阵 - 参见this thread)。
就像一个极端的例子,如果87%的标签是0,那么你可以有87%的准确度和#34;分类器"简单地(和天真地)将所有样本分类为0;在这种情况下,你的AUC也很低(非常接近0.5,就像你的情况一样)。
对于更一般的(在我看来非常需要)讨论AUC究竟是什么,请参阅我的其他答案。