Python函数`cls.score`和`clf.cv_results_`之间的区别

Posted

技术标签:

【中文标题】Python函数`cls.score`和`clf.cv_results_`之间的区别【英文标题】:Difference Between Python's Functions `cls.score` and `cls.cv_result_` 【发布时间】:2017-12-28 06:14:53 【问题描述】:

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

我的目标是通过测试数据的标准误差找到 10 次折叠的总体(平均)准确度。此外,我尝试预测正确预测的类别标签,创建混淆矩阵并准备分类报告摘要。


请给我以下建议:

(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)

我将不胜感激。

【问题讨论】:

【参考方案1】:

首先,所需的指标,即。 e. accuracy 指标已被视为LogisticRegression() 的默认记分器。因此,我们可以省略定义GridSearchCV()scoring='accuracy'参数。

其次,参数score(X, y) 返回所选指标的值如果分类器在对从param_grid 中获取的所有可能选项进行排序后,已使用best_estimator_ 进行了改装。它就像您提供的refit=True 一样工作。请注意clf.score(X, y) == clf.best_estimator_.score(X, y)。因此,它不会打印出平均指标,而是最好的指标。

第三,参数cv_results_ 是一个更广泛的摘要,因为它包含了每次拟合的结果。但是,它会打印出通过平均批次结果获得的平均结果。这些是您希望存储的值。


快速示例

我在这里介绍一个玩具示例以便更好地理解:

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 #这是最好的准确度分数


'mean_fit_time': 数组([ 0.15465896, 0.23701136]),

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

'mean_test_score': 数组([ 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 参数的两个选项进行了网格划分。

希望对你有帮助!

【讨论】:

感谢您的帮助,不过,我的问题是具体了解clf.score()clf.cv_results_ 之间的区别。此外,我使用train_test_split() 来生成 traintest 数据。在您的示例中,您使用整个数据 X 和标签 y。你能用我上面的代码举个例子吗?特别是,我想了解score(X_train, y_train)score(X_test, y_test)cv_results 有何不同。他们给出不同的结果。哪一个是正确的? @E.Z.如果你看到我上面的代码,我没有使用clf.best_estimator_.score(X, y),而是clf.best_estimator_.predict(X_test),因为在下一步中,我正在制作一个混淆矩阵。我想在gridsearchCV() 找到的最佳参数的测试数据上找到 10 倍的平均准确度和标准误差。该怎么做? 显然,score(X_train, y_train)score(X_test, y_test) 不同,因为它们不是相似的值向量。正如我上面所说,score() 打印出最佳指标得分,而cv_results_ 打印出批次的平均指标得分。回答第一个问题:你的代码是正确的。 如果您想获得测试数据的最佳指标得分,那么您只需输入clf.best_estimator_.score(X_test, y_test),批处理已过时。如果您想在训练数据的批次中找到最佳平均指标得分,则选择存储在 cv_results_ 中的 mean_train_scoremean_test_score 的最高值。如果您觉得难以理解 mean_test_scoremean_train_score 是什么,您应该阅读 this 仔细阅读我写的内容,因为上面已经回答了这个问题。

以上是关于Python函数`cls.score`和`clf.cv_results_`之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

谁有source insight 支持 system verilog的clf

Python - 混淆矩阵维度的差异

python sklearn逻辑回归怎么调参

Python、PyDot 和决策树

sklearn评分函数的参数是什么?

SourceInsight 支持 Python