【问题标题】:Sklearn: GridSearchCV over n_iter parameterSklearn:在 n_iter 参数上的 GridSearchCV
【发布时间】:2018-03-21 12:31:58
【问题描述】:

Sklearn recommends 认为对于迭代估计器,迭代次数应由 .fit()n_iter 参数指定。

使用GridSearchCV 对最优超参数运行网格搜索允许您仅指定可使用estimator.set_params() 设置的参数的值范围。

所以我想知道,如何运行网格搜索(以及其他)迭代次数? 一种解决方案是更改估算器代码,以便在构造函数中设置n_iter,并由.set_params() 设置,但由于某种原因,明确不建议这样做,如上所述。

编辑: 这是一个例子:

创建一个需要两个参数的估算器:

estimator = SomeEstimator(alpha=5, theta=0.001)

您可以使用fit() 方法在数据 X 和标签 y 上拟合估计器。此外,假设估算器运行迭代算法,您可以指定它应该运行多少次。 Sklearn 建议为此使用fit() 函数的参数n_iter

estimator.fit(X, y, n_iter=4)

要找到 alpha 和 theta 的最佳参数值,您可以运行 GridSearchCV,它针对这些参数的所有组合运行 estimator.fit()

GridSearchCV(estimator, {'alpha':[5, 6], 'theta':[0.1, 0.01, 0.001]}).fit(X, y, n_iter=4)

这将运行 alpha/theta 组合的估算器:

(5, 0.1)
(5, 0.01)
(5, 0.001)
(6, 0.1)
(6, 0.01)
(6, 0.001)

但我想将这六种组合用于n_iter (1..10) 的不同值。当然我可以使用 for 循环,但这不是 GridSearchCV 的重点。

【问题讨论】:

  • 你能用一个例子更好地解释一下吗?
  • 我加了一个例子
  • 好的,但是n_iter 是超参数吗?

标签: python scikit-learn grid-search


【解决方案1】:

您可以使用GridSearchCV 来找到最佳的n_iter 超参数,并以与其他超参数相同的方式将其作为参数的估计器。以下作品可在 sklearn 0.19.0

上找到
np.random.seed(42)
clf = SGDClassifier()
params = {'n_iter': [30, 50, 100], 'alpha': [0.01, 0.1, 1.0]}
gs = GridSearchCV(clf, params, scoring='accuracy', cv=5)
X = np.random.random((100, 5))
y = np.random.choice([0, 1], 100)
gs.fit(X, y)
print gs.best_params_

输出:

{'alpha': 0.1, 'n_iter': 30}

【讨论】:

  • 在当前版本中已弃用,将被删除。这就是为什么我问这个问题是否被认为是有效的超参数。我认为不应该是这样。
  • 您能指出这是文档的位置吗?我可以看到 fit_params 已被弃用,但看不到任何表明这不起作用的东西。此外,我似乎没有收到未来的警告(除了为 SGDClassifier 抛出的警告)
  • 我并不是说它不会像你描述的那样工作。它会。但在 0.19 中,SGDClassifier 不推荐使用此参数。看below the n_iter here 但我的意思是,n_iter 通常不应被视为超参数,因为在大多数情况下,调整总是会选择更大的n_iter。这取决于要跨越的损失的threshold。所以我们可以间接地拥有其他更好地代表这一点的参数。
  • 啊,我明白你的意思了。我同意大多数时候都是这种情况。
  • 在许多情况下,估计器的性能会(或几乎)停滞在n_iter 的某个值上。在那种情况下,找到那个值会很有趣。在那种情况下,只看gridsearch选择的最佳参数确实没有多大意义。但是您可以使用 gridsearch 例如绘制采样的超参数表面,然后包含 n_iter 是非常有意义的。
猜你喜欢
  • 2020-01-16
  • 2017-08-23
  • 2020-07-14
  • 2020-06-18
  • 2021-08-22
  • 2018-02-08
  • 2014-11-14
  • 2015-06-28
  • 1970-01-01
相关资源
最近更新 更多