朴素贝叶斯——分类模型
朴素贝叶斯:首先贝叶斯推论就是通过结论推条件。专业点就是先假定先验概率,然后通过后验概率来判断先验概率的正确性,若不准确,则修正。(感觉好像逻辑回归的反向传播)
然后朴素的意思是:各个因素相互独立。互不干扰
优点
朴素贝叶斯发源于古典数学理论,有稳定的分类效率。
对缺失数据不太敏感,算法也比较简单,常用于文本分类
分类准确度高,速度快
缺点
由于使用了样本属性独立性的假设,所以如果样本属性有关联时其效果不好
鸢尾花
from sklearn.naive_bayes import GaussianNB
from sklearn import datasets
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
feature = iris.data
target = iris.target
g = GaussianNB()
g.fit(x_train,y_train)
g.score(x_test,y_test) #0.8333333333333334
# 查看第一条测试数据的分类
g.predict(x_test[1].reshape((1,-1)))
tmp = g.predict_proba(x_test[10].reshape(1,-1)) #获得预测值,求和=1,注意这里没有取log
import numpy as np
data= np.around(tmp, 2) #保留两位小数
data
手写数字
import sklearn.datasets as datasets
import numpy as np
digist = datasets.load_digits()
feature= digist.data
target = digist.target
x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.1,random_state=2020)
#训练模型
g = GaussianNB()
g.fit(x_train,y_train)
g.score(x_test,y_test)#0.8333333333333334
y_pred = g.predict(x_test)
print('模型分类结果:',y_pred[:10])
print('真实的分类结果:',y_test[:10])
#看各种分类的概率 其中4的概率也是最大的
tmp = g.predict_proba(x_test[3].reshape(1,-1))
data= np.around(tmp, 2)
data
# g.predict_log_proba(x_test[3].reshape(1,-1)) 这个是把概率取log了,就不会发生很大的精度误差了
数据使用- 实战:数据使用fetch_20newsgroups中的数据,包含了20个主题的18000个新闻组的帖子
- 什么是TF-IDF
- 在信息检索中,tf-idf(词频-逆文档频率)是一种统计方法,用以评估一个单词在一个文档集合或语料库中的重要程度。
- 如果某个词或短语在一篇文章中出现的频率高(即TF高),并且在其他文章中很少出现(即IDF高),则认为此词或者短语具有很好的类别区分能力,适合用来分类。
import sklearn.datasets as datasets
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
news = datasets.fetch_20newsgroups(data_home='./') #加载20类新闻数据
feature = news.data#返回的是列表,列表中为一篇篇的文章
target = news.target#返回的ndarray,存储的是每一篇文章的类别
print(feature[1])
t = TfidfVectorizer()
feature_t = t.fit_transform(feature) #提取Tf_idf
x_train,x_test,y_train,y_test = train_test_split(feature_t,target,test_size=0.01,random_state=2020)
m = MultinomialNB()
m.fit(x_train,y_train)
m.score(x_test,y_test) #0.868421052631579
m.predict(x_test)
m.predict_log_proba(x_test[10])