我正在尝试使用Scikit-learn创建一个简单的问题分类器。目前,我能够使用Scikit的计数矢量器功能使用单词袋方法将问题分类到相应的类中。现在,我想使用计数矢量化器生成的现有特征创建和添加自定义特征。
假设我想创建检查电话号码是否存在问题的功能,以及另一个将提取问题长度的功能。
那么生成和合并所有特征的方法是什么?
从这个链接,我尝试了这个模板进行自定义特征提取
'from sklearn.base import BaseEstimator, TransformerMixin
类 SampleExtractor(BaseEstimator, TransformerMixin):
def __init__(self, vars):
self.vars = vars # e.g. pass in a column name to extract
def transform(self, X, y=None):
return do_something_to(X, self.vars) # where the actual feature extraction happens
def fit(self, X, y=None):
return self # generally does nothing`
但是当我使用计数矢量器将其输出放入管道中时,例如
ppl = Pipeline([
('feats', FeatureUnion([
('ngram', CountVectorizer()), # can pass in either a pipeline
('ave', SampleExtractor()) # or a transformer
])),
('clf', LinearSVC()) # classifier
])
我收到错误
值错误:块[0,:] 具有不兼容的行维度
我认为此错误可能是由于两个特征的矩阵维度不同,但我不明白如何解决它。
> CountVectorizer
的方法transform
返回一个文档术语矩阵,其行对应于文档,列对应于术语。矩阵的第 (i,j)-个元素显示第 j 项在第 i 个文档中出现的次数。您所要做的就是在此矩阵中添加更多列,这些列对应于新功能。
示例:假设列表doc_len
包含以单词为单位的文档长度,并且您的文档术语矩阵M
。然后代码:
M_arr = M.toarray()
assert len(doc_len) == M_arr.shape[0]
np.append(M_arr,np.array(doc_len),axis=1)
将在包含新功能的矩阵末尾添加一个新列。您可以对其他新功能重复此过程。扩展矩阵可以以通常的方式馈送到您正在使用的任何分类器。