机器学习笔记(4.1)

机器学习系列文章目录

文章目录

  • 机器学习系列文章目录
    • 第九节
      • 一个例子
      • 算法原理
      • 算法的优缺点
        • 优点
        • 缺点
      • 关于 K 的选取
      • 尝试动手
      • 总结
    • 第十节
      • 一个例子
      • 算法原理
      • 算法的优缺点
        • 几个版本的决策树的比较
        • 优点
        • 缺点
      • 关于剪枝
      • 尝试动手
      • 扩展内容
      • 总结
    • 十一节
      • 一个例子
      • 算法原理
        • 如何处理连续值
        • 关于平滑
      • 算法的优缺点
        • 优点
        • 缺点
      • 尝试动手
      • 扩展内容
      • 总结


第九节

你好,从这一课时开始,我们将进入 “模块三:分类问题” 的学习。在算法部分,我会介绍一个跟算法思
想相关的小例子,然后介绍算法的优缺点和适用场景,对于部分算法我将给出算法模块的调用方法,此
外一些扩展的内容我会放在最后讲解。在每一个类型的算法最后,我都尽量安排一节小小的实践课,一
起来看看数据挖掘是如何做的。
今天我要讲的这个算法是最近邻算法(K-NearestNeighbor),简称 KNN 算法。

一个例子

有一句老话叫作 “物以类聚、人以群分”。想象我们在一个特别的社区里,一条清澈的小河从社区中心流
过,小河左侧环境优美,住着一群有钱人,家家户户都是别墅;而小河的另一侧,住着大片贫民,用茅
草和纸板搭建的临时住所密密麻麻的。这时有一个新的住户从外面搬进了这个社区,他住在了小河的左
侧,此时社区里就传开了消息:“我们这又搬来了一户有钱人家。” 可是谁都不认识他,也看不到他的银
行账户,为什么就认定他是有钱人呢?那是因为他跟有钱人住在一起了。故事到了这里,也就说明了最
近邻算法的思路:“你跟谁住得近,你就跟谁是同一类”。

算法原理

有了思路,我们再来看看原理,KNN 算法是如何处理的。用一句话来解释 KNN 算法原理,那就是找到
K 个与新数据最近的样本,取样本中最多的一个类别作为新数据的类别。在前面的例子中,找到和新搬
进来的一户人家住的距离最近的 K 户人家,看看 K 户人家中是有钱人多还是穷人多,取多的那个类别
作为新搬来这户的类别。所以,显然他住在富人区,那附近就会有更多的富人。
这里面我们提到了一个距离最近,关于距离该怎么计算呢?最常见的一个计算方法就是欧式距离,即两
点之间的连线,如果放在地图上就是两个房子的直线距离。当然除了欧式距离,还有很多距离计算的方
式,比如曼哈顿距离、切比雪夫距离等。

算法的优缺点

如此简单的算法都有哪些优缺点呢?下面我结合使用场景进行分析。

优点

简单易实现: 刚把 KNN 算法介绍完了,是不是很简单?从上面的内容可以看出来,KNN 算法最后实际
上并没有抽象出任何模型,而是把全部的数据集直接当作模型本身,当一条新数据来了之后跟数据集里
面的每一条数据进行对比。
所以可以看到 KNN 算法的一些优点,首当其冲的就是这个算法简单,简单到都不需要进行什么训练
了,只要把样本数据整理好了,就结束了,来一条新数据就可以进行预测了。
对于边界不规则的数据效果较好: 可以想到,我们最终的预测是把未知数据作为中心点,然后画一个
圈,使得圈里有 K 个数据,所以对于边界不规则的数据,要比线性的分类器效果更好。因为线性分类器
可以理解成画一条线来分类,不规则的数据则很难找到一条线将其分成左右两边。

缺点

