03_朴素贝叶斯分类
描述
朴素贝叶斯分类器与线性模型非常相似的一种分类器,但它的训练速度往往更快。这种高效率所付出的代价是,朴素贝叶斯模型的泛化能力要比线性分类器(如LogisticRegression 和 LinearSVC)稍差。
朴素贝叶斯模型高效的原因:它通过单独查看每个特征来学习参数,并从每个特征中收集简单的类别统计数据。
scikit-learn 中实现了三种朴素贝叶斯分类器:GaussianNB、BernoulliNB 和 MultinomialNB。GaussianNB 可 应 用 于 任 意 连 续 数 据, 而BernoulliNB 假定输入数据为二分类数据,MultinomialNB 假定输入数据为计数数据(即每个特征代表某个对象的整数计数,比如一个单词在句子里出现的次数)。BernoulliNB 和MultinomialNB 主要用于文本数据分类。
分类器
GaussianNB
高斯朴素贝叶斯(GaussianNB)是一种基于贝叶斯定理的概率分类器,特别适用于连续数据或特征变量符合高斯分布的情况。在机器学习中,GaussianNB经常被用于分类任务,如文本分类、垃圾邮件检测等。
当特征变量是连续的,它们的先验概率通常假设为高斯分布。这意味着在给定类别中,特征的值遵循正态分布。高斯朴素贝叶斯利用每个特征的均值和方差来估计每个类别的条件概率。对于给定的特征值,GaussianNB遵循以下公式:
P ( x i = X i ( t e s t ) ∣ Y = C k ) = ( 1 / s q r t ( 2 ∗ p i ∗ σ k 2 ) ) ∗ e x p ( − ( X i ( t e s t ) − μ k ) 2 / ( 2 ∗ σ k 2 ) ) P(x_i = X_i(test) | Y = C_k) = (1 / sqrt(2 * pi * σ_k^2)) * exp(- (X_i(test) - μ_k)^2 / (2 * σ_k^2)) P(xi=Xi(test)∣Y=Ck)=(1/sqrt(2∗pi∗σk2))∗exp(−(Xi(test)−μk)2/(2∗σk2))
μ k μ_k μk和 σ k 2 σ_k^2 σk2分别是正态分布的期望和方差。GaussianNB的目标是最大化 P ( x i = X i ( t e s t ) ∣ Y = C k ) P(x_i = X_i(test) | Y = C_k) P(xi=Xi(test)∣Y=Ck),以确定样本更接近哪个类别的值。
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_digitsdigits = load_digits() # 是一种8x8的图像像素数据,目的识别数字
X_train,X_test,Y_train,Y_test = train_test_split(digits.data,digits.target,random_state=42)
gnb = GaussianNB().fit(X_train,Y_train)print(gnb.score(X_train,Y_train),gnb.score(X_test,Y_test)) # 打印训练、测试得分
var_smoothing 参数:为了保证估计的稳定性,在估计方差时会将所有特征的方差中最大的方差以一定比例添加到估计的方差中。这个比例由var_smoothing参数控制,默认值为1e-9 (目的是排除极大值对模型的干扰)
BernoulliNB
伯努利朴素贝叶斯分类器是一种基于朴素贝叶斯原理的机器学习算法,专门用于处理二项分布数据。在伯努利模型中,特征的条件概率分布假设满足二项分布,即每个特征都是二分类的,可以用布尔变量表示。这种分类器适用于离散数据,尤其是二进制或布尔特征的情况。
伯努利朴素贝叶斯分类器在处理文本数据时表现良好,尤其是在文档较短的数据集上。与多项式朴素贝叶斯分类器相比,伯努利朴素贝叶斯更注重特征的存在与否,而不是特征的出现频率。
binarize参数:用于将样本特征二值化(映射为布尔值)的阈值。如果为None,则假定输入已经由二分类向量组成。
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import BernoulliNBtrain_text=['I love this book','This book is great','I hate this book']
train_label =[1,1,0] # 1 表示正面评论,0表示负面评论vectorizer = CountVectorizer(binary=True) # 分词向量器
train_feature = vectorizer.fit_transform(train_text)
test_feature = vectorizer.transform(['I like this book','This book is terrible'])clf = BernoulliNB().fit(train_feature,train_label)
clf.predict(test_feature)
MultinomialNB
多项式朴素贝叶斯分类器适用于具有离散特征的分类(例如,文本分类的词频)。多项式分布通常需要整数特征计数。
MultinomialNB在文本分类领域有着广泛的应用,如垃圾邮件检测、情感分析、新闻分类等。它特别适合处理高维稀疏数据,如文本数据,并且对噪声数据有一定的鲁棒性1。此外,MultinomialNB还可以用于多标签分类任务,即一个样本可能属于多个类别。
注意:MultinomialNB的训练集数据不能为负数
# 文本处理方式与BernoulliNB 的例子相识
# 这里举一个鸢尾花的例子
import pandas as pd
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNBiris = pd.read_csv(r'..\..\seaborn-data\iris.csv') # 加载数据
iris_class_dic = {'setosa':0, 'versicolor':1, 'virginica':2}
iris_class = ['setosa', 'versicolor', 'virginica']
iris_tz_array=iris.select_dtypes(include='number')
iris_class_array=iris['species'].map(iris_class_dic)X_train,X_test,Y_train,Y_test = train_test_split(iris_tz_array,iris_class_array,random_state=42)
mnb = MultinomialNB().fit(X_train,Y_train)
print(mnb.score(X_train,Y_train),mnb.score(X_test,Y_test)) #打印得分(结果还可以)
iris_class[int(mnb.predict([[5,2.8,1,0.3]])[0])] # 预测新类型
优点、缺点和参数
MultinomialNB 和 BernoulliNB 都只有一个参数 alpha,用于控制模型复杂度。alpha 的工作原理是,算法向数据中添加 alpha 这么多的虚拟数据点,这些点对所有特征都取正值。这可以将统计数据“平滑化”(smoothing)。alpha 越大,平滑化越强,模型复杂度就越低。算法性能对 alpha 值的鲁棒性(健壮性,系统在受到外部扰动或内部参数摄动等不确定性因素干扰时,系统扔保持其结构和功能稳定。)相对较好,也就是说,alpha 值对模型性能并不重要。但调整这个参数通常都会使精度略有提高。
GaussianNB 主要用于高维数据,而另外两种朴素贝叶斯模型则广泛用于稀疏计数数据,比如文本。MultinomialNB 的性能通常要优于 BernoulliNB,特别是在包含很多非零特征的数据集(即大型文档)上。
朴素贝叶斯模型的训练和预测速度都很快,训练过程也很容易理解。该模型对高维稀疏数据的效果很好,对参数的鲁棒性也相对较好。朴素贝叶斯模型是很好的基准模型,常用于非常大的数据集,在这些数据集上即使训练线性模型可能也要花费大量时间。