哈哈哈,我又回来了,终于快到了喜大普奔的假期时间,让我们一起快乐的写博客吧。收,回正题。今天我们要来手撕一下Naive Bayes Classifier(朴素贝叶斯分类器)。为什么说手撕呢,是因为这次我们要自己实现Naive Bayes Classifier 除了对数据的处理以外,都不会使用任何外部库,来一次硬刚!
引入
我们能否在医疗记录数据集上建立分类器模型,进而预测被研究对象是否患糖尿病?
实际问题
长期以来,研究人员对 Pima Indians(此处暂译作皮马印第安人)都有极大的研究兴趣,因为他们是世界上糖尿病发病率最高的人群之一。记录皮马印第安人医疗数据及是否患有糖尿病的数据集 pima-indians-diabetes.csv 也成为了一个著名的数据集。
该数据集最初归National Institute of Diabetes and Digestive and Kidney Diseases所有,记录了怀孕次数、血压、BMI、年龄等信息。
在本次实验中,我们将在训练集上建立 Naive Bayes 分类器,并在测试集上评估模型的精度。
理论知识
之前在ISL-Chap2剩余部分笔记的贝叶斯分类器部分大略提过一下贝叶斯分类器,但是由于那篇文章的重点在如何衡量模型好坏,所以主要描述了bayers error rate(衡量贝叶斯分类器的好坏)。这一次,我们来详细写一下贝叶斯分类器的原理。
Naive Bayes
首先,我们先回顾一下 Naive Bayes Classifier 的目的。既然是分类器,要做的就是根据一部分信息( X ⃗ \vec{X} X)预测其对应的 label ( Y Y Y)。拿我们这次的实际问题举例,就是把一个人的怀孕次数、血压、BMI、年龄等信息作为输入,扔进训练好的Naive Bayes Classifier 中,让它预测这个人有没有患糖尿病。
理解了分类器的目的以后,让我们换一个角度来思考这个问题。如果我们用概率的思维方式来思考这件事,其实也就变成了,我们要找到给定某个 X ⃗ \vec{X} X的情况下,label取哪个值的概率更高。拿这次的实际问题举例,假定我们现在有了一个人的怀孕次数、血压、BMI、年龄的数据,构成了向量 X ⃗ = ( 1 , 74 , 25.6 , 30 ) \vec{X}=(1, 74, 25.6, 30) X=(1,74,25.6,30), 我们想要知道她是患糖尿病的概率大还是不患糖尿病的概率大(Y=1还是Y=0的概率大)。
抽象一点,用数学公式表示,也就是找到使得 P ( Y ∣ X ⃗ ) P(Y|\vec{X}) P(Y∣X)最大的Y。
但是这里就出现问题了, P ( Y ∣ X ⃗ ) P(Y|\vec{X}) P(Y∣X)是多少鸭,我们不知道鸭。憋着急,现在就轮到贝叶斯定理闪亮登场了。
P ( A ∣ B ) = P ( A ) × P ( B ∣ A ) P ( B )