如何将 TF_IDF 矢量化器与自定义特征相结合

Posted

技术标签:

【中文标题】如何将 TF_IDF 矢量化器与自定义特征相结合【英文标题】:How to Combine a TF_IDF Vectorizer with a Custom Feature 【发布时间】:2019-07-11 11:18:05 【问题描述】:

我正在尝试构建一个模型,该模型结合了来自数据框的数字特征和来自数据框的文本特征。但是,我在成功组合这些功能、使用这些功能进行训练、然后测试这些功能时遇到了很多麻烦。

现在我正在尝试像这样使用 DataFrameMapper:

from sklearn.feature_extraction.text import TfidfTransformer
from sklearn_pandas import DataFrameMapper


mapper = DataFrameMapper([
     ('body', TfidfVectorizer()),
     ('numeric_feature', None),

 ]) 

for train_index, test_index in kFold.split(DF['body']):

    # Split the dataset by Kfold

    X_train = even_rand[['body','numeric_feature']].iloc[train_index]
    y_train = even_rand['sub_class'].iloc[train_index]


    X_test = even_rand[['body','numeric_feature']].iloc[test_index]
    y_test = even_rand['sub_class'].iloc[test_index]

    # Vectorize/transform docs

    X_train = mapper.fit_transform(X_train)
    X_test = mapper.fit_transform(X_test)



    # Get SVM
    svm = SGDClassifier(loss='hinge', penalty='l2',
                                            alpha=1e-3, n_iter=5, random_state=10)
    svm.fit(X_train, y_train)
    svm_score = svm.score(X_test, y_test)

这成功地结合了数据并训练了数据,但是当我尝试测试数据时,特征似乎没有正确匹配,并且出现错误

ValueError: X 每个样本有 49974 个特征;期待 87786

有人知道如何解决这个问题或知道将数字和文本特征结合/训练/测试的更好方法吗?如果可能的话,我还想将这些特征保持为稀疏矩阵。

【问题讨论】:

【参考方案1】:

代替:

X_train = mapper.fit_transform(X_train)
X_test = mapper.fit_transform(X_test) 

尝试:

X_train = mapper.fit_transform(X_train)
X_test = mapper.transform(X_test) # change fit_transform to transform

【讨论】:

@walker_4 对于稀疏输出,在映射器初始化中使用sparse 参数,如DataFrameMapper( ..., sparse=True)

以上是关于如何将 TF_IDF 矢量化器与自定义特征相结合的主要内容,如果未能解决你的问题,请参考以下文章

将 NLTK 文本特征与 sklearn 向量化特征相结合

架构师成长记_第八周_11_ES- ik中文分词器与自定义中文词库

OpenCV:如何将 HOGDescriptor::detectMultiScale() 与自定义 SVM 一起使用?

如何转换自定义矢量化器以预测分类?

使用 TF_IDF 提取特征后如何使用朴素贝叶斯分类器

如何使用朴素贝叶斯实现 TF_IDF 特征加权