只适合小数据集: 正是因为这个算法太简单,每次预测新数据都需要使用全部的数据集,所以如果数据
集太大,就会消耗非常长的时间,占用非常大的存储空间。
数据不平衡效果不好: 如果数据集中的数据不平衡,有的类别数据特别多,有的类别数据特别少,那么
这种方法就会失效了,因为特别多的数据最后在投票的时候会更有竞争优势。
必须要做数据标准化: 由于使用距离来进行计算,如果数据量纲不同,数值较大的字段影响就会变大,
所以需要对数据进行标准化,比如都转换到 0-1 的区间。
不适合特征维度太多的数据: 由于我们只能处理小数据集,如果数据的维度太多,那么样本在每个维度
上的分布就很少。比如我们只有三个样本,每个样本只有一个维度,这比每个样本有三个维度特征要明
显很多。

关于 K 的选取

K 值的选取会影响到模型的效果。在极端情况下,如果 K 取 1,由于富人区人均面积都很大,家里可能
是别墅加后花园,富人与富人房子的距离相对较远,那个恰好住在河边的人可能跟河对面的一户贫民家
最近,那么这个新人就会被判定为贫民。
如果 K 取值与数据集的大小一样,那么也可想而知,由于贫民的人数户数都远远多于富人,那么所有新
进来的人,不管他住哪里都会被判定为贫民。这种情况下,最终结果就是整个样本中占多数的分类的结
果,这个模型也就没有什么作用了。
用我们前面学过的内容来看,当 K 越小的时候容易过拟合,因为结果的判断与某一个点强相关。而 K
越大的时候容易欠拟合,因为要考虑所有样本的情况,那就等于什么都不考虑。
对于 K 的取值,一种显而易见的办法就是从 1 开始不断地尝试,查看准确率。随着 K 的增加,一般情
况下准确率会先变大后变小,然后选取效果最好的那个 K 值就好了。当然,关于 K 最好使用奇数,因为
偶数在投票的时候就困难了,如果两个类别的投票数量是一样的,那就没办法抉择了,只能随机选一
个。
所以选取一个合适的 K 值也是 KNN 算法在实现时候的一个难点,需要根据经验和效果去进行尝试。

尝试动手

接下来,我们尝试借助代码来使用 KNN 算法。今天的动手环节可能要多一点,因为还涉及一些周边的
东西,所以我会把前后的代码都写上,包括数据集获取、数据的处理以及训练和预测等环节,在后面一
些算法的动手环节就不需要再去重复了。
首先是导入我们所需要的依赖库
可以看到,该模型的准确率为 0.9,其中第二个数据预测错误了。
经过上面的一个动手尝试,我们已经成功地实践了 KNN 算法,并使用它对鸢尾花数据进行了分类计
算,不知道你是不是有点小激动?当然,关于里面的很多细节这里都没有涉及,希望大家接下来能够更
加深入地去探索。

总结

这一小节,我们开始真正走进了一个算法之中,去研究算法的奥秘。当然,我期望以一种简单易学的方
式向你介绍算法的原理,并去掉了那些让人头疼的计算公式。在这一节里,我介绍了 KNN 分类算法,
从一个例子开始,然后引入了它的原理,并希望你能了解它的优缺点,对于后面的算法,我也会沿用这
种方式去介绍。最后,我还写出了一段简单的代码,如果你已经在电脑上安装了 Python,那你可以复
制并直接运行它,当然我希望你能够自己去敲一遍代码,这样也能够加深你的印象。

第十节

今天是分类算法的第二课时,我们今天要介绍的是一个应用非常广泛的模型——决策树。首先我依然会
从一个例子出发,看看女神是怎样决策要不要约会的;然后分析它的算法原理、思路形成的过程;由于
决策树非常有价值,还衍生出了很多高级版本,在扩展内容里我也进行了简要的介绍。希望通过本课时
的学习,你可以掌握决策树的思路以及使用方法,并能够尝试用它来解决遇到的问题。

一个例子

