【问题标题】:Python vectorization for classification [duplicate]用于分类的 Python 矢量化 [重复]
【发布时间】:2014-09-08 11:49:21
【问题描述】:

我目前正在尝试构建一个包含大约 80 个类的文本分类模型(文档分类)。当我使用随机森林构建和训练模型时(在将文本向量化为 TF-IDF 矩阵之后),模型运行良好。但是,当我引入新数据时,我用来构建 RF 的单词不一定与训练集相同。这是一个问题,因为我的训练集中的特征数量与测试集中的特征数量不同(因此训练集的维度小于测试)。

####### Convert bag of words to TFIDF matrix
tfidf_vectorizer = TfidfVectorizer()
tfidf_matrix = tfidf_vectorizer.fit_transform(data)
print tfidf_matrix.shape
## number of features = 421


####### Train Random Forest Model
clf = RandomForestClassifier(max_depth=None,min_samples_split=1, random_state=1,n_jobs=-1)

####### k-fold cross validation
scores = cross_val_score(clf, tfidf_matrix.toarray(),labels,cv=7,n_jobs=-1)
print scores.mean()


### this is the new data matrix for unseen data
new_tfidf = tfidf_vectorizer.fit_transform(new_X)
### number of features = 619


clf.fit(tfidf_matrix.toarray(),labels)
clf.predict(new_tfidf.toarray())

我如何才能创建一个有效的用于分类的 RF 模型,该模型将包含训练中没有看到的新特征(单词)?

【问题讨论】:

    标签: python scikit-learn vectorization random-forest


    【解决方案1】:

    不要在看不见的数据上调用fit_transform,只调用transform!这将使字典远离训练集。

    【讨论】:

    • 这行得通,你能简单解释一下为什么吗?谢谢
    • 您不能考虑训练期间不存在的特征。因此变压器会忽略它们。
    【解决方案2】:

    您不能将不属于您的训练集的新功能引入测试集中。该模型在特定的术语字典上进行训练,并且必须在训练、验证、测试和生产过程中使用相同的术语字典。此外,特征向量中单词的索引也不能改变。

    您应该使用所有数据创建一个大型矩阵,然后将行拆分为您的训练集和测试集。这将保证您将拥有相同的训练和测试功能集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 2019-07-06
      • 2017-06-15
      • 2017-06-21
      • 1970-01-01
      相关资源
      最近更新 更多