首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化元估计器

优化元估计器
EN

Stack Overflow用户
提问于 2018-02-10 19:31:03
回答 1查看 292关注 0票数 0

我正在尝试使用scikit learn的GridSearchCV函数来找到一些基本模型的最佳参数,然后将这些参数输入到堆叠估计器中。

我的代码基于这篇文章(我用它来说明):https://stats.stackexchange.com/questions/139042/ensemble-of-different-kinds-of-regressors-using-scikit-learn-or-any-other-pytho/274147

我想对我的估计器的参数执行网格搜索(主要是岭参数,KNN中的邻居数量,以及RF深度和溢出),但我不能让它工作。我定义模型,如下所示:

代码语言:javascript
复制
from sklearn.base import TransformerMixin
from sklearn.datasets import make_regression
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.linear_model import LinearRegression, Ridge

class RidgeTransformer(Ridge, TransformerMixin):

    def transform(self, X, *_):
        return self.predict(X)


class RandomForestTransformer(RandomForestRegressor, TransformerMixin):

    def transform(self, X, *_):
        return self.predict(X)


class KNeighborsTransformer(KNeighborsRegressor, TransformerMixin):

    def transform(self, X, *_):
        return self.predict(X)


def build_model():
    ridge_transformer = Pipeline(steps=[
        ('scaler', StandardScaler()),
        ('poly_feats', PolynomialFeatures()),
        ('ridge', RidgeTransformer())
    ])

    pred_union = FeatureUnion(
        transformer_list=[
            ('ridge', ridge_transformer),
            ('rand_forest', RandomForestTransformer()),
            ('knn', KNeighborsTransformer())
        ],
        n_jobs=2
    )

    model = Pipeline(steps=[
         ('pred_union', pred_union),
         ('lin_regr', LinearRegression())
    ])

return model

现在,我想对森林的参数运行CV。我可以通过以下命令获取参数:

代码语言:javascript
复制
print(model.get_params().keys())

但是当我运行下面的代码时,我仍然得到一个错误:

代码语言:javascript
复制
pipe = Pipeline(steps=[('reg', model)])

parameters = {'pred_union__rand_forest__n_estimators':[20, 50, 100, 200]}

g_search = GridSearchCV(pipe, parameters)

X, y = make_regression(n_features=10, n_targets=2)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

g_search.fit(X_train, y_train)

Invalid parameter pred_union for estimator Pipeline(memory=None,
 steps=[('reg', Pipeline(memory=None,
 steps=[('pred_union', FeatureUnion(n_jobs=2,
   transformer_list=[('ridge', Pipeline(memory=None,
 steps=[('scaler', StandardScaler(copy=True, with_mean=True, with_std=True)), ('poly_feats', PolynomialFeatures(degree=2, include_bias=True, interaction_only=False)), ('ridge', RidgeTransformer(...=None)), ('lin_regr', LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False))]))]). Check the list of available parameters with `estimator.get_params().keys()`.

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-12 21:19:13

您的model实际上已经是一个管道,那么为什么还要将其再次包装在管道中呢?不需要pipe = Pipeline(steps=[('reg', model)])。只要在网格搜索中使用model即可。

但是,如果您希望将其包装在管道中并正常工作,则需要通过将'reg'附加到每个名称来更新参数。

代码语言:javascript
复制
parameters = {'reg__pred_union__rand_forest__n_estimators':[20, 50, 100, 200]}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48720275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档