Cer*_*rin 12 python scikit-learn
你如何调用partial_fit()包裹在Pipeline()中的scikit-learn分类器?
我正在尝试使用以下方法构建一个可递增训练的文本分类器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())),
])
Run Code Online (Sandbox Code Playgroud)
但我AttributeError试着打电话classifier.partial_fit(x,y).
它支持fit(),所以我不明白为什么partial_fit()不可用.是否可以内省管道,调用数据转换器,然后直接调用partial_fit()我的分类器?
mey*_*son 11
这就是我正在做的事情 - '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)
Run Code Online (Sandbox Code Playgroud)
您可能希望在不断调整/更新分类器时跟踪性能 - 但这是次要问题
更具体地说 - 原始管道的构造如下
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))])
Run Code Online (Sandbox Code Playgroud)
google DataFrameMapper可以了解有关它的更多信息 - 但这里它只是启用了一个与熊猫一起玩的转换步骤
管道不使用partial_fit,因此不会暴露它.我们可能需要一个用于核外计算的专用流水线方案,但这也取决于先前模型的功能.
特别是在这种情况下,您可能希望对数据进行多次传递,一次适合管道的每个阶段,然后转换数据集以适应下一个数据集,除了第一阶段是无状态的,因此不适合来自数据的参数.
与此同时,根据您的需求推出自己的包装代码可能更容易.
| 归档时间: |
|
| 查看次数: |
5261 次 |
| 最近记录: |