首先,贝叶斯分类算法是统计学的一种概率分类方法,刚接触机器学习的小伙伴们一看见里面的公式就懵了。看网课更懵,就是不进脑子。所以,我打算做一期面对初学者的关于机器学习十大算法的博客,将复杂的公式,枯燥的概念用简单的例子和讲解表达出来。
栗子:瓢虫是否冬眠?
根据上面的数据,我们来预测零下的时候,年龄为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天的瓢虫”就是没有标签的测试集。我们认为,训练集和测试集都来自 于同一个不可获得的大样本下,并且这个大样本下的各种属性所表现出来的规律应当是一致的,因此训练集上计算 出来的各种概率,可以直接放到测试集上来使用。即便不建模,也可以完成分类。
看到这里,是不是觉得机器学习十大算法之一-朴素贝叶斯算法不太难?不过,学习朴素贝叶斯算法还有很长路要走,这里我只是用简单的例子和代码来引领大家走进机器学习的大门,也是我做这一期博客的初衷,也希望大家多多支持和鼓励,点个赞,加个关注,我会持续更新机器学习十大算法。