将上一个sklearn流水线步骤中的对象属性作为参数传递给下一步方法。

问题描述 投票:2回答:1

闲话少说: 有什么办法可以叫 .get_feature_names() 契合度上 将上一步管道中的转化数据作为下一步管道中的超参数?


我有一个 Pipeline 其中包括用以下方法对文本数据进行拟合和转换 TfidfVectorizer,然后运行一个 RandomForestClassifier. 我想... GridSearchCV 各级 max_features 在分类器中,基于从文本中转换产生的特征数量。

#setup pipeline
pipe = Pipeline([
    ('vect', TfidfVectorizer(max_df=.4,
                            min_df=3,
                            norm='l1',
                            stop_words='english',
                            use_idf=False)),
    ('rf', RandomForestClassifier(random_state=1,
                                  criterion='entropy',
                                  n_estimators=800))
])

#setup parameter grid
params = {
    'rf__max_features': np.arange(1, len(vect.get_feature_names()),1)
}

实例化返回以下错误。

NameError: name 'vect' is not defined

编辑。

如果我修改了分类器的一个参数,这就更有意义了(在示例代码中没有说明)。TfidfVectorizer 诸如 ngram_range我们可以看到这将如何改变下一步输出的特征数量......

python pipeline random-forest tfidfvectorizer gridsearchcv
1个回答
1
投票

在管道中的任何东西被拟合之前,参数网格会被填充,所以你不能直接这样做。 你也许可以对gridsearch进行猴子补丁。来这里但我认为这很难,因为你的第二个参数取决于第一步的拟合结果。

我认为最好的方法,虽然它不会产生你想要的东西,但只是使用小数值来表示 max_features即从向量器出来的列的百分比。

如果你真的想知道每一个整数的分值 max_features我认为最简单的方法可能是有两个嵌套的网格搜索,内侧的网格只在实例化参数空间时,其 fit 被调用。

estimator = RandomForestClassifier(
    random_state=1,
    criterion='entropy',
    n_estimators=800
    )

class MySearcher(GridSearchCV):
    def fit(self, X, y):
        m = X.shape[1]
        self.param_grid = {'max_features': np.arange(1, m, 1)}
        return super().fit(X, y)

pipe = Pipeline([
    ('vect', TfidfVectorizer(max_df=.4,
                             min_df=3,
                             norm='l1',
                             stop_words='english',
                             use_idf=False)),
    ('rf', MySearcher(estimator=estimator, 
                      param_grid={'fake': ['passes', 'check']}))
])

现在,搜索结果将是尴尬的嵌套(最好的值,比如说: ngram_range 给你一本 pipe,其第二步本身的最佳值为 max_features 以及相应的重新组合的随机森林)。) 另外,可用于内部搜索的数据会更小一些。

© www.soinside.com 2019 - 2024. All rights reserved.