比较scikit学习中调整超参数的方法



这篇文章是关于LogisticRegressionCV、GridSearchCV和cross_val_score之间的差异。考虑以下设置:

import numpy as np
from sklearn.datasets import load_digits
from sklearn.linear_model import LogisticRegression, LogisticRegressionCV
from sklearn.model_selection import train_test_split, GridSearchCV, 
StratifiedKFold, cross_val_score
from sklearn.metrics import confusion_matrix
read = load_digits()
X, y = read.data, read.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3)

在惩罚逻辑回归中,我们需要设置控制正则化的参数C。scikit中有三种方法可以通过交叉验证来找到最好的C。

后勤回归CV

clf = LogisticRegressionCV (Cs = 10, penalty = "l1",
solver = "saga", scoring = "f1_macro")
clf.fit(X_train, y_train)
confusion_matrix(y_test, clf.predict(X_test))

附带说明:文档指出,SAGA和LIBLINER是L1惩罚的唯一优化器,SAGA对于大型数据集更快。不幸的是,热启动仅适用于牛顿CG和LBFGS。

网格搜索CV

clf = LogisticRegression (penalty = "l1", solver = "saga", warm_start = True)
clf = GridSearchCV (clf, param_grid = {"C": np.logspace(-4, 4, 10)}, scoring = "f1_macro")
clf.fit(X_train, y_train)
confusion_matrix(y_test, clf.predict(X_test))
result = clf.cv_results_

cross_val_score

cv_scores = {}
for val in np.logspace(-4, 4, 10):
clf = LogisticRegression (C = val, penalty = "l1",
solver = "saga", warm_start = True)
cv_scores[val] = cross_val_score (clf, X_train, y_train,
cv = StratifiedKFold(), scoring = "f1_macro").mean()
clf = LogisticRegression (C = max(cv_scores, key = cv_scores.get),
penalty = "l1", solver = "saga", warm_start = True)
clf.fit(X_train, y_train)
confusion_matrix(y_test, clf.predict(X_test))

问题

  1. 我是否以三种方式正确执行了交叉验证
  2. 这三种方式都等效吗?如果没有,是否可以通过更改代码使它们等效
  3. 就优雅、速度或任何标准而言,哪种方式最好?(换句话说,为什么scikit学习中有3种交叉验证方法?(

欢迎对任何一个问题做出简单的回答;我意识到它们有点长,但希望它们能很好地总结scikit学习中的超参数选择。

关于3-为什么scikit学习中有3种交叉验证方法?

让我们将其与集群进行类比:scikit-learn中实现了多种聚类算法。

为什么会这样?不是一个比另一个好吗?

您可以回答:它们是不同的算法,每个算法都有自己的优点和缺点

物流回归CV

实现了具有内置交叉验证支持的逻辑回归,根据评分找到最佳的C和l1_ratio参数属性

LogisticRegression CV因此是逻辑回归的"高级"版本,因为它不需要用户自己优化超参数C l1_ratio。

GridSearchCV

用户指南指出:

GridSearchCV提供的网格搜索详尽地生成使用指定的参数值网格中的候选者param_grid参数。例如,以下

param_grid = [
{'C': [1, 10, 100, 1000], 'kernel': ['linear']},
{'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
]

在这里,您实际上可以指定要进行网格搜索的参数以及值/步骤。与LogisticRegressionCV相比,主要区别在于GridSearchCV可以用于任何分类器/回归器。最重要的是,你也可以对任何不在sklearn上的模型使用GridSearchCV,只要它们既有拟合方法也有预测方法。

除了提供通过使用例如表现最好的模型之外

clf = GridSearchCV (clf, param_grid = {"C": np.logspace(-4, 4, 10)}, scoring = "f1_macro")
clf.fit(X_train, y_train)

GridSearchCV还包含对最佳模型的广泛评估:

cv_results_:numpy(掩码(ndarrays的dict键为的dict列标题和值作为列,可以导入到Panda DataFrame。

cross_val_score

您可能希望在一个保留数据集上专门评估您的模型。在不搜索参数的情况下,可以评估单个模型。这是使用cross_val_score时的情况。

TLDR:所有方法都是不同的,每种方法都有不同的用途。LogisticRegissionCV仅与逻辑回归相关。GridSearchCV是最详尽和最通用的变体,它包括评估分数和最佳分类器。cross_val_score只是一种评估,在仅进行评估时首选。

最新更新