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字典只需要使用分类器超参数的名称,例如:C
和gamma
。
另一方面,如果您将管道传递给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)