目录
简介
朴素贝叶斯方法是一组监督学习算法,基于贝叶斯定理应用给定类变量值的每对特征之间的条件独立性的“朴素”假设。不同的朴素贝叶斯分类器主要区别于他们对分布的假设
高斯朴素贝叶斯:假设特征的可能性是高斯的
多项朴素贝叶斯
补充朴素贝叶斯
伯努利朴素贝叶斯
核心外朴素贝叶斯模型拟合
尽管它们显然过于简化了假设,但朴素的贝叶斯分类器在许多实际情况中都运行良好,着名的是文档分类和垃圾邮件过滤。他们需要少量的训练数据来估计必要的参数。(由于理论上的原因,为什么朴素贝叶斯运行良好,以及它的数据类型,请参阅下面的参考资料。)
与更复杂的方法相比,朴素贝叶斯学习者和分类器可以非常快。类条件特征分布的解耦意味着每个分布可以独立地估计为一维分布。这反过来有助于缓解维度诅咒带来的问题。
另一方面,虽然天真的贝叶斯被称为一个不错的分类器,但它被认为是一个不好的估计器,所以输出的概率predict_proba
不要太认真。
贝叶斯岭回归
P(A|B)B事件发生的情况下,A事件发生的概率
P(A∩B)A事件和B事件同时发生的概率,P(A∩B)=P(A|B)*P(A)
∪
核岭回归(KRR)[M2012]将岭回归 (线性最小二乘与l2范数正则化)与核技巧相结合。因此,它学习由各个内核和数据引起的空间中的线性函数。
条件概率:
全概率:
贝叶斯公式:
贝叶斯定理--要背:
朴素贝叶斯分类器:假设服从正太分布,不服从也假设服从才能计算
bag of word 词袋模型
计算过程
scikit-learn实现
这是一个使用交叉验证参数的多项式朴素贝叶斯分类器结合tf-idf算法的案例
import numpy as np
import pandas as pd
import os
import jieba
import pickle
from sklearn.datasets.base import Bunch#类似于字典的一个数据结构
from sklearn.feature_extraction.text import TfidfVectorizer #tf-tdf算法
from sklearn.naive_bayes import MultinomialNB #多项式朴素贝叶斯分类器,适用于具有离散特征的分类(例如,用于文本分类的字数)
from sklearn.model_selection import cross_val_score #交叉验证参数
#输入文件路径
train_data = './cnews/data/char-level/cnews.train.txt'
test_data = './cnews/data/char-level/cnews.test.txt'
val_data = './cnews/data/char-level/cnews.val.txt'
category_data = './cnews/data/char-level/cnews.category.txt'
word_level = './cnews/data/word-level'#该文件夹用来存储处理后的数据
jieba_data = './cnews/data/word-level/train.jieba.dat'#处理数据后的保存的文件名
#创建文件夹
if not os.path.exists(word_level):
os.mkdir(word_level)
class Categories():
'''针对类别数据进行处理'''
def __init__(self,category_data):
'''根据cnews.category.txt生成一个类别名和类别编号为键值对的字典'''
self.category_id={}
for line in open(category_data,'r',encoding='utf-8'):
word,label=line.strip().split('\t')
self.category_id[word]=int(label)#
def category_to_id(self,category):
'''根据字典的键值对传入的类别名称,返回类别编号'''
return self.category_id[category]
def generator_word(inputfilelist,outputfile):
#创建Bunch对象,labels为文章的类别标签,contents为文章的内容,category_id为类别和数字标签的映射字典,传入文件列表
bunch = Bunch(labels=[],contents=[],category_id={})
categories = Categories(category_data)#实例化新闻类别class
bunch.category_id = categories.category_id
for inputfile in inputfilelist:
print(inputfile)
with open(inputfile,'r',encoding='utf-8') as f:
lines = f.readlines()
for line in lines:
category,content=line.strip().split('\t')
bunch.labels.append(categories.category_to_id(category))
words = jieba.cut(content)#分词
ewords=''
for word in words:
word = word.strip()
if word != '':
ewords += word+ ' '
bunch.contents.append(ewords.strip())
with open(outputfile,'wb') as f:
pickle.dump(bunch,f)
#generator_word([train_data,val_data,test_data],jieba_data)
#input filename
jieba_data = './cnews/data/word-level/train.jieba.dat'
#output filename
tfidf_data = './cnews/data/word-level/train.tfidf.dat'
#stopword path
stopword_path_file='./cnews/data/中文停用词库.txt'
def get_sotp_word(filename): #停用词
stop_words =[]
for line in open(filename,'r',encoding='gbk'):
stop_words.append(line.strip())
return stop_words
def _read_bunch(filename): #读取二进制文件
with open(filename,'rb') as f:
bunch= pickle.load(f)
return bunch
def _write_bunch(filename,bunch): #写入二进制文件
with open(filename,'wb') as f:
pickle.dump(bunch,f)
def generater_tfidf(inputfile,outputfile):
bunch = _read_bunch(inputfile)#读取之前处理的结果
#实例化Bunch对象,主要用来存放经过TFIDF处理后的结果
#labels为每篇文章的对应类别
#tfidf为将文章量化后的数组
#vocabulary为词汇映射表
#category_id为类别映射表
tfidf_bunch = Bunch(labels=[],tfidf=[],vocabulary={},category_id={})
tfidf_bunch.labels=bunch.labels
tfidf_bunch.category_id = bunch.category_id
stop_words = get_sotp_word(stopword_path_file) #停用词
TFIDF = TfidfVectorizer(sublinear_tf=True,norm='l2',max_df=0.6,stop_words=stop_words) #声明TFIDF模型
tfidf_bunch.tfidf=TFIDF.fit_transform(bunch.contents) #训练tfidf,并进行转化
tfidf_bunch.vocabulary = TFIDF.vocabulary_ #词汇表
_write_bunch(outputfile,tfidf_bunch) #将结果保存到文件
#generater_tfidf(jieba_data,tfidf_data)
tfidf_data = './cnews/data/word-level/train.tfidf.dat'
bunch = _read_bunch(tfidf_data)
#确定数据集的X和y
X = bunch.tfidf
y = bunch.labels
for alpha in [0.001,0.01,0.1,1]:#调参,根据结果可知alpha=0.1时分值最高
nb = MultinomialNB(alpha=alpha)
scores=cross_val_score(nb,X,y,scoring='accuracy',cv=5,n_jobs=-1)
print(alpha,scores.mean())
#确定参数后,将参数代入模型,则训练模型已完成
nb = MultinomialNB(alpha=0.1)
scores=cross_val_score(nb,X,y,scoring='accuracy',cv=10,n_jobs=-1)
print(scores.mean())
这是一个使用留出法的多项式朴素贝叶斯分类器的案例,帮助理解区分留出法和交叉验证法的区别
import numpy as np
import pandas as pd
import os
import jieba
import pickle
from sklearn.datasets.base import Bunch#类似于字典的一个数据结构
from sklearn.feature_extraction.text import TfidfVectorizer #tf-tdf算法
from sklearn.naive_bayes import MultinomialNB #多项式朴素贝叶斯分类器,适用于具有离散特征的分类(例如,用于文本分类的字数)
from sklearn.model_selection import cross_val_score #交叉验证参数
from sklearn.model_selection import train_test_split #将数组或矩阵拆分为随机序列和测试子集
from sklearn.metrics import classification_report #构建显示主要分类指标的文本报告
#留出法调参--其他步骤同交叉验证法
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2) #随机抽取样本
nb = MultinomialNB(alpha=0.01) #实例化多项式朴素贝叶斯模型,上一案例已调参最优解
nb.fit(X_train,y_train) #训练模型
y_pred=nb.predict(X_test) #测试模型
print(classification_report(y_test,y_pred)) #评价模型效果, 返回precision、recall、f1-score、support等模型评价系数
这是一个高斯朴素贝叶斯分类器的简单案例,帮助理解朴素贝叶斯的训练和预测
from sklearn import datasets
from sklearn.naive_bayes import GaussianNB
iris = datasets.load_iris()
#print(iris.target.shape)#105个target
gnb = GaussianNB()
y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
print("Number of mislabeled points out of a total %d points : %d"% (iris.data.shape[0],(iris.target != y_pred).sum()))