使用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一下进行模型的评估。

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

# -*- coding: utf-8 -*-
"""
Created on Wed Jan  2 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 model  

def knn_classifier(train_x, train_y):      #knn
    from sklearn.neighbors import KNeighborsClassifier      
    model = KNeighborsClassifier()      
    model.fit(train_x, train_y)      
    return model

def logistic_regression_classifier(train_x, train_y):      #逻辑回归树
    from sklearn.linear_model import LogisticRegression      
    model = LogisticRegression(penalty='l2')     
    model.fit(train_x, train_y)     
    return model  

def random_forest_classifier(train_x, train_y):      #随机森林
    from sklearn.ensemble import RandomForestClassifier     
    model = RandomForestClassifier(n_estimators=8)      
    model.fit(train_x, train_y)      
    return model    

def 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 model  

train=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

SVM运行了好久都没跑出来---

你可能感兴趣的:(编程)