文本分类的14种算法(1):
前期的数据处理及算法的评价指标选取
训练集和测试集采用了 上一篇文章中的数据集:
https://blog.csdn.net/qq_43012160/article/details/94664377
import、from…import、import…as的区别
import就是导入整个包,使用包里的类或者函数需要把包名也写上。
from…import则是导入包里某个特定的类或者函数,用的时候可以像自定义函数一样直接用。
import…as就是有时候包的名字太长了,给他取个别名。
import pandas as pd
import time
from sklearn import metrics
from sklearn.preprocessing import LabelEncoder
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.neural_network import MLPClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import BernoulliNB
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
数据标签的规格化
LabelEncode类的fit_transform函数可以将标签规格化为自然数,例如有标签“好”、“坏”、“牛皮”,
就可以把“好”变成1,“坏”变成2,“牛皮”变成0,大概这么个意思。其中fit_transform由fit和transform两个过程组成,fit过程类似于学习,学习所有的标签;transform类似规格化,把不同的标签转化为不同的自然数标记,数据标准化方便算法的标准化处理:
train_data = pd.read_csv('mytrain.csv', lineterminator='\n')
test_data=pd.read_csv('testCSV.csv', lineterminator='\n')
#利用LabelEncoder对数据标签进行规格化处理
def encodeLabel(data):
listLable=[]
for lable in data['lable']:
listLable.append(lable)
#到这里都是把lable整合到一起,下面是规格化处理
le = LabelEncoder()
resultLable=le.fit_transform(listLable)
return resultLable
trainLable=encodeLabel(train_data)
testLable=encodeLabel(test_data)
由于我的训练集和测试集特征和标签是放在一起的,分别放在review字段和lable字段里,所以要把他们拿出来集合处理一下,数据特征review的处理放在下面:
#这里出来是所有review的集合:
def getReview(data):
listReview=[]
le = LabelEncoder()
for review in data['review']:
listReview.append(review)
return listReview
trainReview=getReview(train_data)
testReview=getReview(test_data)
数据标签的规格化
CountVectorizer类可以对特征数据进行特征提取,可以将文本信息转化为对应的特征向量。其中stop_words属性代表着无效词:在实际场景中诸如标点和数字往往是不能作为可靠的文本分类依据的,这就属于无效词,需要在统计时剔除。wordBag包含了训练集和测试集的所有特征,利用cv.fit(wordBag)可以对wordBag的所有分词(即训练集和测试集的词袋)进行学习,之后用 transform方法构建每个样例的频数特征向量,但由于 transform方法构造出的向量以稀疏矩阵的形式存储,故还要使用toarray进行转换。
#这里出来是频数向量:
stoplist=['.', '?', '!', ':', '-', '+', '/', '"', ',','0','1','2','3','4','5','6','7','8','9','0']
cv=CountVectorizer(stop_words=stoplist)
wordBag=trainReview+testReview
cv.fit(wordBag)
test_count = cv.transform(testReview)
testCount = test_count.toarray()
train_count = cv.transform(trainReview)
trainCount = train_count.toarray()
算法的调用与评测
这里将算法的评测与调用集成在一个函数里,以伯努利贝叶斯算法为例:
def classificate(estimator, trainReview, trainLable, testReview, testLable):
start = time.time()
#模型训练,fit通常都是指模型的学习、训练过程
print('训练:')
model = estimator
model.fit(trainReview, trainLable)
print(model)
#模型预测:
print('预测:')
pred_model = model.predict(testReview)
print(pred_model)
#算法评估
print('评估:')
score = metrics.accuracy_score(testLable, pred_model)
matrix = metrics.confusion_matrix(testLable, pred_model)
report = metrics.classification_report(testLable, pred_model)
print('>>>准确率\n', score)
print('\n>>>混淆矩阵\n', matrix)
print('\n>>>召回率\n', report)
end = time.time()
t = end - start
print('\n>>>算法消耗时间为:', t, '秒\n')
#算法调用:
knc = BernoulliNB()
classificate(knc, trainCount, trainLable, testCount, testLable)
混淆矩阵百度百科讲的挺清楚的:https://baike.baidu.com/item/混淆矩阵/10087822?fr=aladdin
召回率表达的和混淆矩阵差不多,假定:从一个大规模数据集合中检索文档时,可把文档分成四组:
- 系统检索到的相关文档(A)
- 系统检索到的不相关文档(B)
- 相关但是系统没有检索到的文档(C)
- 不相关且没有被系统检索到的文档(D)
则召回率R为:用实际检索到相关文档数作为分子,所有相关文档总数作为分母,即R = A / ( A + C )
下一篇文章将具体介绍例如伯努利贝叶斯的14种文本分类的常用算法。