合并词袋scikits分类器与任意数字字段

时间:2013-11-20 21:01:41

标签: python classification scikit-learn

你如何合并一个scikits-learn classifier,它在一个单词包上运行,而且可以在任意数字字段上运行?

我知道这些在幕后基本上是相同的,但我无法通过现有的库方法找出如何做到这一点。例如,我的词袋分类器使用管道:

classifier = Pipeline([
    ('vectorizer', HashingVectorizer(ngram_range=(1,4), non_negative=True)),
    ('tfidf', TfidfTransformer()),
    ('clf', OneVsRestClassifier(LinearSVC())),
])
classifier.fit(['some random text','some other text', ...], [CLS_A, CLS_B, ...])

而我的其他用法如下:

classifier = LinearSVC()
classifier.fit([1.23, 4.23, ...], [CLS_A, CLS_B, ...])

我如何构建一个可以使用两组数据进行训练的LinearSVC分类器? e.g。

classifier = ?
classifier.fit([('some random text',1.23),('some other text',4.23), ...], [CLS_A, CLS_B, ...])

1 个答案:

答案 0 :(得分:6)

简单方法:

import scipy.sparse

tfidf = Pipeline([
    ('vectorizer', HashingVectorizer(ngram_range=(1,4), non_negative=True)),
    ('tfidf', TfidfTransformer()),
])
X_tfidf = tfidf.fit_transform(texts)

X_other = load_your_other_features()

X = scipy.sparse.hstack([X_tfidf, X_other)

clf = LinearSVC().fit(X, y)

允许您将所有内容保存在一个Pipeline中的原则解决方案是将散列,tf-idf和您的其他特征提取方法包装在一些简单的变换器对象中,并将它们放在{{1但是很难从你给出的信息中分辨出代码的样子。

(PS正如我在SO上说的那样,在邮件列表和其他地方,FeatureUnion是无用的。OneVsRestClassifier(LinearSVC()) OvR开箱即用,所以这只是一种适合OvR的慢速方式SVM。)

相关问题