gpt4 book ai didi

python-3.x - 如何在 scikit-learn 管道的步骤之间传递值?

转载 作者:行者123 更新时间:2023-12-04 03:10:54 25 4
gpt4 key购买 nike

我想使用一个管道,它使用 Vectorizer,然后是 LDA 预处理步骤。 LDA 预处理步骤需要 Vectorizer 的 vocabulary_。

如何将拟合 Vectorizer 步骤的 vocabulary_ 传递到下一个 LDA 步骤?我试图将管道本身传递给 LDA 步骤,但不幸的是这不起作用。

    pipe_full = Pipeline(
[('vect', StemmedCountVectorizer(strip_accents='unicode', analyzer='word')),
('lda', SklLdaModel_mod()),
('clf', SGDClassifier(loss='log', penalty='elasticnet', n_iter=5, random_state=42, class_weight={0: 1, 1: 2}))])
param_grid_full = [{'vect__ngram_range': ((1, 1), (1, 2)), 'vect__stop_words': (None, 'english'),
'vect__token_pattern': (r'(?u)\b\w\w+\b', r'(?u)\b([a-zA-Z]{3,})\b'),
'vect__stemmer': (None, SnowCastleStemmer(mode='NLTK_EXTENSIONS')),
'lda': (None, SklLdaModel_mod(id2word=pipe_full, num_topics=10), SklLdaModel_mod(id2word=pipe_full, num_topics=20)),
# 'lda__topics': (100, 200),
# 'lda__topics': (10, 20), # for testing purposes only
'clf__alpha': (1e-4, 5e-4)}]

...在 SklLdaModel_mod 的 fit 方法中我有:

    if isinstance(self.id2word, Pipeline):
try:
self.id2word = {v: k for k, v in self.id2word.named_steps['vect'].vocabulary_.items()}

有什么建议如何做到这一点?

最佳答案

@维维克,

不幸的是,这不起作用,因为 Vectorizer 也应该在管道内进行优化。查看不同的参数。

我想出的解决方案有点老套:

class XAmplifierForLDA(TransformerMixin, BaseEstimator):
"""
This class amplifies the return value of the transform method of a model to include the vocab information for the
id2word parameter of the LDA model
"""
def __init__(self, model=None):
self.model = model

def fit(self, *args, **kwargs):
self.model.fit(*args, **kwargs)
return self

def transform(self, X, **transform_params):
"""
This assumes model has a vocabulary
:param X:
:param transform_params:
:return:
"""
return {'transformed': self.model.transform(X), 'vocab': self.model.vocabulary_}

def set_params(self, **parameters):
self.model.set_params(**parameters)
return self

def get_params(self, deep=True):
""" return the parameters of the inner model """
return {'model': self.model}

然后我将 CountVectorizer 包装在这个 XAmplifierLDA 中,然后它将返回一个字典,其中除了词汇表之外还包含转换后的 X!

 pipe_full = Pipeline(
[('vect', XAmplifierForLDA(model=StemmedCountVectorizer(strip_accents='unicode', analyzer='word'))),
('lda', SklLdaModel_mod()),
('clf', SGDClassifier(loss='log', penalty='elasticnet', n_iter=5, random_state=42, class_weight={0: 1, 1: 2}))])

然后 SklLdaModel_mod 类负责正确解释字典。

关于如何更干净地实现它的任何其他想法?

关于python-3.x - 如何在 scikit-learn 管道的步骤之间传递值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45419380/

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