我们都知道女神身后有很多的追求者,她肯定不会和每个人都约会,因为时间不够,必须要好好管理自
己的时间才行。于是女神给每个想要约会的人发信息说:“把你的简历发过来吧。”
简历收上来后,第一眼先看照片,颜值打几分?然后再看年收入,长得帅的就可以少挣点,毕竟 “帅也
可以当饭吃啊”。不帅的呢?那收入必须要求高一点,“颜值不够,薪资来凑”。薪资还差点的,再看看学
历是不是研究生 / 985/211,看看身高有没有 180…… 所以你就可以对号入座了,发现自己哪条都不符
合,好了,去好好“搬砖” 吧。
由此可知,女神的筛选条件有颜值、身高、收入、学历等,每一项都会对最后是否约会的结果产生影
响,即女神通过对这几种条件的判断,决定是否要安排约会。
上面这个过程就是决策树的思路,下面我们来看一下决策树的具体原理。

算法原理

在已知的条件中,选取一个条件作为树根,也就是作为第一个决策条件,比如 “颜值” 分为帅和不帅两个
结果,然后再看是否还需要其他判断条件。如果需要的话,继续构建一个分支来判断第二个条件,以此
类推,直到能够推出一个结果,这个分支就结束了。
同样的,当我们把所有样本数据中出现的情况组合都构建入这棵树的时候,我们的算法也就完成了对样
本的学习。最终形成的这棵树上,所有的叶子节点都是要输出的类别信息,所有的非叶子节点都是特征
信息。当一个新的数据来了之后,就按照对应的判断条件,从根节点走到叶子节点,从而获得这个数据
的分类结果。
比如,我帮女神收集了几份简历,然后按照条件整理出如下结果:
编号 颜值 年收入 身高 学历
1 帅 28 w 178 cm 本科
2 不帅 100 w 176 cm 硕士
3 不帅 40 w 185 cm 硕士
根据女神已经制定好的决策树,我们去预测一下这三个人能否获得约会资格。第一个人帅,那就从根节
点走向左分支;再判断第二个条件:年收入只有 28w,不到 30w 的标准,那就被淘汰了。第二个人不
帅,走向右分支,年收入 100w,那就可以继续往下进入左分支,身高 176cm 刚好过合格线,获得左
分支的结果,顺利进入约会环节。第三个人不帅,年收入 40w,那就进入右分支,还需要再看学历:是
研究生,那还可以继续走向左分支,身高有 185cm,那也成功获得约会资格。
这就是决策树最初的一个思路。但是这里有一个问题,我想你可能也会想到,那就是该如何选择一个特
征作为根节点?下一次决策又该选取哪个特征作为节点?决策树算法使用了一种称作信息增益的方法来
衡量一个特征和特征之间的重要性,信息增益越大表明这个特征越重要,那么就优先对这个特征进行决
策。至于信息增益和信息熵是在信息论中涉及的内容,如果你有兴趣可以再进行详细学习。
在一种理想的情况下,我们构建的决策树上的每一个叶子节点都是一个纯粹的分类,也就是通过这条路
径进入到这个叶子节点的所有数据都是同一种类别,但是这需要反复回溯修改非叶子节点的判定条件,
而且要划分更多的分支来进行处理,所以实际上决策树实现的时候都采用了贪心算法,来寻找一个最近
的最优解,而不是全局的最优解。

算法的优缺点

几个版本的决策树的比较

决策树最初的版本称为 ID3( Iterative Dichotomiser 3 ),ID3 的缺点是无法处理数据是连续值的情
况,也无法处理数据存在缺失的问题,需要在准备数据环节把缺失字段进行补齐或者删除数据。后来有
人提出了改进方案称为 C4.5,加入了对连续值属性的处理,同时也可以处理数据缺失的情况。同时,还
有一种目前应用最多的 CART( Classification And Regression Tree)分类与回归树,每次分支只使用
二叉树划分,同时可以用于解决回归问题。
关于这三种决策树,我列了一个对比的表格,可以看到它们之间的区别。
这里的优缺点是针对 CART 树来讲,因为现在 CART 是主流的决策树算法,而且在 sklearn 工具包中使
用的也是 CART 决策树。那么我们再看一下,决策树算法有什么优缺点。

