如何使用 Scikit-Learn 调整算法参数

机器学习模型被参数化,以便它们的行为可以针对特定问题进行调整。

模型可以有很多参数,找到最佳参数组合可以被视为一个搜索问题。

在本篇博文中,您将学习如何使用 scikit-learn 库在 Python 中调整机器学习算法的参数。

开始您的项目,请阅读我的新书《Python 机器学习精通》,其中包含分步教程和所有示例的Python 源代码文件。

让我们开始吧。

  • 2017年1月更新:更新以反映 scikit-learn 0.18 版本中的 API 变化。
fine tuning

调整算法就像调整钢琴
图片由 Katie Fricker 提供,部分权利保留

机器学习算法参数

算法调整是应用机器学习过程中在呈现结果之前的最后一步。

它有时被称为 超参数优化,其中算法参数被称为超参数,而机器学习算法本身找到的系数被称为参数。优化表明了问题的搜索性质。

将其视为一个搜索问题,您可以使用不同的搜索策略来找到给定问题的算法的一个好的、鲁棒的参数或一组参数。

两种简单易行的搜索策略是网格搜索和随机搜索。Scikit-learn 提供了这两种算法参数调整方法,下面提供了它们的示例。

网格搜索参数调整

网格搜索是一种参数调整方法,它将系统地构建和评估在网格中指定的每个算法参数组合的模型。

下面的示例在标准的糖尿病数据集上评估了 Ridge 回归算法的不同 alpha 值。这是一个一维网格搜索。

更多信息请参阅 GridSearchCV API 和用户指南的 穷举网格搜索 部分。

随机搜索参数调整

随机搜索是一种参数调整方法,它将在固定数量的迭代中从随机分布(例如均匀分布)中采样算法参数。将为选择的每个参数组合构建和评估一个模型。

下面的示例在标准的糖尿病数据集上评估了 Ridge 回归算法在 0 到 1 之间的不同随机 alpha 值。

更多信息请参阅 RandomizedSearchCV API 和用户指南的 随机参数优化 部分。

总结

算法参数调整是应用机器学习中一项重要的步骤,可以在呈现结果或准备系统生产化之前提高算法性能。

在本篇博文中,您了解了算法参数调整以及您现在可以在 Python 和 scikit-learn 库中使用的两种方法来改进您的算法结果,特别是网格搜索和随机搜索。

发现 Python 中的快速机器学习!

Master Machine Learning With Python

在几分钟内开发您自己的模型

...只需几行 scikit-learn 代码

在我的新电子书中学习如何操作
精通 Python 机器学习

涵盖自学教程端到端项目,例如
加载数据可视化建模调优等等...

最终将机器学习带入
您自己的项目

跳过学术理论。只看结果。

查看内容

