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()
来生成 train 和 test 数据。在您的示例中,您使用整个数据 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_score
或 mean_test_score
的最高值。如果您觉得难以理解 mean_test_score
和 mean_train_score
是什么,您应该阅读 this
仔细阅读我写的内容,因为上面已经回答了这个问题。以上是关于Python函数`cls.score`和`clf.cv_results_`之间的区别的主要内容,如果未能解决你的问题,请参考以下文章