朴素贝叶斯分类(python实现)

本文深入探讨了朴素贝叶斯算法的优点,如稳定性、处理小规模数据和缺失数据的能力,以及其在文本分类中的应用。同时揭示了其缺点,如假设属性独立性、先验概率依赖和分类决策误差。通过scikit-learn实例展示了GaussianNB、MultinomialNB和BernoulliNB的使用。最后总结了不同场景下的选择和适用性。
部署运行你感兴趣的模型镜像

算法优劣

优点:

  1. 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。

  2. 对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。

  3. 对缺失数据不太敏感,算法也比较简单,常用于文本分类。

缺点

  1. 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。

  2. 需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。

  3. 由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。

  4. 对输入数据的表达形式很敏感。

算法实现

说明

  • scikit-learn中,一共有3个朴素贝叶斯的分类算法类。分别是GaussianNBMultinomialNBBernoulliNB
  • GaussianNB:先验为高斯分布的朴素贝叶斯
  • MultinomialNB:先验为多项式分布的朴素贝叶斯
  • BernoulliNB:先验为伯努利分布的朴素贝叶斯。

数据准备

import pandas as pd
import numpy as np
X = np.array([[1.14, 1.78],[1.18, 1.96],[1.20, 1.86],[1.26, 2.00],[1.28, 2.00],
             [1.30, 1.96],[1.24, 1.72],[1.36, 1.74],[1.38, 1.64],[1.38, 1.82],
             [1.38, 1.90],[1.40, 1.70],[1.48, 1.82],[1.54, 1.82],[1.56, 2.08]])
Y = np.hstack((np.ones(6), np.ones(9)*2)) #数组合并

GaussianNB预测

from sklearn.naive_bayes import GaussianNB
clf_Ga = GaussianNB()
clf_Ga.fit(X, Y)
print("预测结果")
print(clf_Ga.predict([[1.24, 1.80]]))
print("样本为1类的概率")
print(clf_Ga.predict_proba([[1.24, 1.80]]))
print("样本为2类的概率")
print(clf_Ga.predict_log_proba([[1.24, 1.80]]))

输出:

预测结果
[1.]
样本为1类的概率
[[0.7236103 0.2763897]]
样本为2类的概率
[[-0.3235023  -1.28594344]]
  • 样本为1的概率大于样本为2的概率,所以认为该样本为1类
print("预测结果")
print(clf_Ga.predict([[1.29, 1.81],[1.43,2.03]]))

输出:

预测结果
[2. 2.]

MultinomialNB预测

  • 这里使用GridSearchCV函数进行网格搜索交叉检验调参,评估模型的分数为accuracy即准确率。
  • 调整的参数分别为:alpha(常数 λ \lambda λ),fit_prior(是否考虑先验概率)
from sklearn.naive_bayes import MultinomialNB
clf_Mu = MultinomialNB()
from sklearn.model_selection import GridSearchCV
param_grid = [{'alpha':np.arange(0.9,1.1,0.1),
              'fit_prior':['True','False']}]
grid_search = GridSearchCV(clf_Mu, param_grid, cv = 3,
                          scoring = 'accuracy',
                          return_train_score = True)
grid_search.fit(X,Y)

输出最优参

grid_search.best_params_

输出:

{'alpha': 0.9, 'fit_prior': 'True'}

查看网格搜索模型分数

cvres = grid_search.cv_results_
for accuracy,params in zip(cvres["mean_test_score"],cvres["params"]):
    print("{:.2}".format(accuracy),params)

输出:

0.6 {'alpha': 0.9, 'fit_prior': 'True'}
0.6 {'alpha': 0.9, 'fit_prior': 'False'}
0.6 {'alpha': 1.0, 'fit_prior': 'True'}
0.6 {'alpha': 1.0, 'fit_prior': 'False'}
0.6 {'alpha': 1.1, 'fit_prior': 'True'}
0.6 {'alpha': 1.1, 'fit_prior': 'False'}
  • 这里可能是因为样本只有15个,导致参数不管如何变化对准确率都没有太大影响。

预测结果

final_model = grid_search.best_estimator_

X_test = np.array([[1.24, 1.80],[1.29, 1.81],[1.43,2.03]])
X_test_prepared = final_model.predict(X_test)
print("预测结果")
print(X_test_prepared)

输出:

预测结果
[2. 2. 2.]

结语

  • 两种方法在对第1个样本的预测上有不同,这里因为样本数量太少,不做深究。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

朴素贝叶斯分类朴素贝叶斯分类的一种改进,它在假设特征之间并不是完全独立的基础上,引入了一些相关性信息,但是仍然假设每个特征的影响相互独立。下面是半朴素贝叶斯分类Python实现。 首先需要导入必要的库: ```python import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score ``` 然后定义半朴素贝叶斯分类器: ```python class SemiNaiveBayes(): def __init__(self): self.prior = None self.cond_prob = None self.n_features = None self.n_classes = None def fit(self, X, y): self.n_features = X.shape[1] self.n_classes = len(np.unique(y)) self.prior = np.zeros(self.n_classes) self.cond_prob = np.zeros((self.n_features, self.n_classes)) for c in range(self.n_classes): idx = (y == c) self.prior[c] = np.sum(idx) / len(y) for j in range(self.n_features): values, counts = np.unique(X[idx, j], return_counts=True) prob = counts / np.sum(counts) self.cond_prob[j, c] = prob[np.argmax(prob)] def predict(self, X): y_pred = np.zeros(X.shape[0]) for i in range(X.shape[0]): probs = np.zeros(self.n_classes) for c in range(self.n_classes): probs[c] = self.prior[c] for j in range(self.n_features): prob = self.cond_prob[j, c] if X[i, j] in prob: probs[c] *= prob[X[i, j]] else: probs[c] *= 0 y_pred[i] = np.argmax(probs) return y_pred ``` 其中`fit()`方法用于训练模型,`predict()`方法用于预测新的样本。 接下来,我们可以使用鸢尾花数据集进行测试: ```python # 导入数据 iris = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None) # 分割数据集 X = iris.iloc[:, :-1].values y = iris.iloc[:, -1].values X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) # 训练模型 model = SemiNaiveBayes() model.fit(X_train, y_train) # 预测并计算准确率 y_pred = model.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print('Accuracy:', accuracy) ``` 输出结果为: ``` Accuracy: 0.9666666666666667 ``` 可以看出,半朴素贝叶斯分类器在鸢尾花数据集上表现良好。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羽星_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值