一、算法原理
1. 原理
朴素贝叶斯(Naive Bayesian)是基于贝叶斯定理和特征条件独立假设的分类方法。它通过特征计算分类的概率,选取概率大的情况,是基于概率论的一种机器学习分类(监督学习)方法,被广泛应用于情感分类领域的分类器。
2. 特点:
优点:
- 在数据较少的情况下仍然有效
- 可以处理多类别问题
- 可以增量式学习
增量式学习:数据量很大的情况下进行数据拟合,很难将数据一次性拟合完成,可以使用部分数据进行拟合(批次送入)的方法。但是注意,第一次时,需要传入类别。具体方法是:
nb.partial_fit()
nb.partial_fit(X_train[:300], y_train[:300], classes=[0,1])
nb.partial_fit(X_train[300:], y_train[300:])
缺点:
- 由于使用了样本属性(特征)独立性的假设,所以如果样本属性有关联时其效果不好。
如输入法快速匹配这样的功能或软件, 比如你输入几个中文字符机器就会识别出你还没输入但是最可能输入的其他字符,能够快速帮你输入你想输入的东西,表现出的状态就是机器很懂你。搜索引擎中模糊查询的关键词的快速识别,可以在下拉栏中预测出你想输入的完整答案甚至比你还懂你自己的答案都是贝叶斯算法的功劳。其他类型的还包括大部分跟简单模式识别相关的应用都是跟贝叶斯算法有关的。
二、朴素贝叶斯——朴素(相互对立性)
朴素贝叶斯算法:假设各个特征之间相互独立
为什么要假设特征之间相互独立?
1.现实生活中,某一事件的特征非常多的时候,通过统计来估计后面概率的值几乎不可做。
2.反推:假设特征之间没有相互独立,统计的时候就要在整个特征空间中找,在某一条件下全部满足所有特征,这样的话,由于数据的稀疏性,很容易统计到0的情况,这样不合适。
综上:朴素贝叶斯算法对条件概率分布做了条件独立性的假设,这一假设是的朴素贝叶斯算法变得简单,但有时会牺牲一定的分类准确率。
三、分类(API)
1. 多项式朴素贝叶斯
导入:from sklearn.naive_bayes import MultinomialNB # 多项式朴素贝叶斯
实例化:nb = MultinomialNB()
应用:主要用于文本分类,可以参考多项式朴素贝叶斯应用
2. 伯努利朴素贝叶斯
特点:特征只有0和1
导入:from sklearn.naive_bayes import BernoulliNB # 伯努利朴素贝叶斯
实例化:nb = BernoulliNB()
应用:用于离散化特征的二分类预测
方法:
a. 预测:nb.predict(‘要预测的变量’)
b. 计算概率:nb.precdict_proba(‘要预测的变量’)
简单代码示例:
from sklearn.naive_bayes import MultinomialNB # 多项式朴素贝叶斯
from sklearn.naive_bayes import BernoulliNB # 伯努利朴素贝叶斯
from sklearn.naive_bayes import GaussianNB # 高斯朴素贝叶斯
X = [
[0, 1, 0],
[1, 1, 1],
[0, 1, 1],
[0, 0, 0],
[1, 0, 1],
[0, 1, 0],
[1, 0, 0],
]
y = [0, 1, 1, 0, 1, 0, 0]
# 伯努利朴素贝叶斯: 特征只有0和1
nb = BernoulliNB()
# 拟合
nb.fit(X, y)
y_pred = nb.predict(X)
print('预测结果:', y_pred)
print('得分:', nb.score(X, y))
# 刮北风,没有闷热,多云
day1 = [[1, 0, 1]]
print('预测结果:', nb.predict(day1))
# 底层处理:将算出来的概率重新整理使其相加得1
print('预测概率', nb.predict_proba(day1))
3. 高斯朴素贝叶斯
导入:from sklearn.naive_bayes import GaussianNB # 高斯朴素贝叶斯
实例化:nb = GaussianNB()
应用:用于分类的数值预测
4. 总结
- 三个API的标签都可以是多个类别,他们之间的不同主要是对特征的约束不同
- 伯努利朴素贝叶斯适合于特征为0和1的,但是特征不是0、1型数据,可以使用伯努利贝叶斯,只是效果没有高斯效果好。
- 特征是高斯分布(正态分布),或者其他有正负或者浮点的特征数据,虽然数据不完全满足高斯分布,但是高斯朴素贝叶斯可以用于解决生活中大部分分类任务。
- 特征数量多的情况,伯努利和高斯的效果都比较好。
- 特征数量少的情况,高斯比伯努利效果好。
- 多项式朴素贝叶斯特征值不能为负数,最好是正整数,通常使用词出现的次数作为特征值(文本数据特征),多项式朴素贝叶斯适合的场景就是文本分类,情感分析和垃圾邮件识别。
四、概率
1. 概率:通过概率来衡量事件发生的可能性
概率论和统计学是两个相反的概念,统计学是抽取 部分样本统计来估算总体情况,而概率论是通过总体情况来估计单个事件或部分事情的发生情况。概率论需要已知数据去预测未知的事件。
2. 条件概率

3. 全概率
全概率公式主要用途在于它可以将一个复杂的概率计算问题,分解为若干个简单事件的概率计算问题,最后应用概率的可加性求出最终结果。


4. 贝叶斯公式
现在已知事件A确实已经发生
,若要估计它是由原因 Bi 所导致的概率,则可用 Bayes 公式求出。


机器学习相关方法
1. 内部相关数据集
from sklearn.datasets import make_blobs
# 参数
# n_samples=100 样本数
# n_features=2 特征数
# centers 标签有多少种,默认产生3个类别----通常类别是均匀的
data = make_blobs(100, 2, centers=2)
""" 判断肿瘤是恶性还是良性的案例"""
# 从机器学习内部数据集导入数据集
from sklearn.datasets import load_breast_cancer
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB
from sklearn.naive_bayes import BernoulliNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import numpy as np
# out = load_breast_cancer()
# 返回形式为字典
# print(out.keys())
# 数据集的描述
out = load_breast_cancer()
# 变量赋值
X, y = out.data, out.target
# print(out["DESCR"]) # 打印数据集的描述信息:569个样本,30个属性
print("特征\n", X)
print("标签\n", np.unique(y)) # [0 1]
# 使用哪个朴素贝叶斯----高斯
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2,
random_state=1,
stratify=y,
)
# 算法过程
# nb = GaussianNB() # 0.93859
# nb = BernoulliNB() #0.6315
# nb = MultinomialNB() # 0.92105263
# KNN算法
nb = KNeighborsClassifier() # 0.956140
# 拟合
nb.fit(X_train, y_train)
# 查看准确率
print("准确率", nb.score(X_test, y_test))
2. 训练集和测试集拆分
from sklearn.model_selection import train_test_split # 训练集测试集拆分
X_train, X_test, y_train, y_test = train_test_split(feature,
label,
test_size=0.2, # 20%的数据作为测试集
random_state=1, # 拆分为随机拆分,可以设置随机种子
stratify=label, # 保证拆分后类别比例,和原始数据集类别比例一致
)
网友评论