sklearn.metrics.accuracy_score 与 LogisticRegression().score?

机器算法验证 物流 准确性
2022-03-27 11:49:46

我目前正在一个简单的二元分类任务上测试一些模型,但是,我发现 SK Learn 的两个准确度得分指标之间存在奇怪的差异:sk_learn.metrics.accuracy_score和 LogisticRegression 类的.score() 方法

他们都应该衡量“准确性”,但在将两者并列之后,我找不到它们之间的任何明显差异。有人可以帮我解释为什么这两种方法得到不同的结果吗?也许提供使用建议?下面是我调用的函数,它使用我的数据集中的随机样本对模型进行 100 次试验。

我还分享了所得分数分布的屏幕截图。

def lr_runner(data, ratio, kpi, dropper, d_var, sensitivity=.01):
scores =[]
accs =[]
AUCs = []
tprs = []
mean_fpr = np.linspace(0, 1, 100)
for i in tqdm_notebook(range(100)):
    train, test = randomizer(data, .66, kpi, sensitivity=sensitivity)
    train = pd.get_dummies(train, columns=['categorical_variable1', 'categorical_variable2'])
    test = pd.get_dummies(test, columns=['categorical_variable1', 'categorical_variable2'])
    X_train = train.drop(dropper, axis=1)
    X_train = sm.add_constant(X_train)
    X_test = test.drop(dropper, axis=1)
    X_test = sm.add_constant(X_test)
    y_train = train[d_var]
    y_test = test[d_var]
    results = LogisticRegression().fit(X_train, y_train)
    scores.append(results.score(X_train, y_train))
    accs.append(accuracy_score(y_test, results.predict(X_test)))
    probas_ = results.predict_proba(X_test)
    fpr, tpr, thresholds = roc_curve(y_test, probas_[:, 1])
    tprs.append(interp(mean_fpr, fpr, tpr))
    tprs[-1][0] = 0.0
    roc_auc = auc(fpr, tpr)
    AUCs.append(roc_auc)
print("mean score: {}\nmean acc: {}\nmean AUC: {}".format(np.mean(scores),
                                                           np.mean(accs),
                                                           np.mean(AUCs)))
fig, subplots = plt.subplots(1,3, figsize=(12, 4))
sns.distplot(scores, kde=False, ax=subplots[0]) 
subplots[0].set_title("Scores")
sns.distplot(accs, kde=False, ax=subplots[1]) 
subplots[1].set_title("accuracies")
sns.distplot(AUCs, kde=False, ax=subplots[2]) 
subplots[2].set_title("AUC's")
plt.show()
fig.show()
return scores, accs, AUCs, results

100 次模型运行得到的指标分布

1个回答

我希望我能把它收回......当你把你的困惑写下来(并阅读源代码)时会发生什么令人惊讶。

一是测试准确率,二是训练准确率。

澄清:

results.score(X_train, y_train)是训练准确率,而

accuracy_score(y_test, results.predict(X_test))是测试精度。

我发现他们做同样事情的方法是检查 SK Learn 源代码。原来.score()LogisticRegression 类中的方法直接调用了该sklearn.metrics.accuracy_score方法...我跑了一个测试仔细检查并确认:

使用 LR.score 进行训练:

model.score(X_train, y_train)
0.72053675612602097

使用 LR.score 进行测试:

model.score(X_test, y_test)
0.79582673005810878

使用 accuracy_score 进行测试:

accuracy_score(y_test, model.predict(X_test))
0.79582673005810878