繁体   English   中英

比较在scikit-learn中调整超参数的方法

[英]Compare ways to tune hyperparameters in scikit-learn

这篇文章是关于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-learn中有3种通过交叉验证找到最佳C的方法。

Logistic回归

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和LIBLINEAR是L1惩罚的唯一优化器,而SAGA对于大型数据集则更快。 不幸的是,热启动仅适用于Newton-CG和LBFGS。

GridSearchCV

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. 我是否以3种方式正确执行了交叉验证?
  2. 这三种方式都等效吗? 如果不是,是否可以通过更改代码使其等效?
  3. 就优雅,速度或任何标准而言,哪种方法最好? (换句话说,为什么在scikit-learn中有3种交叉验证方式?)

欢迎对任何一个问题提供简单的答案; 我意识到它们有些长,但是希望它们是scikit-learn中超参数选择的一个很好的总结。

关于3-为什么scikit-learn中有3种交叉验证方式?

让我们以类似于聚类的方式来看一下:scikit-learn中实现了多种聚类算法。

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

您可能会回答: 嗯,它们是不同的算法,每种算法各有优缺点。

Logistic回归

通过内置的交叉验证支持实现Logistic回归,以根据评分属性找到最佳的C和l1_ratio参数。

LogisticRegressionCV因此是Logistic回归的“高级”版本,因为它不需要用户自己优化超参数C11_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可用于任何分类器/回归器。 最重要的是,您还可以将GridSearchCV用于不在sklearn上的任何模型,只要它们具有拟合和预测方法即可。

除了使用以下方法提供效果最佳的模型外:

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

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

cv_results_:numpy(带掩码)ndarray的字典,其键为列标题,值作为列的dict,可以将其导入pandas DataFrame。

cross_val_score

您可能要专门针对保留数据集评估模型。 无需搜索参数,就可以评估单个模型。 这是您使用cross_val_score的时候。

TLDR :都是不同的方法,并且每种方法都有不同的用途。 LogisticRegressionCV仅与逻辑回归相关。 GridSearchCV是最详尽,最通用的变体,它既包括评估得分,又包括最佳分类器。 cross_val_score只是一个评估,仅在评估时首选使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM