将partial_fit与Scikit Pipeline一起使用

时间:2013-07-29 18:50:01

标签: python scikit-learn

如何在Pipeline()内包含的scikit-learn分类器上调用partial_fit()

我正在尝试使用SGDClassifier构建一个可递增训练的文本分类器,如:

from sklearn.linear_model import SGDClassifier
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.multiclass import OneVsRestClassifier

classifier = Pipeline([
    ('vectorizer', HashingVectorizer(ngram_range=(1,4), non_negative=True)),
    ('tfidf', TfidfTransformer()),
    ('clf', OneVsRestClassifier(SGDClassifier())),
])

但我得AttributeError试图致电classifier.partial_fit(x,y)

它支持fit(),所以我不明白为什么partial_fit()不可用。是否可以内省管道,调用数据转换器,然后直接在我的分类器上调用partial_fit()

2 个答案:

答案 0 :(得分:7)

管道不使用partial_fit,因此不会公开它。我们可能需要一个用于核外计算的专用流水线方案,但这也取决于之前模型的功能。

特别是在这种情况下,您可能希望对数据进行多次传递,一次适合管道的每个阶段,然后转换数据集以适应下一个数据集,除了第一阶段是无状态的,因此不适合数据中的参数。

与此同时,根据您的需求推出自己的包装代码可能更容易。

答案 1 :(得分:7)

这就是我正在做的事情 - 'mapper'和'clf'是我的Pipeline obj中的两个步骤。

def partial_pipe_fit(pipeline_obj, df):
    X = pipeline_obj.named_steps['mapper'].fit_transform(df)
    Y = df['class']
    pipeline_obj.named_steps['clf'].partial_fit(X,Y)

您可能希望在不断调整/更新分类器时跟踪性能 - 但这是次要的

更具体地说 - 原始管道的构造如下

to_vect = Pipeline([('vect', CountVectorizer(min_df=2, max_df=.9, ngram_range=(1, 1), max_features = 100)),
                            ('tfidf', TfidfTransformer())])
full_mapper = DataFrameMapper([
            ('norm_text', to_vect),
            ('norm_fname', to_vect), ])

full_pipe = Pipeline([('mapper', full_mapper), ('clf', SGDClassifier(n_iter=15, warm_start=True,
                                                                n_jobs=-1, random_state=self.random_state))])

google DataFrameMapper可以了解有关它的更多信息 - 但这里它只启用了一个与pandas相处的转换步骤