朴素贝叶斯——分类模型
朴素贝叶斯:首先贝叶斯推论就是通过结论推条件。专业点就是先假定先验概率,然后通过后验概率来判断先验概率的正确性,若不准确,则修正。(感觉好像逻辑回归的反向传播)
然后朴素的意思是:各个因素相互独立。互不干扰
优点
朴素贝叶斯发源于古典数学理论,有稳定的分类效率。
对缺失数据不太敏感,算法也比较简单,常用于文本分类
分类准确度高,速度快
缺点
由于使用了样本属性独立性的假设,所以如果样本属性有关联时其效果不好
鸢尾花
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])