具有参数分布的随机搜索CV问题?

2024-09-28 03:21:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在对RandomizedSearchCV进行拟合,这是我的管道和参数网格

我将此作为估计值传递:

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

我把它作为参数传递

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()`.

如果您有任何建议,我将不胜感激

编辑:

S示例代码:

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)

编辑3:

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


Tags: trueparamstepsgridprobabilitypipegammaestimator
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和一个接受参数C的估计器estimator,因此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]})

因此,一般的结论是,将pipeline.get_params().keys()中的参数名用作grid_params确实是正确的解决方案。这个问题是因为我犯了一个可怕的错误,不确定我是否应该删除它(多余的-关于这个主题已经提出了几个问题,我认为这是一个不同的情况,但事实证明这只是我在代码的不同部分犯的错误)

相关问题 更多 >

    热门问题