Scikit learn 使用TfidfVectorizer和Scikit learn的支持向量机的TF-IDF精度较低

Scikit learn 使用TfidfVectorizer和Scikit learn的支持向量机的TF-IDF精度较低,scikit-learn,svm,feature-extraction,tf-idf,text-classification,Scikit Learn,Svm,Feature Extraction,Tf Idf,Text Classification,我试图使用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()

我试图使用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个文本。

我认为在将TF-IDF矩阵输入SVM之前,您可能需要减少TF-IDF矩阵,因为SVM不太擅长处理大型稀疏矩阵。我建议使用截断SVD来降低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_分量
,以找到要保留的最佳分量数。

我认为您可能希望在将TF-IDF矩阵馈送到SVM之前减少它,因为SVM不太擅长处理大型稀疏矩阵。我建议使用截断SVD来降低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_组件
,以找到要保留的组件的最佳数量。

您可能希望发布一个混淆矩阵或更多度量,而不仅仅是准确性。我也是。。。。。。。。。这是难以置信的低,考虑到当使用一些聚类算法时,它非常正确地选择了组关键字。你可能想发布一个混淆矩阵或更多的度量,而不仅仅是准确性。我也是。。。。。。。。。考虑到当使用一些聚类算法时,它非常正确地选择了组关键字我无法让它工作,got error
TypeError:unbound method fit_transform()必须以管道实例作为第一个参数调用(改为got list instance)
@knokkelgedon,您是否调用了
fit_transform
作为管道
的一种方法?你能告诉我发生此错误的脚本行吗?当我添加截断SVD:)时,精确度从50%降低到30%。我无法让它工作,get error
TypeError:unbound method fit_transform()必须以管道实例作为第一个参数调用(改为get list instance)
@Knokelgeddon,您是否调用了
fit_transform
作为管道
的一种方法?你能告诉我发生这个错误的脚本行吗?当我添加TruncatedSVD:)时,它将准确性从50%降低到了30%