【发布时间】:2015-06-07 08:56:23
【问题描述】:
我正在尝试使用 scikit-learn 实现一个分层文本分类器,其中一个“根”分类器将所有输入字符串排列在大约 50 个类别中的一个(或多个)中。对于这些类别中的每一个,我将训练一个新的分类器来解决实际任务。
这种两层方法的原因是训练性能和内存问题(本应分离 >1k 类的分类器表现不佳......)。
这就是我的管道对于每个“子分类器”的样子
pipeline = Pipeline([
('vect', CountVectorizer(strip_accents=None, lowercase=True, analyzer='char_wb', ngram_range=(3,8), max_df=0.1)),
('tfidf', TfidfTransformer(norm='l2')),
('feat', SelectKBest(chi2, k=10000)),
('clf', OneVsRestClassifier(SGDClassifier(loss='log', penalty='elasticnet', alpha=0.0001, n_iter=10))),
])
现在我的问题是:我使用SelectKBest 将模型大小限制在合理的范围内,但是对于子分类器,有时没有足够的可用输入数据,所以我什至没有达到 10k 特征限制,这会导致
(...)
File "/usr/local/lib/python3.4/dist-packages/sklearn/feature_selection/univariate_selection.py", line 300, in fit
self._check_params(X, y)
File "/usr/local/lib/python3.4/dist-packages/sklearn/feature_selection/univariate_selection.py", line 405, in _check_params
% self.k)
ValueError: k should be >=0, <= n_features; got 10000.Use k='all' to return all features.
如果不应用CountVectorizer,我不知道我会有多少功能,但我必须提前定义管道。我的首选解决方案是跳过SelectKBest 步骤,如果无论如何都少于k 功能,但我不知道如何在不调用CountVectorizer 的情况下实现此行为两次(一次提前,一次作为管道)。
对此有什么想法吗?
【问题讨论】:
标签: python scikit-learn