闲话少说: 有什么办法可以叫 .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
我们可以看到这将如何改变下一步输出的特征数量......
在管道中的任何东西被拟合之前,参数网格会被填充,所以你不能直接这样做。 你也许可以对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
以及相应的重新组合的随机森林)。) 另外,可用于内部搜索的数据会更小一些。