常见的机器学习算法(九)朴素贝叶斯分类器

直接调用sklear的API:

from sklearn.naive_bayes import MultinomialNB            #朴素贝叶斯分类器#
module = MultinomialNB()
module.fit(x, y)
predicted = module.predict(test)

常见的机器学习算法(九)朴素贝叶斯分类器_第1张图片

 

常见的机器学习算法(九)朴素贝叶斯分类器_第2张图片

本文使用康奈尔大学网站的2M影评数据集,下载地址http://download.csdn.net/detail/lsldd/9346233

每一个特征值就是一个单词的TF-IDF。当然,也可以简单的使用单词出现的次数。

使用这个比较大的数据集,可以做一点点数据预处理的优化来避免每次都去硬盘读取文件。第一次运行时,把读入的数据保存起来,以后就不用每次再去读取了。
 

import scipy as sp
from sklearn.datasets import load_files
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer#文本特征提取
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import precision_recall_curve##准确率召回率曲线
from sklearn.metrics import classification_report#构建文本报告,用于展示主要的分类metrics。
"""
3种朴素贝叶斯模型:
①高斯分布朴素贝叶斯 from sklearn.naive_bayes import GaussianNB
用于一般分类问题。
②多项式分布朴素贝叶斯 from sklearn.naive_bayes import MultinomialNB
适用于文本数据(特征表示的是次数,例如某个词语的出现次数)。
③伯努利分布朴素贝叶斯 from sklearn.naive_bayes import BernoulliNB
适用于伯努利分布,也适用于文本数据(此时特征表示的是是否出现,例如某个词语的出现为1,不出现为0),
绝大多数情况下表现不如多项式分布,但有的时候伯努利分布表现得要比多项式分布要好,尤其是对于小数量级的文本数据。
"""

movie_reviews = load_files('data')
#保存
sp.save('movie_data.npy', movie_reviews.data)
sp.save('movie_target.npy', movie_reviews.target)

# 读取
movie_data = sp.load('movie_data.npy')#数据
movie_target = sp.load('movie_target.npy')#标签
x = movie_data
y = movie_target

# 测试样本调用的是transform接口
count_vec = TfidfVectorizer(binary=False, decode_error='ignore', stop_words='english')#构建词频(TF)计算

# 加载数据集,切分数据集80%训练,20%测试
"""
fit():使模型适合训练数据,并保存到变量(返回 sklearn.feature_extraction.text.TfidfVectorizer ));
transform():使用 fit()转换为验证/测试数据(返回 scipy.sparse.csr.csr_matrix );
fit_transform():fit() + transform()= fit_transform( ),用于直接转换训练数据(返回 scipy.sparse.csr.csr_matrix )
"""
x_train, x_test, y_train, y_test = train_test_split(movie_data, movie_target, test_size=0.2)
x_train = count_vec.fit_transform(x_train)#得到TF-IDF权重矩阵
x_test = count_vec.transform(x_test)

# 调用MultinomialNB分类器
mnb = MultinomialNB().fit(x_train, y_train)
doc_class_predicted = mnb.predict(x_test)

"""
预测有三种方法,包括predict,predict_log_proba和predict_proba:
predict就是我们最常用的预测方法,直接给出测试集的预测类别输出;
predict_proba则不同,它会给出测试集样本在各个类别上预测的概率。
容易理解,predict_proba预测出的各个类别概率里的最大值对应的类别,也就是predict方法得到类别;
predict_log_proba和predict_proba类似,它会给出测试集样本在各个类别上预测的概率的一个对数转化。
转化后predict_log_proba预测出的各个类别对数概率里的最大值对应的类别,也就是predict方法得到类别;
"""
# 准确率,召回率,阈值
precision, recall, thresholds = precision_recall_curve(y_test, doc_class_predicted)
answer = mnb.predict_proba(x_test)[:, 1]
# print(mnb.predict_proba(x_test))
# print('--------------------------')
# print(mnb.predict(x_test))
report = answer > 0.5#True、False
# print(report)
'classification_report(y_true, y_pred, target_names=target_names)'
print(classification_report(y_test, report, target_names=['neg', 'pos']))

 

常见的机器学习算法(九)朴素贝叶斯分类器_第3张图片

你可能感兴趣的:(算法)