管道对象的超参数调整

Posted

技术标签:

【中文标题】管道对象的超参数调整【英文标题】:Hyper parameter tuning on pipeline object 【发布时间】:2019-01-07 10:25:47 【问题描述】:

我有这个管道,

pl = Pipeline([
    ('union', FeatureUnion(
        transformer_list = [
            ('numeric_features', Pipeline([
                ("selector", get_numeric_data),
        ])),
            ('text_features', Pipeline([
                ("selector",get_text_data),
                ("vectorizer", HashingVectorizer(token_pattern=TOKENS_ALPHANUMERIC,non_negative=True, norm=None, binary=False, ngram_range=(1,2))),
                ('dim_red', SelectKBest(chi2, chi_k))
            ]))
         ])), ("clf",LogisticRegression())
    ])

当我尝试做的时候

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
c_space = np.logspace(-5, 8, 15)
param_grid = "C": c_space,"penalty": ['l1', 'l2']
logreg_cv = GridSearchCV(pl,param_grid=param_grid,cv=5)
logreg_cv.fit(X_train,y_train)

它把我扔了

ValueError:估计器的参数惩罚无效 管道(内存=无, 步骤=[('联合',FeatureUnion(n_jobs = 1, transformer_list=[('numeric_features', Pipeline(memory=None, 步骤=[('选择器',FunctionTransformer(accept_sparse=False, func= 在 0x00000190ECB49488>,inv_kw_args=None, inverse_func=None, kw_args=None, pass_y=...ty='l2', random_state=None, 求解器='liblinear',tol=0.0001, 详细=0,warm_start=False))])。检查可用参数列表 estimator.get_params().keys()

虽然在这种情况下“C”和“penalty”是合法参数。请帮我锄头去做。

【问题讨论】:

【参考方案1】:

“C”和“penalty”是 LogisticRegression 的合法参数,而不是您发送到 GridSearchCV 的 Pipeline 对象。

您的管道目前有两个组件,"union""clf"。现在管道不知道要发送参数的哪一部分。您需要将管道中使用的这些名称附加到参数中,以便它可以识别它们并将它们发送到正确的对象。

这样做:

param_grid = "clf__C": c_space,"clf__penalty": ['l1', 'l2']

注意管道中的对象名称和参数之间有两个下划线。

Pipeline and FeatureUnion here的文档中提到:

管道中估计器的参数可以使用 __ 语法

用各种例子来演示用法。

接下来,如果你想说改变HashingVectorizer的ngram_range,你可以这样做:

"union__text_features__vectorizer__ngram_range" : [(1,3)]

【讨论】:

以上是关于管道对象的超参数调整的主要内容,如果未能解决你的问题,请参考以下文章

实现 GridSearchCV 和 Pipelines 以执行 KNN 算法的超参数调整

TensorFlow 的超参数调整

调整 SVR 的超参数 [关闭]

我们应该按啥顺序调整神经网络中的超参数?

机器学习调参自动优化方法

随机森林中的超参数调整