机器学习模型被参数化,以便它们的行为可以针对特定问题进行调整。
模型可以有很多参数,找到最佳参数组合可以被视为一个搜索问题。
在本篇博文中,您将学习如何使用 scikit-learn 库在 Python 中调整机器学习算法的参数。
开始您的项目,请阅读我的新书《Python 机器学习精通》,其中包含分步教程和所有示例的Python 源代码文件。
让我们开始吧。
- 2017年1月更新:更新以反映 scikit-learn 0.18 版本中的 API 变化。

调整算法就像调整钢琴
图片由 Katie Fricker 提供,部分权利保留
机器学习算法参数
算法调整是应用机器学习过程中在呈现结果之前的最后一步。
它有时被称为 超参数优化,其中算法参数被称为超参数,而机器学习算法本身找到的系数被称为参数。优化表明了问题的搜索性质。
将其视为一个搜索问题,您可以使用不同的搜索策略来找到给定问题的算法的一个好的、鲁棒的参数或一组参数。
两种简单易行的搜索策略是网格搜索和随机搜索。Scikit-learn 提供了这两种算法参数调整方法,下面提供了它们的示例。
网格搜索参数调整
网格搜索是一种参数调整方法,它将系统地构建和评估在网格中指定的每个算法参数组合的模型。
下面的示例在标准的糖尿病数据集上评估了 Ridge 回归算法的不同 alpha 值。这是一个一维网格搜索。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 算法调整的网格搜索 import numpy as np from sklearn import datasets from sklearn.linear_model import Ridge from sklearn.model_selection import GridSearchCV # 加载糖尿病数据集 dataset = datasets.load_diabetes() # 准备一系列 alpha 值进行测试 alphas = np.array([1,0.1,0.01,0.001,0.0001,0]) # 创建并拟合一个岭回归模型,测试每个 alpha 值 model = Ridge() grid = GridSearchCV(estimator=model, param_grid=dict(alpha=alphas)) grid.fit(dataset.data, dataset.target) print(grid) # 总结网格搜索结果 print(grid.best_score_) print(grid.best_estimator_.alpha) |
更多信息请参阅 GridSearchCV API 和用户指南的 穷举网格搜索 部分。
随机搜索参数调整
随机搜索是一种参数调整方法,它将在固定数量的迭代中从随机分布(例如均匀分布)中采样算法参数。将为选择的每个参数组合构建和评估一个模型。
下面的示例在标准的糖尿病数据集上评估了 Ridge 回归算法在 0 到 1 之间的不同随机 alpha 值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 算法调整的随机搜索 import numpy as np from scipy.stats import uniform as sp_rand from sklearn import datasets from sklearn.linear_model import Ridge from sklearn.model_selection import RandomizedSearchCV # 加载糖尿病数据集 dataset = datasets.load_diabetes() # 为 alpha 参数准备一个均匀分布进行采样 param_grid = {'alpha': sp_rand()} # 创建并拟合一个岭回归模型,测试随机 alpha 值 model = Ridge() rsearch = RandomizedSearchCV(estimator=model, param_distributions=param_grid, n_iter=100) rsearch.fit(dataset.data, dataset.target) print(rsearch) # 总结随机参数搜索结果 print(rsearch.best_score_) print(rsearch.best_estimator_.alpha) |
更多信息请参阅 RandomizedSearchCV API 和用户指南的 随机参数优化 部分。
总结
算法参数调整是应用机器学习中一项重要的步骤,可以在呈现结果或准备系统生产化之前提高算法性能。
在本篇博文中,您了解了算法参数调整以及您现在可以在 Python 和 scikit-learn 库中使用的两种方法来改进您的算法结果,特别是网格搜索和随机搜索。
总结得很好。我认为由于某些参数之间存在依赖关系,您不能在 GridSearch 中选择任何组合,否则会出错。我写了一篇专门关于 GridSearch 的文章 http://harshtechtalk.com/model-hyperparameter-tuning-scikit-learn-using-gridsearch/
先生,这是超参数优化的绝佳介绍。
我现在在想,一定有一个过程来确定特定参数的最佳参数值范围。例如,在演示 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”等参数。这些参数对我来说没有意义,因为我明白我缺乏理解它们的背景。我缺少的是什么背景?
顺便说一句,我订阅了您的时事通讯,使用的电子邮件与我发表此评论的电子邮件相同。我喜欢您的邮件,非常有见地。如果您也能将回复的副本发送到我的邮箱,我将不胜感激。
你好 Alex,我只是选择了一些常用的 alpha 值作为搜索的起点。这是个好习惯。
您可以在一系列类似的问题上使用随机搜索,并尝试推断参数设置的原因-结果或启发式方法,但您总是会遇到打破规则的问题。最好同时使用随机搜索和网格搜索来暴露超参数搜索空间的“良好”区域。
通常只有少数参数在调整算法时起着重要作用。您可以研究特定的算法,找出每个参数的作用以及值的正常范围。一个困难是不同的实现可能暴露不同的参数,并且可能需要仔细阅读实现的文档。基本上,需要大量艰苦的工作。
希望这有帮助。
您说的“网格搜索和随机搜索的混合”到底是什么意思?能详细说明一下吗?谢谢。
好问题Chris。
您可以使用随机搜索找到好的起点,然后使用网格搜索来缩小范围并找到这些好的起点的局部最优(或接近)。将这两种方法像手动优化算法一样交替使用。如果您有大量的资源,可以直接使用遗传算法或类似的算法。
嗨,Jason,
您能推荐任何关于加速随机搜索实现的材料吗?谢谢。
不,抱歉。使用大量核心进行随机搜索对我来说一直都很有效。
什么时候需要进行调整,是在特征选择之前还是之后(我的意思是:前向特征选择、递归特征消除等)?
你好 Aizzaac,
我建议在您抽查了多种方法后进行模型调整。我认为这是为了改进有效的方法并充分利用它们,而不是为了找到可能有效的方法。
这个分步过程可能会让事情更清楚。
https://machinelearning.org.cn/start-here/#process
谢谢 Jason。
比如说我们通过网格搜索或随机搜索优化了参数并获得了 0.98 的准确率,那么我们如何知道它是否过拟合了呢?
我的意思是,我记得在多项式核中,我使用了网格搜索并获得了非常高的准确率,但后来我意识到它可能过拟合了。
非常好的问题 Ehsan。
您必须开发一个强大的测试工具。请尽力证明您获得的结果是错误的。
例如
– 使用 k 折交叉验证
– 重复多次交叉验证
– 查看算法在每个 epoch/迭代过程中学习的性能图,并检查测试准确率>训练准确率
– 预留一个验证数据集用于最终确认
– 等等。
希望这些能给你一些思路。
谢谢。非常翔实!
大多数时候训练准确率高于测试准确率。那么我们可以将测试准确率>训练准确率视为过拟合的迹象吗?
也许吧。或者测试集代表性不足/太小。
您好,感谢您的解释。
但是,当我将网格搜索参数调整与我的模型一起使用时,它总是返回 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,
如果我对 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,
我想根据非零 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,
我们如何知道在 gridsearchcv 或 randomsearch 中应该包含哪些超参数?
例如,决策树有许多超参数,如
min_samples_split、min_samples_leaf、min_weight_fraction_leaf、max_features、max_leaf_nodes。
我不知道是否可以包含所有这些超参数。
任何评论都将不胜感激。谢谢。
您的评论正在等待审核。
好问题,一个想法是尝试所有这些。
根据经验,您会注意到通常只有少数参数最重要。例如,在每次分裂时考虑的特征数量,而其他参数可以推迟到边际效用递减(例如,树的数量)。
谢谢。非常有帮助。
很高兴听到这个消息!
你好 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))
抱歉,我无法审查您的代码。
感谢您发表如此精彩的帖子。
我有一个关于参数的问题。它们会相互影响吗?
假设有两个参数;a 和 b。
1. 假设 b 固定并增加 a。假设准确率(acc1)将增加(acc2)。// acc2 > acc1
2. 更改 b,然后对于新的 b 和新的准确率(acc3),增加 a。准确率(acc3)会随着 a 增加吗?换句话说,acc4 > acc3?或者由于 a 和 b 相关且 b 已更改,acc4 < acc3 也是可能的吗?
是的,它们可以相互作用,这使得单独评估它们存在问题。我们尽力而为。
感谢您的快速回复。
我还有一个问题。
我有两组数据。我使用神经网络的 mlp 分类器来建模它们(我使用了本博客中解释的超参数方法),但准确率没有太大变化。它总是大约 50%。有什么可以观察的来了解为什么会这样吗?
总的来说,有哪些方法可以调试/理解结果?
我建议在每个 epoch 查看模型在训练集和测试集上的技能。请参阅这篇关于诊断的文章。
https://machinelearning.org.cn/diagnose-overfitting-underfitting-lstm-models/
这篇文章是关于 LSTM 的,但同样适用于 MLP。
非常感谢您的快速回复和帮助。
当然,我会看看的。谢谢。
没问题,告诉我您的进展。
Jason 你好,你能否推荐任何讨论 Boosting 和 Bagging 方法参数调整的材料?
谢谢
两者都可以,你可以简单地增加树的数量,直到达到收益递减点。这将是一个很好的起点。
我在这里有关于 xgboost(梯度提升)参数调整的信息
https://machinelearning.org.cn/start-here/#xgboost
谢谢 Jason
不客气。
我们是否应该在单独的交叉验证集上进行网格搜索,然后当我们得到 best_params_ 字典时,我们用这个 best_params_ 在整个训练集上拟合模型?
或者
我们甚至可以在整个训练集上进行网格搜索,甚至在同一个训练集上训练整个模型。
好问题。我在这里回答
https://machinelearning.org.cn/difference-test-validation-datasets/
你能否为关联规则算法的参数调整提供一个方法?
好问题,抱歉,我目前没有一个实际的例子。
你好 Jason,
1) 在进行 GridSearch 之前,是否有必要对训练集进行标准化缩放?
2) 我想在使用 xgboost 作为集成学习的元学习器之前对其进行调优。我是否应该将第一层预测结果包含在训练集中?还是只包含原始特征?(我已经尝试了这两种方法,以 F1 分数作为交叉验证指标,第一种方法得到了 1 的网格搜索最佳分数,第二种方法得到了 0.5 的分数)
这取决于数据和使用的算法。
xgboost 内部使用决策树。
您可以在堆叠配置中使用 xgboost。您可以输出其他模型的预测,并将它们转换为一个新的训练数据集来拟合 xgboost 模型。
嗨,是否可以使用网格搜索来选择哪个模型是最好的?
例如,对于分类问题,是否可以使用网格搜索来选择哪个分类器(例如朴素贝叶斯、SVM、AdaBoost、随机森林等)对于给定数据是最佳的,以及哪些参数?
网格搜索将调整超参数。
模型选择涉及比较经过良好调整的模型。使用统计假设检验来帮助识别平均性能更好的模型是否确实更好,这可能是一个好主意。
请看这篇文章
https://machinelearning.org.cn/statistical-significance-tests-for-comparing-machine-learning-algorithms/
Jason,在 RandomSearch 中,而不是像这样统一地搜索连续参数,
from scipy.stats import uniform
param_grid = {‘C’: uniform(loc=0,scale=1)
如何实现类似 10^p 的采样,其中 p 是在 [a,b] 之间均匀分布的?谢谢。
您可以使用循环或列表推导式来创建这样的系列。
例如
谢谢 Jason。我想知道是否有像 uniform 那样生成连续数字的方法?
当然,遵循您的方法,至少我可以做到
[10**(x/1000) for x in range(1000,5000)] 如果我想要一个更精细的区间。
据我所知,没有。
你好,在使用 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)
是的,在你的模型中使用 EarlyStopping 回调。具体问题是什么?
嗨 Jason,你能告诉我 GridSearchCV() 在我们使用 'mean_test_score' 或 'best_score_' 时提供的是哪种分数,我的意思是它是 auc_score 还是其他评估方法?
它将使用默认值,这对于分类问题来说可能是准确率。
指定 "scoring" 参数,其值为
https://scikit-learn.cn/stable/modules/model_evaluation.html#scoring-parameter
谢谢 Jason,我明白了……我们可以在 'scoring' 参数中指定我们想要的指标。
是的。
我想在自编码器上应用 Gridsearch,但我遇到了这个错误。请帮助我。
ValueError: Invalid shape for y: (30000, 28, 28, 1)
y 没有问题,因为在自编码器中我们将 x 作为 y 传递
我建议使用手动网格搜索,例如
https://machinelearning.org.cn/how-to-grid-search-deep-learning-models-for-time-series-forecasting/
对于自编码器,应该使用 KerasRegressor。其余的都一样
Jason,
有没有理由使用 gridsearchcv() 方法来查找 alpha?Ridgecv() 也接受 alpha 数组并找到正确的 alpha。我尝试了这两种方法。这些方法选择的最佳 alpha 存在显著差异。顺便说一句,我使用了您在演示代码中使用的相同糖尿病数据。
有趣,我想知道不同的方法是否使用了不同的配置,例如 CV。
或者重复次数是否太少而无法显示有意义的汇总结果。
嗨,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,
我一直在尝试对神经网络使用 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
你能帮我弄清楚吗,鉴于我没有从网格搜索中得到这个错误?
谢谢你
如果您使用的是 Keras,也许可以尝试这种方法
https://machinelearning.org.cn/how-to-grid-search-deep-learning-models-for-time-series-forecasting/
我正在使用 SVM 进行分类。在所有数据准备和特征选择之后,当我在未见过的数据上获得了良好的预测后,然后,我调整了 SVM,并且调整后的模型具有很大的 C=1,000,000(惩罚参数)。这个调整后的 SVM 具有很大的 C=1,000,000(在测试数据和交叉验证分割上具有最佳指标评估),但对未见过的数据的预测却非常糟糕。
我可以不调整超参数 C 和 gamma,而继续使用未调整的 C 和 gamma,它们可以给出良好的预测吗?
我能说在训练/测试数据上具有最高指标评估的 SVM 不一定能给出最佳预测模型吗?
结果表明模型可能过拟合了训练数据。
也许使用验证数据集来调整模型
https://machinelearning.org.cn/difference-test-validation-datasets/
在 Python 中,逻辑回归有两种应用方式
1) sklearn.logisticmodel()
2) stats.logit()
逻辑回归只给出最终预测
Logit 模型给出包含 P 值、系数、截距等的摘要以及预测。
我想通过 randomCV 运行 stats.logit(),它应该给我一个摘要。但是 stats.logit() 无法与 randomCV 一起工作,我在这里遇到问题。
请给我建议。
您可能需要将 statsmodels 的实现包装在一个适合使用 sklearn 处理的类中。
抱歉,我没有例子。
但是你能告诉我如何将其用于 CNN 吗?
是的,你可以从这里开始
https://machinelearning.org.cn/start-here/#dlfcv
是否有方法使用 GridSearchCV 来使用特定的验证集而不是交叉验证来查找最佳超参数?
不能使用 gridsearchcv,它是为使用交叉验证而设计的。
您可以使用自己的 for 循环遍历超参数,然后手动拟合/评估模型。
Jason,说在划分训练集和测试集后,我们用 gridsearchcv 调整训练集……以提高测试集的交叉验证,这是正确的吗?
不行。
与训练集一起。
使用验证集进行调整。
使用测试集进行评估。
更多信息在这里
https://machinelearning.org.cn/difference-test-validation-datasets/
那么使用验证集调整超参数(例如,使用 gridsearchcv)?(不是在训练集或测试集上)
我理解对了吗? :)
你好!来自意大利
是的。尽管可以通过 grid searching API 自动将训练集划分为训练集和验证集。
这实际上是 grid search cv 在做的事情。
Jason,如何使用 sklearn 对 Bernoulli Naive Bayes 分类器进行超参数调整?我正在尝试使用 GridSearch CV,如何为参数设置 alpha?
这可能有帮助
https://scikit-learn.cn/stable/modules/generated/sklearn.naive_bayes.BernoulliNB.html
也许可以测试一系列值。
嗨,Jason,
在 Grid Search 中,最佳估计器是具有 scoring 函数中给出的最佳指标的估计器,但我发现该参数设置的 mean_train_score 和 mean_test_score 之间存在很大差异。在这种情况下我们该怎么办?
当使用小的或无代表性的测试集时,可能会出现这种情况。
也许确认训练集和测试集的大小和组成是相同的。
你好,
我不确定那为什么是最好的结果。如果您使用 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 先生。我需要使用进化算法搜索进行超参数调整,我想我会在这里找到。你能建议我一个有效的链接或文档吗?我尝试了自己操作,但遇到了错误。
这可能有助于您入门
https://machinelearning.org.cn/simple-genetic-algorithm-from-scratch-in-python/