gpt4 book ai didi

python - 将先前 sklearn 管道步骤中的对象属性作为参数传递给下一步方法

转载 作者:行者123 更新时间:2023-12-05 05:09:46 24 4
gpt4 key购买 nike

tl;dr:有没有什么方法可以调用 .get_feature_names() 拟合 and 上一步转换后的数据在管道的下一步中用作超参数的管道?


我有一个 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: 名称 'vect' 未定义

编辑:

如果我正在调制 TfidfVectorizer 的参数(例如 ngram_range),这就更相关(并且没有在示例代码中解释),人们可以看到这会如何改变输出到下一步的特征数量...

最佳答案

参数网格在管道中的任何东西都被拟合之前就已经填充了,所以你不能直接这样做。您也许可以对网格搜索进行猴子修补,like here ,但我预计它会更加困难,因为您的第二个参数取决于第一步的拟合结果。

我认为最好的方法是只为 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 的 retrofit 副本,其第二步本身将具有最佳值max_features 和相应的 retrofit 随机森林)。此外,内部搜索可用的数据会少一些。

关于python - 将先前 sklearn 管道步骤中的对象属性作为参数传递给下一步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57233743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com