我试图构建一个包含2个组件的服务。在组件1中,我通过创建Pipeline
使用sklearn来训练机器学习模型。这个模型使用joblib.dump
(真的是numpy_pickle.dump
)被序列化。组件2运行在云中,加载由(1)训练的模型,并用它来标记它作为输入获取的文本。保存binarizer与sklearn模型
我遇到了一个问题,在培训期间(组件1),我需要先对数据进行二进制化处理,因为它是文本数据,这意味着该模型将在二进制输入上进行训练,然后使用创建的映射进行预测由二进制器。 (2)根据模型进行预测时,我需要得到这个映射,以便我可以输出实际的文本标签。
我尝试添加的二值化的管道像这样,认为该模型将不得不映射本身:
p = Pipeline([
('binarizer', MultiLabelBinarizer()),
('vect', CountVectorizer(min_df=min_df, ngram_range=ngram_range)),
('tfidf', TfidfTransformer()),
('clf', OneVsRestClassifier(clf))
])
,但我得到了以下错误:
model = p.fit(training_features, training_tags)
*** TypeError: fit_transform() takes 2 positional arguments but 3 were given
我的目标是以确保二进制器和模型连接在一起,以便消费者知道如何解码模型的输出。
这样做有什么现有的范例?我应该在我创建的其他对象中将二进制器与模型一起序列化吗?有没有其他方法可以将二进制文件传递给Pipeline
,这样我就不必这样做了,如果我这样做了,我能从模型中获得映射吗?
感谢您的建议!我认为这很接近,但还没有奏效。我使用了你建议的类定义作为管道中的第一步,但是我得到'*** AttributeError:'numpy.ndarray'对象没有属性'lower''。我认为最后一行应该以'fit_transform(y)'结尾,因为我想要转换标记,而不是输入文本,但即使我修复了这个问题,由于_pre_transform被写入的方式也会导致相同的错误标签最终会覆盖'Xt = transform.fit_transform(Xt,y,** fit_params_steps [name])')中的训练数据。也许我还错过了什么? – LateCoder