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
参数的两个选项进行了网格划分。
希望对您有所帮助!
我在 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
参数的两个选项进行了网格划分。
希望对您有所帮助!