优点

非常直观,可解释极强。 在生成的决策树上,每个节点都有明确的判断分支条件,所以非常容易
看到为什么要这样处理,比起神经网络模型的黑盒处理,高解释性的模型非常受金融保险行业的欢
迎。在后面的动手环节,我们能看到训练完成的决策树可以直接输出出来,以图形化的方式展示给
我们生成的决策树每一个节点的判断条件是什么样子的。
预测速度比较快。 由于最终生成的模型是一个树形结构,对于一条新数据的预测,只需要按照条
件在每一个节点进行判定就可以。通常来说,树形结构都有助于提升运算速度。
既可以处理离散值也可以处理连续值,还可以处理缺失值。

缺点

容易过拟合。 试想在极端的情况下,我们根据样本生成了一个最完美的树,那么样本中出现的每
一个值都会有一条路径来拟合,所以如果样本中存在一些问题数据,或者样本与测试数据存在一定
的差距时,就会看出泛化性能不好,出现了过拟合的现象。
需要处理样本不均衡的问题。 如果样本不均衡,某些特征的样本比例过大,最终的模型结果将会
更偏向这些特征。
样本的变化会引发树结构巨变。

关于剪枝

上面提到的一个问题就是决策树容易过拟合,那么我们需要使用剪枝的方式来使得模型的泛化能力更
好,所以剪枝可以理解为简化我们的决策树,去掉不必要的节点路径以提高泛化能力。剪枝的方法主要
有预剪枝和后剪枝两种方式。

  • 预剪枝: 在决策树构建之初就设定一个阈值,当分裂节点的熵阈值小于设定值的时候就不再进行
    分裂了;然而这种方法的实际效果并不是很好,因为谁也没办法预料到我们设定的恰好是我们想要
    的。
  • 后剪枝: 后剪枝方法就是在我们的决策树已经构建完成以后,再根据设定的条件来判断是否要合
    并一些中间节点,使用叶子节点来代替。在实际的情况下,通常都是采用后剪枝的方案。
    尝试动手

尝试动手

关于几个版本的决策树你已经有了大致的了解,那么下面我们来动手写一写使用决策树算法进行的代
码。
在前面的部分我没有写更多的注释,这部分是关于包的引入和导入数据的,在前面的章节已经进行过介
绍,这里主要是把引入的算法包进行了调整,其余的部分实际上没有什么修改,如果你忘了可以看一下
前面的章节。

from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
import numpy as np
np.random.seed(0)
iris=datasets.load_iris()
iris_x=iris.data
iris_y=iris.target
indices = np.random.permutation(len(iris_x))
iris_x_train = iris_x[indices[:-10]]
iris_y_train = iris_y[indices[:-10]]
iris_x_test = iris_x[indices[-10:]]
iris_y_test = iris_y[indices[-10:]]

在模型训练时,我们设置了树的最大深度为 4。

clf = DecisionTreeClassifier(max_depth=4) 
clf.fit(iris_x_train, iris_y_train)

根据上面的介绍,我们可以知道,经过调用 fit 方法进行模型训练,决策树算法会生成一个树形的判定
模型,今天我们尝试把决策树算法生成的模型使用画图的方式展示出来。


from IPython.display import Image
from sklearn import tree
import pydotplus
dot_data = tree.export_graphviz(clf, out_file=None, feature_names=iris.feature_names, class_names=iris.target_names, filled=True, rounded=True, special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())

经过运行上面的代码,就会输出下面这幅图,可以看到每一次的判定条件以及基尼系数,还有能够落入
此决策的样本数量和分类的类别。
看完了模型,我们使用模型来对测试数据进行一下预测。这里调用的预测方法跟之前都是一样的,这里
就不详细介绍了。

