【问题标题】:Compare ways to tune hyperparameters in scikit-learn比较在 scikit-learn 中调整超参数的方法
【发布时间】:2019-01-12 09:27:44
【问题描述】:

这篇文章是关于 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。

LogisticRegressionCV

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

欢迎对任何一个问题做出重要的回答;我意识到它们有点长,但希望它们是 scikit-learn 中超参数选择的一个很好的总结。

【问题讨论】:

    标签: python machine-learning scikit-learn cross-validation hyperparameters


    【解决方案1】:

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

    让我们将其与聚类类似地看一下: 在 scikit-learn 中实现了多种聚类算法。

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

    你可能会回答: 它们是不同的算法,每个都有自己的优点和缺点。

    LogisticRegressionCV

    使用内置的交叉验证支持实现逻辑回归, 根据评分找到最优的C和l1_ratio参数 属性。

    LogisticRegressionCV 因此是 Logistic Regression 的“高级”版本,因为它不需要用户自己优化超参数 C l1_ratio。

    GridSearchCV

    user guide 声明:

    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 上的模型,只要它们同时具有 fit 和 predict 方法。

    除了提供表现最好的模型之外,还使用了以下方法:

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

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

    cv_results_ : numpy (masked) ndarrays 的字典 键为 列标题和值作为列,可以导入到 熊猫数据框。

    cross_val_score

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

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

    【讨论】:

      猜你喜欢
      • 2021-04-24
      • 2016-05-11
      • 2020-01-29
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 2019-07-25
      • 2021-10-12
      • 2020-07-17
      相关资源
      最近更新 更多