Python 函数 `cls.score` 和 `cls.cv_result_` 的区别

Difference Between Python's Functions `cls.score` and `cls.cv_result_`

我在 Python(Anaconda 3.5.2 和 sklearn 0.18.2)中编写了逻辑回归代码。我已经实现了 GridSearchCV()train_test_split() 来对参数进行排序并拆分输入数据。

我的目标是找到 10 倍的总体(平均)准确度,并在测试数据上有一个标准误差。此外,我尝试预测 正确预测 class 标签 ,创建一个 混淆矩阵 并准备 class化验报告总结。


请在以下方面给我建议:

(1) 我的代码正确吗?请检查每个部分。

(2) 我尝试了两种不同的 Sklearn 函数,clf.score()clf.cv_results_。我看到他们给出了不同的结果。哪一个是正确的? (但是,不包括摘要)。

import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.metrics import classification_report,confusion_matrix
from sklearn.pipeline import Pipeline

# Load any n x m data and label column. No missing or NaN values.
# I am skipping loading data part. One can load any data to test below code.

sc = StandardScaler()
lr = LogisticRegression()
pipe = Pipeline(steps=[('sc', sc), ('lr', lr)])
parameters = {'lr__C': [0.001, 0.01]}

if __name__ == '__main__':

        clf = GridSearchCV(pipe, parameters, n_jobs=-1, cv=10, refit=True)

        X_train, X_test, y_train, y_test = train_test_split(Data, labels, random_state=0)


       # Train the classifier on data1's feature and target data
        clf.fit(X_train, y_train)

        print("Accuracy on training set: {:.2f}% \n".format((clf.score(X_train, y_train))*100))
        print("Accuracy on test set: {:.2f}%\n".format((clf.score(X_test, y_test))*100))
        print("Best Parameters: ")
        print(clf.best_params_)

     # Alternately using cv_results_
       print("Accuracy on training set: {:.2f}% \n", (clf.cv_results_['mean_train_score'])*100))
       print("Accuracy on test set: {:.2f}%\n", (clf.cv_results_['mean_test_score'])*100))

    # Predict class labels
    y_pred = clf.best_estimator_.predict(X_test)

    # Confusion Matrix
    class_names = ['Positive', 'Negative']
    confMatrix = confusion_matrix(y_test, y_pred)
    print(confMatrix)

    # Accuracy Report
    classificationReport = classification_report(labels, y_pred, target_names=class_names)
    print(classificationReport)

如有任何建议,我将不胜感激。


  • 首先,需要的指标,i。 e. 准确度 指标,已被视为 LogisticRegression() 的默认得分手。因此,我们可以省略定义 GridSearchCV()scoring='accuracy' 参数。

  • 其次,参数 score(X, y) returns 所选指标的值 IF 分类器已使用 best_estimator_ 在对取自 param_grid 的所有可能选项进行排序之后。它的工作原理与您提供的 refit=True 一样。请注意 clf.score(X, y) == clf.best_estimator_.score(X, y)。因此,它不会打印出平均指标,而是打印出最佳指标。

  • 第三,参数 cv_results_ 是一个更广泛的总结,因为它包括每次拟合的结果。但是,它打印出通过对批处理结果进行平均得到的 averaged 结果。这些是您希望存储的值。


快速示例

为了更好的理解,我在此介绍一个玩具示例:

from sklearn.datasets import load_digits
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.linear_model import LogisticRegression

X, y = load_digits(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, 0.2)    

param_grid = {'C': [0.001, 0.01]}
clf = GridSearchCV(cv=10, estimator=LogisticRegression(), refit=True, 
param_grid=param_grid)
clf.fit(X_train, y_train)
clf.best_estimator_.score(X_train, y_train)
print('____')
clf.cv_results_

此代码产生以下结果:

0.98107957707289928 # which is the best possible accuracy score


{'mean_fit_time': array([ 0.15465896, 0.23701136]),

'mean_score_time': array([ 0.0006465 , 0.00065773]),

'mean_test_score': array([ 0.934335 , 0.9376739]),

'mean_train_score': array([ 0.96475625, 0.98225632]),

'param_C': masked_array(data = [0.001 0.01],

'params': ({'C': 0.001}, {'C': 0.01})

mean_train_score 有两个平均值,因为我对 C 参数的两个选项进行了网格划分。

希望对您有所帮助!