机器学习—有监督学习—朴素贝叶斯(代码实现)

一、朴素贝叶斯模型(Naive Bayesian Model,NBM)

朴素贝叶斯中的朴素一词的来源就是假设各特征之间相互独立。这一假设使得朴素贝叶斯算法变得简单,但有时会牺牲一定的分类准确率。

1、条件概率
设A,B为任意两个事件,若P(A)>0,我们称在已知事件A发生的条件下,事件B发生的概率为条件概率,记为P(B|A),并定义
机器学习—有监督学习—朴素贝叶斯(代码实现)_第1张图片
2、全概率公式
如果
在这里插入图片描述
P(Ai)>0,则对任一事件B,有
机器学习—有监督学习—朴素贝叶斯(代码实现)_第2张图片
全概率公式是用于计算某个“结果” B发生的可能性大小。如果一个结果B的发生总是与某些前提条件Ai 相联系,那么在计算P(B)时,我们就要用Ai 对B作分解,应用全概率公式计算P(B),我们常称这种方法为全集分解法。

3、贝叶斯公式(又称逆概公式)

如果
在这里插入图片描述
P(Ai)>0,则对任一事件B,只要P(B)>0,有
机器学习—有监督学习—朴素贝叶斯(代码实现)_第3张图片
如果在B发生的条件下探求导致这一结果的各种“原因” Aj 发生的可能性大小P(Aj |B),则要应用贝叶斯公式。

朴素贝叶斯
在这里插入图片描述
下图是专业表示:
机器学习—有监督学习—朴素贝叶斯(代码实现)_第4张图片

二、朴素贝叶斯算法三个小例题

1、
机器学习—有监督学习—朴素贝叶斯(代码实现)_第5张图片机器学习—有监督学习—朴素贝叶斯(代码实现)_第6张图片
2、还有一个典型例题嫁不嫁问题,对朴素贝叶斯公式的拆解。
在这里插入图片描述3、由于分母相同,只需要比较分子大小即可。
机器学习—有监督学习—朴素贝叶斯(代码实现)_第7张图片
4、出现某个模型参数为0时,0乘任何数都=0,直接影响到后验概率的计算结果。
引入拉普拉斯平滑
机器学习—有监督学习—朴素贝叶斯(代码实现)_第8张图片

三、朴素贝叶斯算法优缺点

优点:
(1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
(2)对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
(3)对缺失数据不太敏感,算法也比较简单,常用于文本分类。
缺点:
(1)理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
(2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
(3)由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
(4)对输入数据的表达形式很敏感。

四、朴素贝叶斯算法代码实现

1、调库实现

from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import cross_val_score
from sklearn import datasets
iris = datasets.load_iris()
gnb = GaussianNB()
scores=cross_val_score(gnb, iris.data, iris.target, cv=10)
print("Accuracy:%.3f"%scores.mean()) 

Accuracy:0.953

2、手写实现

数据集

X1,X2,Y
1,S,-1
1,M,-1
1,M,1
1,S,1
1,S,-1
2,S,-1
2,M,-1
2,M,1
2,L,1
2,L,1
3,L,1
3,M,1
3,M,1
3,L,1
3,L,-1

代码

import pandas as pd
df = pd.read_csv('../datas/bayes_lihang.txt',delimiter=',')
X = df.iloc[:,:-1]
y = df.iloc[:,-1]
y = list(set(y.values)) # 【1,-1】

# 预测数据
X_predict = [2,'S']
x1 = X_predict[0]
x2 = X_predict[1]

dis = []
for df_y in y:
    # 1.统计标签为df_y的所有数据
    df_y_count =df[df['Y']==df_y]['Y'].count()
    # 2.统计所有样本的个数
    m = df.shape[0]

    # 3.统计df_y中,所有x1的数据个数
    x1_y = df[(df['Y']==df_y) & (df['X1']==x1)]['X1'].count()
    # 4.统计df_y中,所有x2的数据的个数
    x2_y = df[(df['Y']==df_y) & (df['X2']==x2)]['X2'].count()

    p = (df_y_count/m) * (x1_y/df_y_count) * (x2_y/df_y_count)
    dis.append([p,df_y])

# 排序
dis.sort(key=lambda s:s[0],reverse=True)
print(dis[0][1])

#---结果为
-1

大佬详细案例解读

你可能感兴趣的:(机器学习)