(本文会用到的所有代码都在这里)
对于我个人而言、光看这么一个框架是非常容易摸不着头脑的
毕竟之前花了许多时间在数学部分讲的那些算法完全没有体现在这个框架中、取而代之的是一些我抽象出来的和算法无关的结构性部分……
虽然从逻辑上来说应该先说明如何搭建这个框架,但从容易理解的角度来说、个人建议先不看这章的内容而是先看后续的实现具体算法的章节
然后如果那时有不懂的定义、再对照这一章的相关部分来看
不过如果是对朴素贝叶斯算法非常熟悉的观众老爷的话、直接看本章的抽象会引起一些共鸣也说不定 ( σ’ω’)σ
所谓的框架、自然是指三种朴素贝叶斯模型(离散、连续、混合)共性的抽象了。由于贝叶斯决策论就摆在那里、不难知道如下功能是通用的:
- 计算类别的先验概率
- 训练出一个能输出后验概率的决策函数
- 利用该决策函数进行预测和评估
虽说朴素贝叶斯大体上来说只是简单的计数、但是想以比较高的效率做好这件事却比想象中的要麻烦不少(说实话麻烦到我有些不想讲的程度了)
总之先来看看这个框架的初始化步骤吧(前方高能)
|
|
其中、self._con_counter[d][c][p]
(con 是 conditional 的缩写)
总之和我一样陷入了茫然的观众老爷们可以先不太在意这一坨是什么玩意儿,毕竟这些东西是抽象程度比较高的属性……等结合具体算法时、这些属性的意义可能就会明确得多
不过需要注意的是,我们实现的NaiveBayes
基类继承了一个叫ClassifierBase
的基类、其实现是我们之前没有提及的。具体的代码可参见GitHub,这里仅大致说一下它所实现的、一些非常普适性的功能:
- 可视化二维数据
- 重载 str、repr 和 getitem 方法
- 根据
predict
方法、输出某个数据集上的准确率
这样做主要是为了合理地重用代码,从而能够使机器学习模型的开发更加便捷、高效。在今后的实现中,我们也会频繁地运用到ClassifierBase
这个基类
下面进入正题……首先来看怎么计算先验概率(直接利用上面的self._cat_counter
属性即可)
|
|
其中参数lb
即为平滑项,默认为 1 意味着默认使用拉普拉斯平滑
然后看看训练步骤能如何进行抽象
|
|
(岂可修不就只是调用了一下feed_data
方法而已嘛还说成抽象什么的行不行啊)
其中用到的feed_data
方法是留给各个子类定义的、进行数据预处理的方法;然后self._fit
可说是核心训练函数、它会返回我们的决策函数self._func
最后看看怎样利用self._func
来预测未知数据
|
|
其中self.label_dic
大概是这个德性的:比如训练集的类别空间为 {red, green, blue} 然后第一个样本的类别是 red 且第二个样本的类别是 blue、那么就有
|
|
以上就是朴素贝叶斯模型框架的搭建,下一篇文章则会在该框架的基础上实现离散型朴素贝叶斯模型