sklearn-朴素贝叶斯

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Forlogen/article/details/85126210

1. 朴素贝叶斯

朴素贝叶斯方法是一组监督学习算法,基于贝叶斯定理应用给定类变量值的每对特征之间的条件独立性的“朴素”假设。贝叶斯定理在给定类变量的情况下表明了以下关系 y 和依赖特征向量 X1 通过 Xn:
在这里插入图片描述
使用朴素的条件独立假设
在这里插入图片描述
对全部的 i,这种关系简化为
在这里插入图片描述
若P(X1,…,Xn) 给定连续的输入,我们可以使用以下分类规则:
在这里插入图片描述
我们可以使用最大后验(MAP)估计来估计 P(y)P(xi|y)y。不同的朴素贝叶斯分类器主要区别于他们对分布的假设 P(xi|y),尽管它们显然过于简化了假设,但朴素的贝叶斯分类器在许多实际情况中都运行良好,着名的是文档分类和垃圾邮件过滤。他们需要少量的训练数据来估计必要的参数。与更复杂的方法相比,朴素贝叶斯学习器和分类器可以非常快。类条件特征分布的解耦意味着每个分布可以独立地估计为一维分布。这反过来有助于缓解维度惩罚带来的问题。另一方面,虽然天真的贝叶斯被称为一个不错的分类器,但它被认为是一个不好的估计器,所以输出的概率 predict_proba并不是太准确。

2. 高斯朴素贝叶斯

GaussianNB 实现高斯朴素贝叶斯算法进行分类。 特征的可能性被假设为高斯函数的形式:
在这里插入图片描述
参数 σ_y 和 μ_y 使用最大似然法估计

API: https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html#sklearn.naive_bayes.GaussianNB

3. 多项分布的朴素贝叶斯

MultinomialNB 实现了服从多项分布数据的朴素贝叶斯算法,也是用于文本分类(这个领域中数据往往以词向量表示,尽管在实践中 tf-idf 向量在预测时表现良好)的两大经典朴素贝叶斯算法之一。 分布参数由每类 y 的 θy = (θy1,…,θyn) 向量决定, 式中 n 是特征的数量(对于文本分类,是词汇量的大小),θyi 是样本中属于类 y 中特征 i 概率 P(xi | y) 。

参数 θy 使用平滑过的最大似然估计法来估计,即相对频率计数:
在这里插入图片描述

在这里插入图片描述
是训练集T类 y中出现所有特征的计数总和。先验平滑因子 α>=0, 应用于在学习样本中没有出现的特征,以防在将来的计算中出现0概率输出。 把 α = 1 称为拉普拉斯平滑(Lapalce smoothing),而 α <1被称为利德斯通平滑(Lidstone smoothing)。

API: https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.ComplementNB.html#sklearn.naive_bayes.ComplementNB

4. 伯努利朴素贝叶斯

BernoulliNB 实现了用于多重伯努利分布数据的朴素贝叶斯训练和分类算法,即有多个特征,但每个特征 都假设是一个二元 (Bernoulli, boolean) 变量。 因此,这类算法要求样本以二元值特征向量表示;如果样本含有其他类型的数据, 一个 BernoulliNB 实例会将其二值化(取决于 binarize 参数)。伯努利朴素贝叶斯的决策规则基于
在这里插入图片描述
与多项分布朴素贝叶斯的规则不同 伯努利朴素贝叶斯明确地惩罚类 y 中没有出现作为预测因子的特征 i ,而多项分布分布朴素贝叶斯只是简单地忽略没出现的特征。

在文本分类的例子中,词频向量(而非词数向量)可能用于训练和用于这个分类器。 BernoulliNB 可能在一些数据集上可能表现得更好,特别是那些更短的文档。

API: https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.BernoulliNB.html#sklearn.naive_bayes.BernoulliNB

5. 堆外朴素贝叶斯模型拟合

朴素贝叶斯模型可以解决整个训练集不能导入内存的大规模分类问题。 为了解决这个问题, MultinomialNB, BernoulliNB, 和 GaussianNB 实现了 partial_fit 方法,可以动态的增加数据,使用方法与其他分类器的一样,所有的朴素贝叶斯分类器都支持样本权重。

注:与 fit 方法不同,首次调用 partial_fit 方法需要传递一个所有期望的类标签的列表。所有朴素贝叶斯模型调用 partial_fit 都会引入一些计算开销。推荐让数据快越大越好,其大小与 RAM 中可用内存大小相同。

6. 例子

from sklearn import datasets
	iris = datasets.load_iris()
	# ##高斯朴素贝叶斯
	#
	# Parameters:   
	# priors : array-like, shape (n_classes,)
	# Prior probabilities of the classes. If specified the priors are not adjusted according to the data.
	# var_smoothing : float, optional (default=1e-9):Portion of the largest variance of all features that is added to variances for calculation stability.
	# Attributes:   
	# class_prior_ : array, shape (n_classes,):probability of each class.
	# class_count_ : array, shape (n_classes,):number of training samples observed in each class.
	# theta_ : array, shape (n_classes, n_features):mean of each feature per class
	# sigma_ : array, shape (n_classes, n_features):variance of each feature per class
	# epsilon_ : float:absolute additive value to variances
	#
	# methods:
	# fit(X, y[, sample_weight]): Fit Gaussian Naive Bayes according to X, y
	# get_params([deep]):Get parameters for this estimator.
	# partial_fit(X, y[, classes, sample_weight]):Incremental fit on a batch of samples.
	# predict(X):Perform classification on an array of test vectors X.
	# predict_log_proba(X):Return log-probability estimates for the test vector X.
	# predict_proba(X):Return probability estimates for the test vector X.
	# score(X, y[, sample_weight]):Returns the mean accuracy on the given test data and labels.
	# set_params(**params):Set the parameters of this estimator.
	#
	#其他类型的具体可见官方API
	#
	from sklearn.naive_bayes import GaussianNB
	clf = GaussianNB()
	clf = clf.fit(iris.data, iris.target)
	y_pred=clf.predict(iris.data)
	print("高斯朴素贝叶斯,样本总数: %d 错误样本数 : %d" % (iris.data.shape[0],(iris.target != y_pred).sum()))
	from sklearn.naive_bayes import MultinomialNB
	clf = MultinomialNB()
	clf = clf.fit(iris.data, iris.target)
	y_pred=clf.predict(iris.data)
	print("多项分布朴素贝叶斯,样本总数: %d 错误样本数 : %d" % (iris.data.shape[0],(iris.target != y_pred).sum()))
	from sklearn.naive_bayes import BernoulliNB
	clf = BernoulliNB()
	clf = clf.fit(iris.data, iris.target)
	y_pred=clf.predict(iris.data)
	print("伯努利朴素贝叶斯,样本总数: %d 错误样本数 : %d" % (iris.data.shape[0],(iris.target != y_pred).sum()))

结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Forlogen/article/details/85126210