iris_y_predict = clf.predict(iris_x_test)
score=clf.score(iris_x_test,iris_y_test,sample_weight=None)
print('iris_y_predict = ')
print(iris_y_predict)
print('iris_y_test = ') 
print(iris_y_test)
print('Accuracy:',score)

我们看一下输出的结果,可以看到第二个测试样本预测错误了,其他的都预测正确,准确率是 90%。

今天我们的代码主要实现了工具包中的决策树算法,同时新增了一块输出决策树模型的方法,你是否也
想亲手来试一下呢?下面我再讲解一些扩展内容,看看决策树算法在后续的演进中都有什么样的变化。

扩展内容

  • 随机森林:为了更好地解决泛化及树结构变动问题,从决策树演进出来随机森林算法。根据
    我们前面讲的模型集成方法,随机森林就是使用了 bagging 方案构建了多棵决策树,然后对所有
    树的结果来进行平均计算以获得最终的结果。
  • GBDT:在随机森林的基础上,研究者又提出了梯度提升决策树算法(Gradient Boosting
    Decision Tree,GBDT),GBDT 是基于 boosting 的策略。与随机森林一样的是,GBDT 也会构
    建多棵决策树;但不同的是,GBDT 构建的多棵树之间是有联系的,每个分类器在上一轮分类器的
    残差基础上进行训练。
  • XGBoost:一个非常火热的模型,有 “机器学习大杀器” 之称,在很多比赛中都获得了非常好的结
    果。但实际上 XGBoost 不算是一个算法,而是对 GBDT 的一种工程实现,它优化了 GBDT 里面的
    求解过程,并加入了很多工程上的优化项目,使得数据处理、运算速度等环节都有了很大的提升。

总结

这一小节的课程,我们讲解了第二个分类算法——决策树算法,首先从女神如何决策跟谁约会的问题出
发,引出了决策树算法的原理,由于决策树算法非常容易理解,效果很好而且易于解释,所以研究者提
出了各种各样的改进方案,并由决策树延伸出了很多新的优秀的算法。在尝试动手的环节,本课时加入
了一些绘图的技巧,希望大家也能够掌握这部分的内容,这样也可以提升工作效率。
看完了决策树算法的介绍,不知道你是否对其中的细节还有什么疑惑?你可以在评论中写下来与大家一
起讨论。

十一节

本节课讲解第三个分类算法——朴素贝叶斯,我依然以一个例子开头,带领你进入朴素贝叶斯算法的世
界,通过算法原理、算法优缺点的讲解,带你算一算是否要买航空延误险。最后我们再动手来写一下代
码,看看如何使用朴素贝叶斯来进行分类。

一个例子

最近看到一则新闻,王女士从 2015 年开始,凭借自己对航班和天气的分析,成功地购买了大约 900 次
飞机延误险并获得延误赔偿,累计获得保险理赔金高达 300 多万元。那么她是怎么决定要买延误险的
呢?
其实,航班延误最主要的原因就是天气变化,包括起飞地及降落地的天气;除此之外,也有机场和航空
公司的原因。假设这些原因之间并没有互相影响,每一项对于飞机最终是否延误的影响都是独立的,王
女士集齐过去的数据,就可以计算出每一个条件与飞机延误的概率。比如,在总体上延误的概率为
20%,不延误的概率为 80%。在飞机延误的情况下,“起飞地天气 = 晴天” 的概率为 20%,“降落地天气
= 雨天” 的概率为 40%,“机场 = 首都机场” 的概率为 35%,“航空公司 = 南方航空” 的概率为 5%;在不
延误的情况下,这些属性的概率分别为 60%、55%、45%、55%。
那么这个时候,有一架南方航空公司的航班,从北京飞往上海,北京天气是晴天,上海天气是雨天,那
么,我们就可以根据上面的概率算出来不延误的综合概率 = 80% × 60% × 55% × 45% × 55% =
0.0065412,延误的综合概率 = 20% × 20% × 40% × 35% × 5% = 0.00028,从这个结果来看,不延误
的可能性要高于延误的可能性,所以这次不需要买延误险。

