在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.583的AUC低于0.867的分数*就像将苹果和桔子进行比较。
[*我假设您的score是平均准确度,但这对于本次讨论并不重要-原则上可以是其他任何方式]
至少根据我的经验,大多数机器学习从业者都认为AUC评分与实际结果有所不同:常见(不幸的是)用法与其他任何更高的指标一样,例如准确性,它可能自然会引起您表达自己的困惑。
事实是,粗略地说,AUC衡量的是在所有可能的决策阈值上取平均值的二元分类器的性能。
二进制分类中的(判定)threshold是一个值,在该值上方我们决定将样本标记为1(回想概率分类器实际上在[0,1]中返回p
值,通常将其解释为概率-在scikit-learn中,它是predict_proba
返回什么)。
现在,在诸如scikit-learn predict
之类的返回标签(1/0
)的方法中,此阈值为set to 0.5 by default,但这不是唯一的可能性,并且在某些情况下(例如,数据不平衡)甚至可能不是期望的。
带回家的重点是:
score
(在uses predict
之下,即标签而不是概率)时,您也已将该阈值隐式设置为0.5 predict_proba
返回的概率),不涉及阈值,并且您获得(类似)所有可能阈值的平均准确度鉴于这些澄清,您的特定示例在点上为提供了一个非常有趣的情况:
假设数据中的类表示形式为合理平衡,那么现在的答案应该很明显。在所有实际情况下,您关心的是使用特定阈值部署的分类器,并且在所有可能阈值的平均水平下,该分类器在纯理论和抽象情况下所进行的操作对从业人员几乎没有兴趣(它确实对研究人员提出了一种新算法,但我认为这不是您的情况)。
(对于不平衡的数据,参数会发生变化;这里的精度实际上是没有用的,您应该考虑精度,查全率和混淆矩阵)。
因此,AUC开始受到文学界的严厉批评(请不要误解这一点-对ROC曲线本身的分析非常有用,也很有用);强烈建议您阅读Wikipedia entry及其提供的引用资料:
我的重点-另请参阅On the dangers of AUC ...
关于machine-learning - ROC AUC得分低但准确性高,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47104129/