step by step
1、朴素贝叶斯原理介绍
2、iris数据集测试
3、算法优缺点总结
一、朴素贝叶斯原理介绍
朴素贝叶斯是一种构建分类器的简单方法。该分类器模型会给问题实例分配用特征值表示的类标签,类标签取自有限集合。它不是训练这种分类器的单一算法,而是一系列基于相同原理的算法:所有朴素贝叶斯分类器都假定样本每个特征与其他特征都不相关。举个例子,如果一种水果其具有红,圆,直径大概3英寸等特征,该水果可以被判定为是苹果。尽管这些特征相互依赖或者有些特征由其他特征决定,然而朴素贝叶斯分类器认为这些属性在判定该水果是否为苹果的概率分布上独立的。
对于某些类型的概率模型,在监督式学习的样本集中能获取得非常好的分类效果。在许多实际应用中,朴素贝叶斯模型参数估计使用最大似然估计方法;换而言之,在不用到贝叶斯概率或者任何贝叶斯模型的情况下,朴素贝叶斯模型也能奏效。
二、iris数据集测试
- 2.1 Code Sample
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB, GaussianNB, BernoulliNB, ComplementNB
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
gnb = GaussianNB()
mnb = MultinomialNB()
bnb = BernoulliNB()
cnb = ComplementNB()
gnb_y_pred = gnb.fit(X_train, y_train).predict(X_test)
mnb_y_pred = mnb.fit(X_train, y_train).predict(X_test)
bnb_y_pred = bnb.fit(X_train, y_train).predict(X_test)
cnb_y_pred = cnb.fit(X_train, y_train).predict(X_test)
for model in [gnb_y_pred,mnb_y_pred,bnb_y_pred,cnb_y_pred]:
print("Number of mislabeled points out of a total %d points : %d" % (X_test.shape[0], (y_test != model).sum()))
- The Result
Number of mislabeled points out of a total 45 points : 0
Number of mislabeled points out of a total 45 points : 18
Number of mislabeled points out of a total 45 points : 34
Number of mislabeled points out of a total 45 points : 18
- 2.2 Code Sample(使用OneHot编码预处理样本数据)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB, GaussianNB, BernoulliNB, ComplementNB
from sklearn import preprocessing
enc = preprocessing.OneHotEncoder()
from sklearn.datasets import load_iris
X,y = load_iris().data,load_iris().target
enc.fit(X)
array = enc.transform(X).toarray()
X_train, X_test, y_train, y_test = train_test_split(array, y, test_size=0.3, random_state=0)
gnb = GaussianNB()
mnb = MultinomialNB()
bnb = BernoulliNB()
cnb = ComplementNB()
gnb_y_pred = gnb.fit(X_train, y_train).predict(X_test)
mnb_y_pred = mnb.fit(X_train, y_train).predict(X_test)
bnb_y_pred = bnb.fit(X_train, y_train).predict(X_test)
cnb_y_pred = cnb.fit(X_train, y_train).predict(X_test)
for model in [gnb_y_pred,mnb_y_pred,bnb_y_pred,cnb_y_pred]:
print("Number of mislabeled points out of a total %d points : %d" % (X_test.shape[0], (y_test != model).sum()))
- The Result
Number of mislabeled points out of a total 45 points : 4
Number of mislabeled points out of a total 45 points : 4
Number of mislabeled points out of a total 45 points : 3
Number of mislabeled points out of a total 45 points : 3
使用OneHot对样本预处理之后,除了MultinomialNB精度有一定下降,其它三个算法均有显著提升。
三、算法优缺点总结
优点:
- 朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。
- 对大数量训练和查询时具有较高的速度。即使使用超大规模的训练集,针对每个项目通常也只会有相对较少的特征数,并且对项目的训练和分类也仅仅是特征概率的数学运算而已;
- 对小规模的数据表现很好,能个处理多分类任务,适合增量式训练(即可以实时的对新增的样本进行训练);
- 对缺失数据不太敏感,算法也比较简单,常用于文本分类;
- 朴素贝叶斯对结果解释容易理解。
缺点:
- 需要计算先验概率;
- 分类决策存在错误率;
- 对输入数据的表达形式很敏感;
- 由于使用了样本属性独立性的假设,所以如果样本属性有关联时其效果不好。