算法原理

上面的这个例子就是我今天要介绍的算法——朴素贝叶斯分类器的思路,贝叶斯这个名字你应该很熟
悉,这简直就是概率论的鼻祖,所以我们这个算法的原理也跟概率论脱不开干系。考虑我们分类所用到
的特征和分类结果,朴素贝叶斯有一个假设前提,那就是所有的条件对结果都是独立发生作用的。就像
我们上面预测是否要买延误险一样,起飞地的天气不会对降落地的天气有影响,同时起飞地和降落地的
天气以及所造成的延误问题不会比他们单独发生时有任何区别。所以根据这个思想,出现了朴素贝叶斯
概率公式:
这个公式看不懂没关系,我把它转换成我们的属性和分类,再来看一下:
在某些属性已知的情况下,获得某个分类的概率就等于在已知分类的情况下,某个属性的概率乘以分类
的概率再除以属性的概率。具体到我们的例子上,如下所示:
我们需要获得的是左侧的结果,而右侧就是基于已有的样本数据可以计算出来。而根据上面提到的朴素
贝叶斯的假设,最重要的就是下面这个转换:
于是,根据已经有的数据,我们可以计算出每一个特征对最终结果的概率情况,比如,有 100 条数据,
结果延误的有 20 条,结果不延误的有 80 条。在延误的 20 条中,起飞地 = 晴天的有 4 条,那么在已知
延误的情况下起飞地是晴天的概率为 20%;在不延误的 80 条数据中,起飞地 = 晴天的有 48 条。那么
在已知不延误的情况下,起飞地是晴天的概率为 60%。依据这个方法,我们就可以计算出所有我们需要
的概率值,像上面的例子中那样。

如何处理连续值

预测购买延误险的例子中使用的都是离散值,那么对于连续值该怎么处理呢?假设我们新增一个特征
——机票的价格。这时,机票价格是一个连续值,我们可以假设机票这个特征服从正态分布,通过样本
集计算出机票价格对应每一个分类的均值和方差,再根据比如密度函数,计算出新数据与均值的距离,
从而获得一个概率值。关于这一块的处理细节,如果你有兴趣可以再查找一些详细的讲解。

关于平滑

对于离散值,有一个需要注意的地方:如果某一个属性值比如 “航空公司 = 西藏航空”,由于数据比较
少,在“分类 = 延误” 的类别下没有出现过,那么按照上面的方法,不管其他的特征如何,P (“航空公司
= 西藏航空”| 延误)= 0,所有用到这个的结果都会是 0。那么,这里就有一个数据准备环节的方法,称
为“平滑”(Smoothing)。这时我们可以想到一个简单的平滑方案,那就是在分子分母中同时加上一个
较小的值,来防止出现分子或分母为 0 的情况。除了我说的这种简便方法外,还有常用的拉普拉斯修
正、古德 - 图灵估计法、Katz 等平滑的方法,这里就不一一介绍了。
已经清楚了算法的基本原理,接下来我们再看一下朴素贝叶斯算法有什么优缺点。

算法的优缺点

优点

逻辑清晰简单、易于实现,适合大规模数据。 根据算法的原理,只要我们把样本中所有属性相关
的概率值都计算出来,然后分门别类地存储好,就获得了我们的朴素贝叶斯模型。
运算开销小。 根据上一条我们可以得知,所有预测需要用到的概率都已经准备好,当新数据来了
之后,只需要获取对应的概率值,并进行简单的运算就能获得结果。
对于噪声点和无关属性比较健壮。 噪声点和无关属性对算法影响较小,在很多邮件服务中仍然一
直沿用这个方法进行垃圾邮件过滤。
预测过程快。 由于所有需要用到的属性相关概率都已经计算出来了,在新数据到来需要预测的时
候,只需要把对应的一些概率值取出来进行计算就可以获得结果,所用到的时间和空间都很小。

