使用 TfidfVectorizer 和 Scikit-learn 的 TF-IDF 与 SVM 的低准确度

Posted

技术标签:

【中文标题】使用 TfidfVectorizer 和 Scikit-learn 的 TF-IDF 与 SVM 的低准确度【英文标题】:Low accuracy for TF-IDF with SVM using TfidfVectorizer and Scikit-learn 【发布时间】:2016-10-11 06:13:17 【问题描述】:

我正在尝试使用 TF-IDF 和 SVM 将文档分类为欺骗性或真实性。我知道这之前已经完成,但我不太确定我是否正确实施。我有一个文本语料库,并且正在构建 TF-IDF,例如

vectorizer = TfidfVectorizer(min_df=1, binary=0, use_idf=1, smooth_idf=0, sublinear_tf=1)
tf_idf_model = vectorizer.fit_transform(corpus)
features = tf_idf_model.toarray()

对于分类:

seed = random.random()
random.seed(seed)
random.shuffle(features)
random.seed(seed)
random.shuffle(labels)

features_folds = np.array_split(features, folds)
labels_folds = np.array_split(labels, folds)

for C_power in C_powers:
    scores = []
    start_time = time.time()
    svc = svm.SVC(C=2**C_power, kernel='linear')

    for k in range(folds):       
        features_train = list(features_folds)
        features_test = features_train.pop(k)
        features_train = np.concatenate(features_train)
        labels_train = list(labels_folds)
        labels_test = labels_train.pop(k)
        labels_train = np.concatenate(labels_train)
        scores.append(svc.fit(features_train, labels_train).score(features_test, labels_test))

    print(scores)

但我收到的准确率约为 50%。我的语料库是 1600 条文本。

【问题讨论】:

您可能想要发布混淆矩阵或更多指标,而不仅仅是准确性。 我也是............考虑到当使用一些聚类算法时它非常正确地选择组关键字这一事实,这真是令人难以置信的低 【参考方案1】:

我认为您可能希望在将 TF-IDF 矩阵输入 SVM 之前对其进行缩减,因为 SVM 不太擅长处理大型稀疏矩阵。我建议使用 TruncatedSVD 来降低 TF-IDF 矩阵的维数。

vectorizer = TfidfVectorizer(min_df=1, binary=0, use_idf=1, smooth_idf=0, sublinear_tf=1)
svd = TruncatedSVD(n_components=20)

pipeline = Pipeline([
    ('tfidf', vectorizer),
    ('svd', svd)])

features = pipeline.fit_transform(corpus)

当然,您需要调整 n_components 以找到要保留的最佳组件数量。

【讨论】:

我无法让它工作,出现错误TypeError: unbound method fit_transform() must be called with Pipeline instance as first argument (got list instance instead) @Knokkelgeddon,您是否将fit_transform 作为Pipeline 的方法调用?您能告诉我发生此错误的脚本行吗? 当我添加 TruncatedSVD 时,它的准确率从 50% 降低到 30% :)

以上是关于使用 TfidfVectorizer 和 Scikit-learn 的 TF-IDF 与 SVM 的低准确度的主要内容,如果未能解决你的问题,请参考以下文章

在实践中如何使用 TfidfVectorizer 和元数据进行分类?

如何使用 TfIdfVectorizer 查找重要单词?

如何从TfidfVectorizer计算余弦相似度?

NotFittedError:TfidfVectorizer - 未安装词汇

TfidfVectorizer.fit_transfrom 和 tfidf.transform 有啥区别?

为 TfidfVectorizer 使用准备数据(scikit learn)