82 条关于《如何使用 Scikit-Learn 调整算法参数》的回复

  1. Harsh 2014 年 10 月 23 日下午 4:59 #

    总结得很好。我认为由于某些参数之间存在依赖关系,您不能在 GridSearch 中选择任何组合,否则会出错。我写了一篇专门关于 GridSearch 的文章 http://harshtechtalk.com/model-hyperparameter-tuning-scikit-learn-using-gridsearch/

  2. Alex 2016 年 9 月 5 日下午 6:29 #

    先生,这是超参数优化的绝佳介绍。

    我现在在想,一定有一个过程来确定特定参数的最佳参数值范围。例如,在演示 GridSearchCV 时,您使用了 alphas = np.array([1, 0.1, 0.01, 0.001, 0.0001, 0])。什么原则指导您选择这些特定值?我可以在哪里阅读更多关于这些原则的信息——它们是否源于统计学、概率论还是其他?

    还有一点,我仍然是一名机器学习新手,Scikit-learn 算法中用于调整的参数对我来说几乎没有意义。例如,Ridge 模型有“alpha”、“fit_intercept”、“normalize”、“copy_X”、“max_iter”、“tol”、“solver”和“random_state”等参数。这些参数对我来说没有意义,因为我明白我缺乏理解它们的背景。我缺少的是什么背景?

    顺便说一句,我订阅了您的时事通讯,使用的电子邮件与我发表此评论的电子邮件相同。我喜欢您的邮件,非常有见地。如果您也能将回复的副本发送到我的邮箱,我将不胜感激。

    • Jason Brownlee 2016 年 9 月 6 日上午 9:44 #

      你好 Alex,我只是选择了一些常用的 alpha 值作为搜索的起点。这是个好习惯。

      您可以在一系列类似的问题上使用随机搜索,并尝试推断参数设置的原因-结果或启发式方法,但您总是会遇到打破规则的问题。最好同时使用随机搜索和网格搜索来暴露超参数搜索空间的“良好”区域。

      通常只有少数参数在调整算法时起着重要作用。您可以研究特定的算法,找出每个参数的作用以及值的正常范围。一个困难是不同的实现可能暴露不同的参数,并且可能需要仔细阅读实现的文档。基本上,需要大量艰苦的工作。

      希望这有帮助。

  3. Chris Knowles 2016 年 9 月 17 日下午 6:55 #

    您说的“网格搜索和随机搜索的混合”到底是什么意思?能详细说明一下吗?谢谢。

    • Jason Brownlee 2016 年 9 月 18 日上午 7:58 #

      好问题Chris。

      您可以使用随机搜索找到好的起点,然后使用网格搜索来缩小范围并找到这些好的起点的局部最优(或接近)。将这两种方法像手动优化算法一样交替使用。如果您有大量的资源,可以直接使用遗传算法或类似的算法。

  4. Himanshu Rai 2016 年 9 月 28 日上午 3:32 #

    嗨,Jason,
    您能推荐任何关于加速随机搜索实现的材料吗?谢谢。

    • Jason Brownlee 2016 年 9 月 28 日上午 7:42 #

      不,抱歉。使用大量核心进行随机搜索对我来说一直都很有效。

  5. Aizzaac 2016 年 10 月 6 日上午 7:01 #

    什么时候需要进行调整,是在特征选择之前还是之后(我的意思是:前向特征选择、递归特征消除等)?

  6. Ehsan 2016 年 10 月 8 日上午 6:48 #

    谢谢 Jason。
    比如说我们通过网格搜索或随机搜索优化了参数并获得了 0.98 的准确率,那么我们如何知道它是否过拟合了呢?
    我的意思是,我记得在多项式核中,我使用了网格搜索并获得了非常高的准确率,但后来我意识到它可能过拟合了。

    • Jason Brownlee 2016 年 10 月 8 日上午 10:46 #

      非常好的问题 Ehsan。

      您必须开发一个强大的测试工具。请尽力证明您获得的结果是错误的。

      例如
      – 使用 k 折交叉验证
      – 重复多次交叉验证
      – 查看算法在每个 epoch/迭代过程中学习的性能图,并检查测试准确率>训练准确率
      – 预留一个验证数据集用于最终确认
      – 等等。

      希望这些能给你一些思路。

      • Harry 2020 年 3 月 5 日上午 7:26 #

        谢谢。非常翔实!

        大多数时候训练准确率高于测试准确率。那么我们可以将测试准确率>训练准确率视为过拟合的迹象吗?

        • Jason Brownlee 2020 年 3 月 5 日上午 10:34 #

          也许吧。或者测试集代表性不足/太小。

  7. Robin CABANNES 2017 年 2 月 24 日下午 8:33 #

    您好,感谢您的解释。

    但是,当我将网格搜索参数调整与我的模型一起使用时,它总是返回 param_grid 字典的第一个值。例如,如果我写
    param_grid = {
    ‘solver’: [‘lbfgs’,’sgd’,’adam’],
    ‘alpha’: [0.0001,0.00001,0.1,1],
    ‘activation’:[‘relu’,’tanh’],
    ‘hidden_layer_sizes’: [(20)],
    ‘learning_rate_init’: [1,0.01,0.1,0.001],
    ‘learning_rate’:[‘invscaling’,’constant’],
    ‘beta_1’:[0.9],
    ‘max_iter’:[1000],
    ‘momentum’: [0.2,0.6,1],
    }
    它将返回为 best_params
    {‘max_iter’: 1000, ‘activation’: ‘relu’, ‘hidden_layer_sizes’: 20, ‘learning_rate’: ‘invscaling’, ‘alpha’: 0.0001, ‘learning_rate_init’: 1, ‘beta_1’: 0.9, ‘solver’: ‘sgd’, ‘momentum’: 0.2}

    但是,如果我只更改学习率的顺序,例如 ‘learning_rate_init’: [0.001,0.01,0.1,1],它将返回

    {‘max_iter’: 1000, ‘activation’: ‘relu’, ‘hidden_layer_sizes’: 20, ‘learning_rate’: ‘invscaling’, ‘alpha’: 0.0001, ‘learning_rate_init’: 0.001, ‘beta_1’: 0.9, ‘solver’: ‘sgd’, ‘momentum’: 0.2}

    您遇到过这个问题吗?

    我不知道我是否说明白了,

    谢谢,

    • Jason Brownlee 2017 年 2 月 25 日上午 5:55 #

      这很不寻常,我从未见过这个问题。

  8. abhinav 2017 年 6 月 23 日上午 10:21 #

    嗨,Jason,

    如果我对 KNN 中的 k 值进行网格搜索。如果我在拟合 GridSearchCV(cv = 10)之前对整个训练数据集进行标准化,这会不会导致数据泄露?(参考您书中关于参数调整的例子 – 第 21 课)。
    我正在尝试创建一个管道并将其馈送给 GridSearchCV,但我收到一个错误。
    我的做法是这样的:
    estimator = []
    estimator.append((‘Scaler’, StandardScaler()))
    estimator.append((‘KNN’, KNeighborsClassifier))
    model = Pipeline(estimator)
    param_grid = dict(n_neighbors = [1,3,5,7,9])
    kfold = KFold(n_splits = num_folds, random_state = seed)
    grid = GridSearchCV(estimator = model, param_grid = param_grid, scoring = scoring, cv = kfold)
    grid_result = grid.fit(X_train, Y_train)

    您能告诉我我缺少什么吗?

    谢谢

    • Jason Brownlee 2017 年 6 月 24 日上午 7:55 #

      理想情况下,您希望将数据拆分为训练集和测试集,然后将训练集拆分为训练/验证集或交叉验证。所有数据预处理都应在训练集上执行并在验证集上应用,或者在(全部)训练集上执行并在测试集上应用。

  9. Arun 2017 年 7 月 31 日下午 2:33 #

    嗨,Jason,

    我想根据非零 Lasso 系数来选择特征。在此过程中,我对“random_state”变量感到困惑,因为更改其值会导致不同的 R^2 和均方误差 (MSE)。我担心这是否会使我们对输入为特征的数据产生怀疑。

    例如,当我更改 X_test、X_train、y_test 和 y_train 分割的“random_state”时,并且再次使用 Lasso 的“random_state”来减少特征数量时,这种变化是复杂的。

    如果我的目的是仅获得减少的特征,我能否不必担心使用 Lasso 进行特征选择的相应 R^2 和 MSE?或者,我能否识别并使用任何对应于更好 R^2(或 RMSE)值的“random_state”?

    谢谢您,

    • Jason Brownlee 2017 年 7 月 31 日下午 3:52 #

      机器学习算法是随机的,并且大多数在不同的输入数据下表现出方差。

      我建议多次重新运行特征选择,并可能取结果的平均值。或者从每个集合(如果不同)构建一个模型,并比较由此产生的模型的预测性能。

  10. Sah San 2017 年 8 月 21 日上午 12:07 #

    嗨,Jason,
    我们如何知道在 gridsearchcv 或 randomsearch 中应该包含哪些超参数?
    例如,决策树有许多超参数,如
    min_samples_split、min_samples_leaf、min_weight_fraction_leaf、max_features、max_leaf_nodes。

    我不知道是否可以包含所有这些超参数。
    任何评论都将不胜感激。谢谢。

    您的评论正在等待审核。

    • Jason Brownlee 2017 年 8 月 21 日上午 6:08 #

      好问题,一个想法是尝试所有这些。

      根据经验,您会注意到通常只有少数参数最重要。例如,在每次分裂时考虑的特征数量,而其他参数可以推迟到边际效用递减(例如,树的数量)。

  11. Sah San 2017 年 8 月 24 日上午 8:06 #

    谢谢。非常有帮助。

  12. Pranita Pradhan 2017 年 9 月 4 日下午 5:47 #

    你好 Jason,

    感谢您提供的精彩教程。我想对一些患者图像进行多类别分类(使用 OneVsRestClassifier)。现在我处于超参数调整(gridsearchCv)的最后一步,我想使用 Leave-One-Group-Out 交叉验证。我想知道我做得对不对。不幸的是,我没有找到任何关于 gridsearch 和 Leave-One-Group-Out 的例子。
    这是我的代码,

    from sklearn.model_selection import LeaveOneGroupOut
    from sklearn.pipeline import Pipeline, FeatureUnion
    from sklearn.model_selection import GridSearchCV
    from sklearn.multiclass import OneVsRestClassifier
    from sklearn.svm import SVC
    from sklearn.decomposition import PCA
    从 sklearn.feature_selection 导入 SelectKBest
    import numpy as np
    from sklearn.metrics import recall_score
    from sklearn.metrics import classification_report
    from sklearn.metrics import confusion_matrix
    from sklearn.metrics import make_scorer

    X = np.random.rand((10*10)).reshape((10,10))
    y = np.array([1, 2, 2, 2, 1, 2, 1, 2, 1, 2])
    groups = np.array([1, 1, 1, 1, 2, 2, 2, 2, 3, 3])

    pca = PCA(n_components=2)
    selection = SelectKBest(k=1)

    # 构建来自 PCA 和单变量选择的估计器
    combined_features = FeatureUnion([(“pca”, pca), (“univ_select”, selection)])

    # 使用 Leave-One-Out 交叉验证
    logo = LeaveOneGroupOut()

    # 构建一个管道,其中特征通过 PCA 和 KBest 进行选择。
    # 多类别分类通过 OneVsRestClassification 方案执行,该方案使用基于 Leave-One-Out CV 的 SVM 分类器。
    n_components = tuple([1, 2, 3])
    k = tuple([1, 2])
    C = tuple([0.1, 1, 10])

    model_to_set = OneVsRestClassifier(SVC(kernel=”poly”))
    pipeline = Pipeline([(“features”, combined_features), (“clf”, model_to_set)])
    parameters = {‘features__pca__n_components’: n_components,
    ‘features__univ_select__k’:k,
    ‘clf__estimator__C’: C}

    # 使用网格搜索优化参数
    grid_search = GridSearchCV(pipeline, parameters, cv = logo, scoring= make_scorer(recall_score), verbose = 20)
    grid_search.fit(X, y, groups)
    y_pred = grid_search.predict(X)
    print (“\n\n\n Best estimator….. \n %s” %grid_search.best_estimator_)
    print (“\n\n\n Best parameters….. \n %s” %grid_search.best_params_)
    print (“\n\n\n Best score….. \n %0.3f” %grid_search.best_score_)
    scores = grid_search.cv_results_[‘mean_test_score’]

    confusion_matrix(y, y_pred, labels=[1,2])
    target_names = [‘class 1’, ‘class 2’]
    print(classification_report(y, y_pred, target_names=target_names))

  13. Shabnam 2017 年 10 月 9 日下午 5:07 #

    感谢您发表如此精彩的帖子。

    我有一个关于参数的问题。它们会相互影响吗?
    假设有两个参数;a 和 b。
    1. 假设 b 固定并增加 a。假设准确率(acc1)将增加(acc2)。// acc2 > acc1
    2. 更改 b,然后对于新的 b 和新的准确率(acc3),增加 a。准确率(acc3)会随着 a 增加吗?换句话说,acc4 > acc3?或者由于 a 和 b 相关且 b 已更改,acc4 < acc3 也是可能的吗?

    • Jason Brownlee 2017 年 10 月 10 日上午 7:42 #

      是的,它们可以相互作用,这使得单独评估它们存在问题。我们尽力而为。

      • Shabnam 2017 年 10 月 10 日上午 11:38 #

        感谢您的快速回复。

        我还有一个问题。
        我有两组数据。我使用神经网络的 mlp 分类器来建模它们(我使用了本博客中解释的超参数方法),但准确率没有太大变化。它总是大约 50%。有什么可以观察的来了解为什么会这样吗?
        总的来说,有哪些方法可以调试/理解结果?

  14. Tobi Adeyemi 2017 年 11 月 23 日下午 8:12 #

    Jason 你好,你能否推荐任何讨论 Boosting 和 Bagging 方法参数调整的材料?
    谢谢

  15. Tobi Adeyemi 2017年11月24日 晚上11:28 #

    谢谢 Jason

  16. ashish 2018年3月7日 晚上10:23 #

    我们是否应该在单独的交叉验证集上进行网格搜索,然后当我们得到 best_params_ 字典时,我们用这个 best_params_ 在整个训练集上拟合模型?
    或者
    我们甚至可以在整个训练集上进行网格搜索,甚至在同一个训练集上训练整个模型。

  17. Saheli Saha 2018年3月29日 上午8:01 #

    你能否为关联规则算法的参数调整提供一个方法?

    • Jason Brownlee 2018年3月29日 下午3:16 #

      好问题,抱歉,我目前没有一个实际的例子。

  18. Diana 2018年5月27日 上午2:38 #

    你好 Jason,

    1) 在进行 GridSearch 之前,是否有必要对训练集进行标准化缩放?
    2) 我想在使用 xgboost 作为集成学习的元学习器之前对其进行调优。我是否应该将第一层预测结果包含在训练集中?还是只包含原始特征?(我已经尝试了这两种方法,以 F1 分数作为交叉验证指标,第一种方法得到了 1 的网格搜索最佳分数,第二种方法得到了 0.5 的分数)

    • Jason Brownlee 2018年5月27日 上午6:50 #

      这取决于数据和使用的算法。

      xgboost 内部使用决策树。

      您可以在堆叠配置中使用 xgboost。您可以输出其他模型的预测,并将它们转换为一个新的训练数据集来拟合 xgboost 模型。

  19. sndn 2018年7月31日 下午4:18 #

    嗨,是否可以使用网格搜索来选择哪个模型是最好的?

    例如,对于分类问题,是否可以使用网格搜索来选择哪个分类器(例如朴素贝叶斯、SVM、AdaBoost、随机森林等)对于给定数据是最佳的,以及哪些参数?

  20. mesob 2018年8月5日 上午2:35 #

    Jason,在 RandomSearch 中,而不是像这样统一地搜索连续参数,

    from scipy.stats import uniform
    param_grid = {‘C’: uniform(loc=0,scale=1)

    如何实现类似 10^p 的采样,其中 p 是在 [a,b] 之间均匀分布的?谢谢。

    • Jason Brownlee 2018年8月5日 上午5:34 #

      您可以使用循环或列表推导式来创建这样的系列。

      例如

      • mesob 2018年8月5日 上午6:48 #

        谢谢 Jason。我想知道是否有像 uniform 那样生成连续数字的方法?

        当然,遵循您的方法,至少我可以做到
        [10**(x/1000) for x in range(1000,5000)] 如果我想要一个更精细的区间。

  21. Scott Miller 2018年9月22日 上午1:35 #

    你好,在使用 RandomizedSearchCV() 时,是否有方法实现“提前停止”?

    我想在交叉验证成本开始增加时停止。在训练我的神经网络(model = Sequential())时,有些在 10000 个 epoch 内收敛(达到最小成本函数),而有些则需要 150,000 个 epoch。

    目前我需要遍历不同的超参数并自己计算成本。下面的代码嵌入在 bootstrap 和 3 个 for 循环中(1 个用于我正在测试的每个超参数)。我就是无法让提前停止在 GridSearchCV() 或 RandomizedSearchCV() 中工作。

    感谢任何指导。

    ##定义一些回调
    ##history:允许我们访问每个 epoch 数据的 MSE。
    ##EarlyStopping
    early_stopping = EarlyStopping(monitor=’val_loss’, patience=10000)
    ##要传递给模型拟合的回调列表
    call_back=[history, early_stopping]

    ##拟合模型。
    model.fit(X_train_scaled, y_train, validation_data=(X_cv_scaled,y_cv), epochs=n_epochs,
    batch_size=n_batch_train, verbose=0, callbacks=call_back)

    • Jason Brownlee 2018年9月22日 上午6:30 #

      是的,在你的模型中使用 EarlyStopping 回调。具体问题是什么?

  22. Nygline 2018年11月2日 上午6:07 #

    嗨 Jason,你能告诉我 GridSearchCV() 在我们使用 'mean_test_score' 或 'best_score_' 时提供的是哪种分数,我的意思是它是 auc_score 还是其他评估方法?

  23. Muhammad Waseem Akram 2019年3月3日 上午9:46 #

    我想在自编码器上应用 Gridsearch,但我遇到了这个错误。请帮助我。

    ValueError: Invalid shape for y: (30000, 28, 28, 1)
    y 没有问题,因为在自编码器中我们将 x 作为 y 传递

  24. Karan 2019年4月12日 晚上9:00 #

    Jason,
    有没有理由使用 gridsearchcv() 方法来查找 alpha?Ridgecv() 也接受 alpha 数组并找到正确的 alpha。我尝试了这两种方法。这些方法选择的最佳 alpha 存在显著差异。顺便说一句,我使用了您在演示代码中使用的相同糖尿病数据。

    • Jason Brownlee 2019年4月13日 上午6:30 #

      有趣,我想知道不同的方法是否使用了不同的配置,例如 CV。

      或者重复次数是否太少而无法显示有意义的汇总结果。

  25. Sara 2019年5月8日 上午10:15 #

    嗨,Jason,
    在 scikit-learn 文档中

    https://scikitlearn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html#sphx-glr-download-auto-examples-model-selection-plot-nested-cross-validation-iris-py

    它讨论了非嵌套和嵌套交叉验证之间的区别,以及使用 gridsearchcv 作为内循环。
    非嵌套是有意义的,并且与您在本文中写的内容相同,但是,嵌套的令人困惑。
    您是否推荐使用非嵌套和嵌套交叉验证?为什么?
    非常感谢。

    # 加载数据集
    iris = load_iris()
    X_iris = iris.data
    y_iris = iris.target

    # 设置要优化的参数的可能值
    p_grid = {“C”: [1, 10, 100],”gamma”: [.01, .1]}

    # 我们将使用一个具有“rbf”核的支持向量分类器
    svm = SVC(kernel=”rbf”)

    # 非嵌套参数搜索和评分:内循环
    clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=4)
    clf.fit(X_iris, y_iris)
    print (‘non_nested_scores=’, clf.best_score_)

    # 嵌套 CV 与参数优化:外循环
    nested_score = cross_val_score(clf, X=X_iris, y=y_iris, cv=4)
    print (‘Nested_scores=’, nested_score.mean())

    • Jason Brownlee 2019年5月8日 下午2:10 #

      不嵌套,它只是变得太混乱了。一个更简单的测试框架更容易理解,也更不容易出错。

  26. Niez Ghabi 2019年6月19日 上午12:23 #

    嗨,Jason,

    我一直在尝试对神经网络使用 GridSearchCV,但它花费了很长时间,所以我决定尝试 RandomizedSearchCV。
    我之前尝试通过这种方式调整学习率

    learn_rate = [0.001, 0.01, 0.1, 0.2, 0.3]
    param_grid = dict(learn_rate=learn_rate)
    grid = RandomizedSearchCV(estimator=model, param_distributions=param_grid, n_iter=5)

    但我得到了这个错误
    ValueError: learn_rate is not a legal parameter

    你能帮我弄清楚吗,鉴于我没有从网格搜索中得到这个错误?

    谢谢你

  27. Sara 2019年6月20日 上午10:56 #

    我正在使用 SVM 进行分类。在所有数据准备和特征选择之后,当我在未见过的数据上获得了良好的预测后,然后,我调整了 SVM,并且调整后的模型具有很大的 C=1,000,000(惩罚参数)。这个调整后的 SVM 具有很大的 C=1,000,000(在测试数据和交叉验证分割上具有最佳指标评估),但对未见过的数据的预测却非常糟糕。
    我可以不调整超参数 C 和 gamma,而继续使用未调整的 C 和 gamma,它们可以给出良好的预测吗?

    我能说在训练/测试数据上具有最高指标评估的 SVM 不一定能给出最佳预测模型吗?

    • Jason Brownlee 2019年6月20日 下午1:59 #

      结果表明模型可能过拟合了训练数据。

      也许使用验证数据集来调整模型
      https://machinelearning.org.cn/difference-test-validation-datasets/

      • Moin Khan 2019年8月23日 下午1:32 #

        在 Python 中,逻辑回归有两种应用方式
        1) sklearn.logisticmodel()
        2) stats.logit()
        逻辑回归只给出最终预测
        Logit 模型给出包含 P 值、系数、截距等的摘要以及预测。

        我想通过 randomCV 运行 stats.logit(),它应该给我一个摘要。但是 stats.logit() 无法与 randomCV 一起工作,我在这里遇到问题。
        请给我建议。

        • Jason Brownlee 2019年8月23日 下午2:11 #

          您可能需要将 statsmodels 的实现包装在一个适合使用 sklearn 处理的类中。

          抱歉,我没有例子。

  28. adane 2019年12月5日 晚上7:08 #

    但是你能告诉我如何将其用于 CNN 吗?

  29. Carolina 2019年12月22日 上午3:31 #

    是否有方法使用 GridSearchCV 来使用特定的验证集而不是交叉验证来查找最佳超参数?

    • Jason Brownlee 2019年12月22日 上午6:17 #

      不能使用 gridsearchcv,它是为使用交叉验证而设计的。

      您可以使用自己的 for 循环遍历超参数,然后手动拟合/评估模型。

  30. daniele baranzini 2020年1月27日 晚上7:03 #

    Jason,说在划分训练集和测试集后,我们用 gridsearchcv 调整训练集……以提高测试集的交叉验证,这是正确的吗?

    • Jason Brownlee 2020年1月28日 上午7:52 #

      不行。

      与训练集一起。
      使用验证集进行调整。
      使用测试集进行评估。

      更多信息在这里
      https://machinelearning.org.cn/difference-test-validation-datasets/

      • daniele baranzini 2020年1月28日 晚上7:18 #

        那么使用验证集调整超参数(例如,使用 gridsearchcv)?(不是在训练集或测试集上)

        我理解对了吗? :)

        你好!来自意大利

        • Jason Brownlee 2020年1月29日 上午6:32 #

          是的。尽管可以通过 grid searching API 自动将训练集划分为训练集和验证集。

          这实际上是 grid search cv 在做的事情。

  31. felix 2020年6月5日 上午3:48 #

    Jason,如何使用 sklearn 对 Bernoulli Naive Bayes 分类器进行超参数调整?我正在尝试使用 GridSearch CV,如何为参数设置 alpha?

  32. Rahul 2020年8月9日 上午6:24 #

    嗨,Jason,
    在 Grid Search 中,最佳估计器是具有 scoring 函数中给出的最佳指标的估计器,但我发现该参数设置的 mean_train_score 和 mean_test_score 之间存在很大差异。在这种情况下我们该怎么办?

    • Jason Brownlee 2020年8月10日 上午5:42 #

      当使用小的或无代表性的测试集时,可能会出现这种情况。

      也许确认训练集和测试集的大小和组成是相同的。

  33. irma 2020年8月9日 下午5:31 #

    你好,

    我不确定那为什么是最好的结果。如果您使用 Ridge,它应该找到损失最小的模型(Ridge 正在最小化最小二乘函数)。如果我使用您的代码打印网格搜索的所有结果

    means = grid_result.cv_results_[‘mean_test_score’]
    stds = grid_result.cv_results_[‘std_test_score’]
    params = grid_result.cv_results_[‘params’]
    for mean, stdev, param in zip(means, stds, params)
    print(“%f (%f) with: %r” % (mean, stdev, param))

    我得到
    0.410176 (0.044979) with: {‘alpha’: 1.0}
    0.479884 (0.047264) with: {‘alpha’: 0.1}
    0.481444 (0.048503) with: {‘alpha’: 0.01}
    0.482309 (0.049028) with: {‘alpha’: 0.001}
    0.482323 (0.049236) with: {‘alpha’: 0.0001}
    0.482318 (0.049266) with: {‘alpha’: 0.0}

    很明显,最小分数是 0.41,alpha = 1,对吗?或者我完全错了?

    P.S. 训练分数的结果也一样
    0.435197 (0.009882) with: {‘alpha’: 1.0}
    0.513133 (0.008521) with: {‘alpha’: 0.1}
    0.518137 (0.008749) with: {‘alpha’: 0.01}
    0.519445 (0.008983) with: {‘alpha’: 0.001}
    0.519506 (0.008996) with: {‘alpha’: 0.0001}
    0.519506 (0.008996) with: {‘alpha’: 0.0}

    如何选择最小损失?

    • Jason Brownlee 2020年8月10日 上午5:47 #

      是的,我们寻找产生最小损失的配置。

      网格搜索将告诉您表现最佳的模型和结果

  34. Kus 2021年7月26日 下午3:55 #

    你好 Jason 先生。我需要使用进化算法搜索进行超参数调整,我想我会在这里找到。你能建议我一个有效的链接或文档吗?我尝试了自己操作,但遇到了错误。

Leave a Reply

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。