缺点

由于做了 “各个属性之间是独立的” 这个假设,同样该算法也暴露了缺点。因为在实际应用中,属性之间
完全独立的情况是很少出现的,如果属性相关度较大,那么分类的效果就会变差。所以在具体应用的时
候要好好考虑特征之间的相互独立性,再决定是否要使用该算法,比如,维度太多的数据可能就不太适
合,因为在维度很多的情况下,不同的维度之间越有可能存在联合的情况,而不是相互独立的,那么模
型的效果就会变差。

尝试动手

通过案例我们了解了算法的原理及其优缺点,下面动动手指尝试使用贝叶斯算法来解决问题吧。
本节的代码主要调整的部分就是引入的算法模块,其他部分在前面的实践中都已经写过,你实现起来应
该已经轻车熟路了。

from sklearn import datasets
from sklearn.naive_bayes import GaussianNB
import numpy as np
np.random.seed(0)
iris=datasets.load_iris()
iris_x=iris.data
iris_y=iris.target
indices = np.random.permutation(len(iris_x))
iris_x_train = iris_x[indices[:-10]]
iris_y_train = iris_y[indices[:-10]]
iris_x_test = iris_x[indices[-10:]]
iris_y_test = iris_y[indices[-10:]]
clf = GaussianNB()
clf.fit(iris_x_train,iris_y_train)
iris_y_predict = clf.predict(iris_x_test)
score=clf.score(iris_x_test,iris_y_test,sample_weight=None)
print('iris_y_predict = ')
print(iris_y_predict)



print('iris_y_test = ')
print(iris_y_test)
print('Accuracy:',score)

我们来看一下代码的输出结果,可以看到,这次仍然是第二个没有预测正确,模型的准确率为 90%。

iris_y_predict = 
[1 2 1 0 0 0 2 1 2 0]
iris_y_test = 
[1 1 1 0 0 0 2 1 2 0]
Accuracy: 0.9

这次的代码实践没有增加太多新的内容,你写起来应该非常轻松了。在实际的研究中,也有不少基于朴
素贝叶斯算法发展出来的新方法,下面我们再来看一下朴素贝叶斯的扩展内容。

扩展内容

前面我们讲到,朴素贝叶斯是基于属性之间的独立性假设而进行构建的,但是实际上很多时候这种假设
存在一定的局限,为了打破这些局限,于是衍生出了一些方法,下面我列举两个:

  • 半朴素贝叶斯 ODE(One Dependent Estimator):为了解决朴素贝叶斯中属性独立性假设在实
    际生活中不太适用的问题,新的研究方案尝试建立一些属性间的联系,假定属性有一定的相关性,
    从而产生的算法被称为半朴素贝叶斯方法。这里说的 ODE 就是其中的一种,在 ODE 中,假设每
    个属性最多依赖于一个其他的属性,这样修正了一些有依赖的情况,同时又没有增加太多的计算复
    杂性。
  • AODE(Averaged One Dependent Estimator):AODE 其实是一种集成学习的方法。在 ODE 的
    基础上,使用 bagging 集成学习的思路,训练多个模型,其中每个模型都设置一种属性作为其他
    所有属性的关联属性,最后使用这多个模型的结果平均数值作为最终结果。

总结

讲到这里,我们这一课时的内容又要结束了,不知道你是否意犹未尽?我在这节课里讲解的朴素贝叶斯
算法是一个非常简洁的算法,只需要进行比较简单的数学计算就可以获得我们所要的结果。在开头,我
列举了一个关于计算是否要买延误险的例子,那么通过这一节的学习,你下次买机票的时候是不是也可
以算一算自己是不是要买延误险了?这节课的动手实践部分比较简单,希望能够加深你的动手能力。

你可能感兴趣的:(算法,数学建模,python,机器学习,算法,人工智能)