RandomizedSearchCV - param_distrubitions 的问题? [关闭]

Posted

技术标签:

【中文标题】RandomizedSearchCV - param_distrubitions 的问题? [关闭]【英文标题】:RandomizedSearchCV - problem with param_distrubitions? [closed] 【发布时间】:2020-08-25 12:53:15 【问题描述】:

我正在适应 RandomizedSearchCV,这是我的管道和 param_grid

我将其作为估算器传递:

pipe_rand_svc=MyPipeline(steps=[('standardscaler',StandardScaler()),
                                ('randsc',RandomizedSearchCV(SVC(probability=True),
                         param_grid))])

我将其作为 param_distributions 传递

param_grid='randsc__estimator__C':[1E-2,1E-1,1,10,100],'randsc__estimator__gamma':[1E-2,1E-1,1,10,100]

以上是我跑步得到的名字

pipe_rand_svc.get_params().keys()

但我仍然收到此错误:

ValueError: Invalid parameter randsc for estimator SVC(C=1, break_ties=False, cache_size=200, class_weight=None,
    coef0=0.0, decision_function_shape='ovr', degree=3,
    gamma=1, kernel='rbf', max_iter=-1, probability=True,
    random_state=None, shrinking=True, tol=0.001, verbose=False). Check the list of available parameters with `estimator.get_params().keys()`.

不胜感激!

编辑:

简单代码:

X1,y1=make_classification()
param_grid='C':[1E-2,1E-1,1,10,100],'gamma':[1E-2,1E-1,1,10,100]
pipe_rand_svc=MyPipeline(steps=[('standardscaler',StandardScaler()),('randsc',RandomizedSearchCV(SVC(probability=True),param_grid))])
a=RandomizedSearchCV(estimator=pipe_rand_svc,param_distributions=param_grid)
a=a.fit(X1,y1)

编辑2:

奇怪的是,这就像一个魅力:

param_grid='svc__C':[1E-2,1E-1,1,10,100],'svc__gamma':[1E-2,1E-1,1,10,100]
pipe_svc=MyPipeline(steps=[('standardscaler',StandardScaler()),('svc',SVC(probability=True))])
b=GridSearchCV(estimator=pipe_svc,param_grid=param_grid)
b=b.fit(X1,y1)

EDIT3:

是的,我知道我做了什么。将 RandomizedSearchCV 传递到管道中,然后尝试再次运行 RandomizedSearchCV ......向所有相关人员道歉。睡眠恶化正在造成损失。

【问题讨论】:

为什么每个参数前都有randsc__estimator__ 这就是钥匙。遇到相同错误消息问题的人通常不使用键作为参数名称(关于此错误消息有很多问题,使用键通常是建议的修复方法。但对我不起作用)。 请使用一些虚拟数据(例如使用 scikit-learn make_classification)发布minimal reproducible example;使用您在此处提供的零碎信息很难进行调试。 没问题,就是这么做的,make_classification 很方便! 【参考方案1】:

因此,总体而言,将pipeline.get_params().keys() 中的参数名称用作grid_params 确实是正确的解决方案。这个问题是我的巨大错误造成的,不确定我是否应该删除它(冗余 - 已经就该主题提出了几个问题,我认为这是一个不同的情况,但事实证明这只是我在代码的不同部分的错误)。

【讨论】:

【参考方案2】:

您是否尝试过仅删除 randsc__estimator__ 前缀?我尝试运行您的代码(进行了一些修改)并且没有前缀。

param_grid='C':[1E-2,1E-1,1,10,100],'gamma':[1E-2,1E-1,1,10,100]

从对象实例pipe_rand_svc的角度来看,它确实有一个名为randsc的管道对象,其中包含一个RandomizedSearchCV和一个估计器estimator,它接受一个参数C,所以randsc__estimator__C是有意义的.

但是,如果你只看这个:

RandomizedSearchCV(SVC(probability=True), param_grid))

RandomizedSearchCV 被实例化时,它不知道也不关心它在管道中。从它的角度来看,它直接与SVC分类器打交道,因此params字典只需要使用分类器超参数的名称,例如:Cgamma

另一方面,如果您将管道传递给RandomizedSearchCV(而不仅仅是一个分类器),那么您需要更具体的语法。例如:

params_C = numpy.linspace(0, 2, 40)

ppl = Pipeline([('preprocessor', preprocessor),
                ('classifier', LogisticRegression(max_iter=500))])

gs = GridSearchCV(ppl,
                  param_grid='classifier__C': params_C,
                  cv=KFold(10, shuffle=True))

在这里,我将管道传递给GridSearchCV,所以现在我需要更具体地说明我指的是哪些参数。

有一些特殊情况需要使用estimator__。例如,如果您的分类器被包裹在 OneVsRestClassifier 中,estimator 将引用 OneVsRestClassifier 实例,而您将引用 SVC 实例的 C 超参数,如下所示:

ppl = Pipeline([('clf', OneVsRestClassifier(SVC(verbose=True)))])
GridSearchCV(ppl, 'clf__estimator__C': [0.01, 0.1, 1])

【讨论】:

刚刚发布了示例代码,更改为“C”和“gamma”并不能解决问题。我真的在黑暗中跌跌撞撞,但也许这会有所帮助:我尝试使用 GridSearchCV 和 pipe_svc=MyPipeline(steps=[('standardscaler',StandardScaler()),('svc',SVC(probability =True))]) 并且完全没有问题。

以上是关于RandomizedSearchCV - param_distrubitions 的问题? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何为 RandomizedSearchCV 使用预定义拆分

RandomizedSearchCV - param_distrubitions 的问题? [关闭]

sklearn:在 RandomizedSearchCV 中使用管道?

将随机变量传递给 sklearn 随机搜索 (RandomizedSearchCV)

我如何知道 RandomizedSearchCV 测试了哪些参数?

sklearn 使用带有自定义指标的 RandomizedSearchCV 并捕获异常