将单词袋scikit分类器与任意数字字段合并



如何将一个对一袋单词进行操作的scikit学习分类器与一个对任意数字字段进行操作的分类器合并?

我知道这些在幕后基本上是一样的,但我很难弄清楚如何通过现有的库方法来做到这一点。例如,我的单词袋分类器使用管道:

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分类器?例如

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

简单的方法:

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)

原则性的解决方案是将哈希、tf-idf和其他特征提取方法封装在几个简单的transformer对象中,并将它们放在FeatureUnion中,这样可以将所有内容都保存在一个Pipeline中,但很难从您提供的信息中判断出代码的样子。

(附言:正如我在SO、邮件列表和其他地方一直说的那样,OneVsRestClassifier(LinearSVC())是无用的。LinearSVC开箱即用地进行OvR,所以这只是一种更慢的OvR-SVM拟合方法。)

相关内容

  • 没有找到相关文章

最新更新