'''
@description :一级分类:监督学习,二级分类:分类(离散问题),三级分类:贝叶斯算法
算法优点:
a 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率
b 对缺失的数据不太敏感,算法也比较简
c 分类问题准确度高、速度快
算法缺点:
a 由于使用了样本属性独立性的假设,所以如果样本属性有关联时其效果不好
应用场景:常用于文本分类问题
@author wolf
@time 2018-05-02
'''
from sklearn.datasets import fetch_20newsgroups
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 classification_report
def naivebases():
# 1 读取数据,加载sscikitLearn官方数据集
'''
数据集官方地址:http://sklearn.apachecn.org/cn/0.19.0/datasets/twenty_newsgroups.html
数据集背景:20类别,18846篇文章
数据集类别:news.target_names,news.target
查看文章内容:
orign_data = list(news.data)
for x in range(10):
print(orign_data[x])
print("*" * 100)
type(news.data) 是list不是ndarray
'''
news = fetch_20newsgroups(subset='all')
# 2 数据集分割:训练集、测试集
'''
通用标准:测试集占比25%
type(x_train) 是list不是ndarray
'''
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)
# 3 特征工程:数据集特征抽取
'''
使用tf-idf算法:
a 提取文章内容中分词(通用规则按空格,英文文章不需要处理,中文需要借助开源工具jieba按中文语义拆分中文分词)
b 计算分词在文章中重要性(大部分语气词词频很高,但不能代表文档的属性)
c tf-idf = tf(term frequnce分词在文章中词频) * idf(inverse document frequnce)
idf = log(总文档数/该分词出现的文档数) log:对数据函数
d 返回所有分词(特征)相对于文章的重要性矩阵 tf.get_feature_names(),返回结果默认是sparse矩阵:
x_train.toarray()
e type(x_train) <class 'scipy.sparse.csr.csr_matrix'>,scipy基于numpy,最终数据结构ndarray
x_train.shape:(14134, 149647)
'''
tf = TfidfVectorizer()
# 训练集
x_train = tf.fit_transform(x_train)
# 测试集
x_test = tf.transform(x_test)
# 4 朴素贝叶斯算法
'''
算法思想:根据目标(测试集)分词-特征(根据tf-idf算法计算出重要性的分词并在分词中刷选重要的分词,默认是刷选出的
全部重要分词)在数据集(训练集、测试集)
计算文章归属类别的概率(贝叶斯概率),最终选中概率最大类别。为了保证计算出的概率不为0,概率计算中增加拉普拉
斯平滑系数
数学原理:
联合概率:P(A&B) = P(A) * P(B)
条件概率:P(A|C, B|C) = P(A|C) * P(B|C)
贝叶斯公式:P(C|F1,F2...) = P(F1,F2...|C) * P(C) / P(F1,F2...)
Ni = P(F1,F2...|C) * P(C) 指定分类特征分词概率
P(C) 总文章数指定类别的概率
P(W) = P(F1,F2...) 指定特征分词概率
拉普拉斯平滑系数: (Ni + a) / (m * a) a常为1、 m常为总特征分词数
'''
# 朴素贝叶斯模型
mlt = MultinomialNB(alpha=1.0)
mlt.fit(x_train, y_train)
# 预测测试集类别
y_predict = mlt.predict(x_test)
print("预测的文章类别为:", y_predict)
# 模型评估
'''
TP、FP、TN、FN构成混淆矩阵
准确率(accuracy) = (TP+TN) / ALL
精确率(precision) = TP / (TP + FP)
召回率(recall) = TP / (TP + FN)
F1-score = 2 * precision * recall / (precision + recall)表示模型的稳定性
'''
print("准确率:", mlt.score(x_test, y_test))
rp = classification_report(y_test, y_predict, target_names=news.target_names)
print(rp)
if __name__ == "__main__":
naivebases()
朴素贝叶斯算法推导分析
最新推荐文章于 2022-03-31 19:26:04 发布