机器学习—朴素贝叶斯算法[入门]

       首先,贝叶斯分类算法是统计学的一种概率分类方法,刚接触机器学习的小伙伴们一看见里面的公式就懵了。看网课更懵,就是不进脑子。所以,我打算做一期面对初学者的关于机器学习十大算法的博客,将复杂的公式,枯燥的概念用简单的例子和讲解表达出来。
在这里插入图片描述

栗子:瓢虫是否冬眠?

在这里插入图片描述
在这里插入图片描述

根据上面的数据,我们来预测零下的时候,年龄为20天的瓢虫,是否会冬眠。

1.准备数据

import pandas as pd

columns=['索引','温度(X1)','瓢虫的年龄(X2)','瓢虫冬眠(Y)']
data = [[0,'零下','10天','是'],\
        [1,'零下','20天','是'],\
        [2,'零上','10天','否'],\
        [3,'零下','30天','是'],\
        [4,'零下','20天','否'],\
        [5,'零下','60天','否'],\
        [6,'零上','30天','否'],\
        [7,'零下','60天','是'],\
        [8,'零上','30天','否'],\
        [9,'零上','10天','否'],\
        [10,'零下','20天','否']]
pd.DataFrame(data=data,columns=columns)

2.进行计算,计算零下的时候,年龄为20天的瓢虫,冬眠的概率。
首先,我们来了解下一下式子:
P(冬眠):冬眠的概率
P(零下|冬眠):在冬眠的情况下,温度在零下的概率。在上面的数据中,同时满足零下和冬眠的有4行数据,且在所有数据中冬眠的有4行,则P(零下|冬眠)=4/4=1
P(零下,20天|冬眠):在冬眠的情况下,既是零下,又是20天的概率。在上面的数据中,同时满足零下、20天和冬眠的有1行数据,且在所有数据中冬眠的有4行,则P(零下|冬眠)=1/4

       好了,我们引入下面的公式:
在这里插入图片描述
       这个式子就是求在零下并且年龄在20天的情况下,冬眠的概率。
对于分子,我们可以求得:
P(冬眠)=4/11 ,P(零下|冬眠)=4/4=1 ,P(20天|冬眠)=1/4
对于分母,我们可以求得:
P(零下,20天|冬眠)=1/4 ,P(不冬眠)=7/11 , P(20天|冬眠)=2/7
所以,当温度为零下的时候,生活了20天的瓢虫,会冬眠的概率为:
在这里插入图片描述
       这里附上我纯手工打造的代码,没有复杂的第三方计算库,自己制作就能把机器学习问题就搞了,是不是很惊讶?

df = pd.DataFrame(data=data,columns=columns)
#Y,X1,X2三个参数的值可以自己选择,不同的参数代表不同的问题,也就是可以根据自己的问题,改变下面三个不同的参数的值

Y = 1  #值为1意为冬眠,值为0则为不冬眠
X1 = '零下'  
X2 = '20天'

p1 = df.loc[:,'温度(X1)'].value_counts()[1]/len(df)   #P(冬眠)
p2 = len(df[(df['温度(X1)']==X1)&(df['瓢虫冬眠(Y)']=='是')].index.tolist())/len(df[(df['瓢虫冬眠(Y)']=='是')].index.tolist())   #P(零下|冬眠)
p3 = len(df[(df['瓢虫的年龄(X2)']==X2)&(df['瓢虫冬眠(Y)']=='是')].index.tolist())/len(df[(df['瓢虫冬眠(Y)']=='是')].index.tolist())   # P(20天|冬眠)
p4 = 1-p1    #P(不冬眠)
p5 = len(df[(df['瓢虫的年龄(X2)']==X2)&(df['温度(X1)']==X1)&(df['瓢虫冬眠(Y)']=='是')].index.tolist())/len(df[(df['瓢虫冬眠(Y)']=='是')].index.tolist())# P(零下,20天|冬眠)
p6 = len(df[(df['瓢虫的年龄(X2)']==X2)&(df['温度(X1)']==X1)&(df['瓢虫冬眠(Y)']=='否')].index.tolist())/len(df[(df['瓢虫冬眠(Y)']=='否')].index.tolist())# P(零下,20天|不冬眠)
Probability = p2*p3*p1/(p1*p5+p4*p6)
print('预测值为:',Probability)  
if Probability >= 0.5:
    print('冬眠')
else:
    print('不冬眠')

运行结果:
在这里插入图片描述
       在此,我补上上面的一个公式,也就是将冬眠改为Y=1,零下改为X1,20天改为X2。则式子为:
在这里插入图片描述
       在这个例子中,我们设定阈值为0.5,假设大于0.5的就被认为是会冬眠,小于0.5的就被认为是不会冬眠。根据我们的计算,我们认为一 个在零下条件下,年龄为20天的瓢虫,是不会冬眠的。这就完成了一次预测。但是这样,有趣的地方又来了。刚才的预测过程是没有问题的。但我们总是好奇,这个决策过程 中,我们的训练集和我的测试集分别在哪里?以及,算法、建模,我的模型在哪里呢?
       我给了大家一张有标签的表,然后提出说,我要预测零下的时候,年龄为20天的瓢虫,会冬眠的概率,然后我们就 顺理成章地算了出来。没有利用训练集求解某个模型的过程,也没有训练完毕了我们来做测试的过程,而是直接对 有标签的数据提出要求,就可以得到预测结果了。

这说明,朴素贝叶斯是一个不建模的算法!

       对,没错,以往我们学的不建模算法,比如KMeans,比如PCA,都是无监督学习,而朴素贝叶斯是第一个有监督的,不建模的分类算法。
       而我提出的要求“零下的时候,年龄为20天的瓢虫”就是没有标签的测试集。我们认为,训练集和测试集都来自 于同一个不可获得的大样本下,并且这个大样本下的各种属性所表现出来的规律应当是一致的,因此训练集上计算 出来的各种概率,可以直接放到测试集上来使用。即便不建模,也可以完成分类。
       看到这里,是不是觉得机器学习十大算法之一-朴素贝叶斯算法不太难?不过,学习朴素贝叶斯算法还有很长路要走,这里我只是用简单的例子和代码来引领大家走进机器学习的大门,也是我做这一期博客的初衷,也希望大家多多支持和鼓励,点个赞,加个关注,我会持续更新机器学习十大算法。

猜你喜欢

转载自blog.csdn.net/weixin_45104240/article/details/104681928
今日推荐