使用sklearn和tf-idf变换的针对20Newsgroup数据集做文本分类

20News数据集:包含了20种不同类型新闻的文档组合。下载地址:http://qwone.com/~jason/20Newsgroups/
(虽然才15M但是下了N久,最后发现不用下载anaconda还要在自动下一遍)
首先import进来数据集,并使用subset='test'或'train'从数据集里得到训练集和测试集。
导入Tfidfvectorizer用来对数据集和测试集进行向量空间模型处理
train使用vectorizer.fit_transform得到转化后的训练集
test使用vectorizer.transform到转化后的测试集(如果用vectorizer.fit_transform 在预测时会报错)
X_train即转化后的训练集,Y_train为转化前的训练集.target。test同理。
然后就是熟悉的把Xtrain、Ytrain放入某个model里fit一下,再把Xtest放入model里predict一下然后得到预测的y。
同时把xtest和实际ytest(target)放入model里score一下进行模型的评估。
使用sklearn和tf-idf变换的针对20Newsgroup数据集做文本分类
文章图片

贴上直接调用的代码,为了精确一些没有随机取维等降低时间。

# -*- coding: utf-8 -*- """ Created on Wed Jan2 14:22:28 2019@author: 71405 """from sklearn.datasets import fetch_20newsgroups as news from sklearn.feature_extraction.text import TfidfVectorizer def naive_bayes_classifier(train_x, train_y):#朴素贝叶斯 from sklearn.naive_bayes import MultinomialNB model = MultinomialNB(alpha=0.01) model.fit(train_x, train_y) return modeldef knn_classifier(train_x, train_y):#knn from sklearn.neighbors import KNeighborsClassifier model = KNeighborsClassifier() model.fit(train_x, train_y) return modeldef logistic_regression_classifier(train_x, train_y):#逻辑回归树 from sklearn.linear_model import LogisticRegression model = LogisticRegression(penalty='l2') model.fit(train_x, train_y) return modeldef random_forest_classifier(train_x, train_y):#随机森林 from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(n_estimators=8) model.fit(train_x, train_y) return modeldef decision_tree_classifier(train_x, train_y):#决策树 from sklearn import tree model = tree.DecisionTreeClassifier() model.fit(train_x, train_y)return model def svm_classifier(train_x, train_y):#svm from sklearn.svm import SVC model = SVC(kernel='rbf', probability=True) model.fit(train_x, train_y) return modeltrain=news(subset='train') test=news(subset='test')vectorizer = TfidfVectorizer() #词频逆文本频率,把一段话转化为向量 train_v=vectorizer.fit_transform(train.data) test_v=vectorizer.transform(test.data) model=svm_classifier(train_v,train.target) #多次调用不同函数获取结果 y_predict=model.predict(test_v) s=model.score(test_v,test.target)

最后更换模型评估如下:
分类算法 R^2
KNN 0.659
SVM ---
朴素贝叶斯 0.835
逻辑回归 0.825
随机森林 0.530
决策树 0.550
【使用sklearn和tf-idf变换的针对20Newsgroup数据集做文本分类】SVM运行了好久都没跑出来---

    推荐阅读