机器学习 - 如何创建自定义特征提取器函数,并将其与Scikit-learn管道中的countvectorizer一起使



我正在尝试使用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)

将在包含新功能的矩阵末尾添加一个新列。您可以对其他新功能重复此过程。扩展矩阵可以以通常的方式馈送到您正在使用的任何分类器。

相关内容

  • 没有找到相关文章

最新更新