类型
状态
日期
链接
摘要
标签
分类
图标
密码
Property
May 19, 2024 12:11 PM
机器学习相关概念
一、机器学习和人工智能的关系
人工智能(Artificial Intelligence):是指由人工制造出来的系统所表现出来的智能。类似电影中终结者、阿尔法狗这类的具有一定的和人类智慧同样本质的一类智能的物体。
机器学习(Machine Learning):是人工智能的一个分支,是实现人工智能的一个途径,即以机器学习为手段解决人工智能中的问题,让一个计算机程序针对某一个特定人物,从经验中学习,并且越来越好。
深度学习(Deep Learning):是机器学习拉出的分支,是机器学习算法中的一种算法,一种实现机器学习的技术和学习方法。
二、机器学习类型
类型 | 说明 |
监督学习 | 训练集包含特征和目标,且目标人为标注,
根据训练集学习出一个函数,当新的数据到来的时候,可以根据这个函数预测结果 |
无监督学习 | 有训练集,有输入输出
与监督学习相比,训练集没有人为标注(不告诉模型目标是什么) |
半监督学习 | 介于监督学习和无监督学习之间 |
强化学习 | 通过观察来学习做成某种动作,每个动作都会对环境有所影响
学习对象根据观察到的周围环境的反馈来做出判断 |
k-近邻算法
一、概述
k-近邻算法(k-Nearest Neighbour algorithm),又称为KNN算法,是数据挖掘技术中原理最简单的算法。
KNN的工作原理:给定一个已知标签类别的训练数据集,输入没有标签的新数据后,在训练数据集中找到与新数据最邻近的k个实例,如果这k个实例的多数属于某个类别,那么新数据就属于这个类别。可以简单理解为:由那些离X最近的k个点来投票决定X归为哪一类。
k即人为设定的参数,又叫超参数,常见的超参数包括学习率、批量大小、迭代次数、正则化参数、隐藏层的数量和单元数、优化算法和激活函数等。超参数的选择会影响到模型的训练速度、收敛性、容量和泛化能力
如上图,k=3时,绿圆属于红三角类,k=5时,绿圆属于蓝方块类
通过距离度量可判断未知电影可能是爱情电影,该散点图例子中有两个特征,也就是在二维平面中计算两点之间的距离
如果有多个特征扩展到N维空间,使用欧式距离(也称欧几里得度量)
通过计算得到训练集中所有电影与未知电影的距离
电影名称 | 与未知电影的距离 |
无问西东 | 41.0 |
后来的我们 | 29.1 |
前任3 | 32.3 |
红海行动 | 104.4 |
唐探 | 105.4 |
战狼2 | 108.5 |
如果仅根据其到后来的我们的距离最近将其归类为爱情片,这个算法叫最近邻算法,而不是k-近邻算法
k-近邻算法步骤如下:
- 计算已知类别数据集中的电与当前点之间的距离
- 按照距离递增次序排序
- 选取与当前点距离最小的k个点
- 确定前k个点所在类别的出现频率
- 返回前k个点出现频率最高的类别作为当前点的预测类型
比如,现在K=4,那么在这个电影例子中,把距离按照升序排列,距离绿点电影最近的前4个的电影分别是《后来的我们》、《前任3》、《无问西东》和《红海行动》,这四部电影的类别统计为爱情片:动作片=3:1,出现频率最高的类别为爱情片,所以在k=4时,绿点电影的类别为爱情片。这个判别过程就是k-近邻算法。
二、k-近邻算法的Python实现
1. 算法实现
1.构建原始数据集
2.计算已知类别数据集中的点与当前点之间的距离
3.按距离升序排序,选取距离最小的k个点
4.确定前k个点所在类别的出现频率
5.选择频率最高的类别作为当前点的预测结果
2. 函数封装
分类器的性能受到很多因素的影响,比如k的取值就在很大程度上影响了分类器的预测结果,还有分类器的设置、原始数据集等等。为了测试分类器的效果,我们可以把原始数据集分为两部分,一部分用来训练算法(又称训练集),一部分用来测试算法的准确率(又称测试集)。
k-近邻算法并没有进行数据的训练,而是直接使用未知数据与已知数据进行比较从而得到结果,可以说k-近邻算法不具有显式的学习过程
三、k-近邻算法之约会网站配对效果判定
1. 背景
海伦一直使用在线约会网站寻找适合自己的约会对象,尽管约会网站会推荐不同的人选,但她并不是每一个都喜欢,经过一番总结,她发现曾经交往的对象可以分为三类:
- 不喜欢的人
- 魅力一般的人
- 极具魅力得人
海伦收集约会数据已经有了一段时间,她把这些数据存放在文本文件datingTestSet.txt中,其中各字段分别为:
- 每年飞行常客里程
- 玩游戏视频所占时间比
- 每周消费冰淇淋公升数
2. 分析数据
3. 数据归一化
提取datingTestSet.txt 中的4条样本数据
序号 | 每年飞行常客里程 | 玩游戏视频所占时间比 | 每周消费冰淇淋公升数 | 分类 |
1 | 40920 | 8.3 | 1.0 | largeDoses |
2 | 14488 | 7.2 | 1.7 | smallDoses |
3 | 26052 | 1.4 | 0.8 | didntLike |
4 | 75136 | 13.1 | 0.4 | didntLike |
如果要计算样本1和样本2之间的距离,可以用欧几里得计算公式:
很容易发现上面的公式中差值最大的属性对计算结果的影响最大,也就是说每年飞行常客里程对计算结果的影响远远大于其他两个特征,但是在海伦看来这三个特征都是同等重要的,所以需要对着三个特征进行数值归一化,使其在该公式中的权重相等
数据归一化的处理方法有很多种,比如0-1标准化、Z-score标准化、Sigmoid压缩法等等,在这里我们使用最简单的0-1标准化,公式如下
4. 划分训练集和测试集
为了测试分类器的效果,我们可以把原始数据集分为训练集和测试集两部分,训练集用来训练模型,测试集用来验证模型准确率
关于训练集和测试集的切分函数,网上一搜一大堆,Scikit Learn官网上也有相应的函数比如model_selection 类中 的train_test_split 函数也可以完成训练集和测试集的切分
通常来说,我们只提供已有数据的90%作为训练样本来训练模型,其余10%的数据用来测试模型。这里需要注意的 10%的测试数据一定要是随机选择出来的,由于海伦提供的数据并没有按照特定的目的来排序,所以我们这里可以 随意选择10%的数据而不影响其随机性
5. 分类器针对于约会网站的测试
接下来就是构建这个约会网站数据的分类器,上面我们已经将原始数据集进行归一化处理然后也切 分了训练集和测试集,所以我们的函数的输入参数就可以是train、test和k(k-近邻算法的参数,也就是选择的距离最小的k个点)
预测结果
模型预测准确率为0.95
0 | 1 | 2 | 3 | predict |
0.513766 | 0.170320 | 0.262181 | didntLike | didntLike |
0.089599 | 0.154426 | 0.785277 | smallDoses | smallDoses |
0.611167 | 0.172689 | 0.915245 | didntLike | didntLike |
0.012578 | 0.000000 | 0.195477 | smallDoses | smallDoses |
0.110241 | 0.187926 | 0.287082 | smallDoses | smallDoses |
0.812113 | 0.705201 | 0.681085 | didntLike | didntLike |
0.729712 | 0.490545 | 0.960202 | didntLike | didntLike |
0.130301 | 0.133239 | 0.926158 | smallDoses | smallDoses |
0.557755 | 0.722409 | 0.780811 | largeDoses | largeDoses |
0.437051 | 0.247835 | 0.131156 | largeDoses | didntLike |
0.722174 | 0.184918 | 0.074908 | didntLike | didntLike |
0.719578 | 0.167690 | 0.016377 | didntLike | didntLike |
0.690193 | 0.526749 | 0.251657 | didntLike | didntLike |
0.403745 | 0.182242 | 0.386039 | didntLike | didntLike |
0.401751 | 0.528543 | 0.222839 | largeDoses | largeDoses |
0.425931 | 0.421948 | 0.590885 | largeDoses | largeDoses |
0.294479 | 0.534140 | 0.871767 | largeDoses | largeDoses |
0.506678 | 0.550039 | 0.248375 | largeDoses | largeDoses |
0.139811 | 0.372772 | 0.086617 | largeDoses | smallDoses |
0.386555 | 0.485440 | 0.807905 | largeDoses | largeDoses |
0.748370 | 0.508872 | 0.408589 | didntLike | didntLike |
0.342511 | 0.461926 | 0.897321 | largeDoses | largeDoses |
0.380770 | 0.515810 | 0.774052 | largeDoses | largeDoses |
0.146900 | 0.134351 | 0.129138 | smallDoses | smallDoses |
0.332683 | 0.469709 | 0.818801 | largeDoses | largeDoses |
0.117329 | 0.067943 | 0.399234 | smallDoses | smallDoses |
0.266585 | 0.531719 | 0.476847 | largeDoses | largeDoses |
0.498691 | 0.640661 | 0.389745 | largeDoses | largeDoses |
0.067687 | 0.057949 | 0.493195 | smallDoses | smallDoses |
0.116562 | 0.074976 | 0.765075 | smallDoses | smallDoses |
0.324444 | 0.159827 | 0.773808 | didntLike | didntLike |
0.245330 | 0.258142 | 0.113517 | didntLike | smallDoses |
0.560144 | 0.182547 | 0.348066 | didntLike | didntLike |
0.587731 | 0.381171 | 0.180722 | largeDoses | largeDoses |
0.563332 | 0.433992 | 0.433036 | largeDoses | largeDoses |
0.272359 | 0.007336 | 0.451771 | didntLike | didntLike |
0.676345 | 0.397965 | 0.016126 | didntLike | didntLike |
0.779289 | 0.339021 | 0.717425 | didntLike | didntLike |
0.298840 | 0.248214 | 0.645230 | largeDoses | didntLike |
0.333647 | 0.494317 | 0.641283 | largeDoses | largeDoses |
0.204551 | 0.099294 | 0.601182 | smallDoses | smallDoses |
0.773504 | 0.485291 | 0.585441 | didntLike | didntLike |
0.138957 | 0.002238 | 0.477146 | smallDoses | smallDoses |
0.893988 | 0.536435 | 0.822646 | didntLike | didntLike |
0.766481 | 0.693041 | 0.600874 | didntLike | didntLike |
0.089008 | 0.169915 | 0.314163 | smallDoses | smallDoses |
0.206710 | 0.168393 | 0.050502 | smallDoses | smallDoses |
0.886199 | 0.694651 | 0.223693 | didntLike | didntLike |
0.612394 | 0.144724 | 0.521908 | didntLike | didntLike |
0.346072 | 0.088242 | 0.287913 | didntLike | didntLike |
0.116037 | 0.488838 | 0.474071 | largeDoses | smallDoses |
0.767982 | 0.524200 | 0.714825 | didntLike | didntLike |
0.582330 | 0.101816 | 0.871256 | didntLike | didntLike |
0.131386 | 0.000000 | 0.947669 | smallDoses | smallDoses |
0.362802 | 0.453599 | 0.487888 | largeDoses | largeDoses |
0.081218 | 0.000000 | 0.601785 | smallDoses | smallDoses |
0.115949 | 0.000000 | 0.748961 | smallDoses | smallDoses |
0.642775 | 0.313426 | 0.031886 | didntLike | didntLike |
0.383662 | 0.476095 | 0.034741 | largeDoses | largeDoses |
0.776166 | 0.355463 | 0.872718 | didntLike | didntLike |
0.153507 | 0.019355 | 0.270521 | smallDoses | smallDoses |
0.383629 | 0.475777 | 0.973301 | largeDoses | largeDoses |
0.776122 | 0.745733 | 0.012264 | didntLike | didntLike |
0.033131 | 0.130207 | 0.227991 | smallDoses | smallDoses |
0.060544 | 0.024564 | 0.780407 | smallDoses | smallDoses |
0.056019 | 0.000000 | 0.507981 | smallDoses | smallDoses |
0.228447 | 0.348032 | 0.848293 | smallDoses | smallDoses |
0.449191 | 0.437967 | 0.654538 | largeDoses | largeDoses |
0.173359 | 0.047407 | 0.430736 | smallDoses | smallDoses |
0.388198 | 0.353662 | 0.403138 | largeDoses | largeDoses |
0.588465 | 0.580790 | 0.819148 | largeDoses | largeDoses |
0.705258 | 0.437379 | 0.515681 | didntLike | didntLike |
0.101772 | 0.462088 | 0.808077 | smallDoses | smallDoses |
0.664085 | 0.173051 | 0.169156 | didntLike | didntLike |
0.200914 | 0.250428 | 0.739211 | smallDoses | smallDoses |
0.250293 | 0.703453 | 0.886825 | largeDoses | largeDoses |
0.818161 | 0.690544 | 0.714136 | didntLike | didntLike |
0.374076 | 0.650571 | 0.214290 | largeDoses | largeDoses |
0.155062 | 0.150176 | 0.249725 | smallDoses | smallDoses |
0.102188 | 0.000000 | 0.070700 | smallDoses | smallDoses |
0.208068 | 0.021738 | 0.609152 | smallDoses | smallDoses |
0.100720 | 0.024394 | 0.008994 | smallDoses | smallDoses |
0.025035 | 0.184718 | 0.363083 | smallDoses | smallDoses |
0.104007 | 0.321426 | 0.331622 | smallDoses | smallDoses |
0.025977 | 0.205043 | 0.006732 | smallDoses | smallDoses |
0.152981 | 0.000000 | 0.847443 | smallDoses | smallDoses |
0.025188 | 0.178477 | 0.411431 | smallDoses | smallDoses |
0.057651 | 0.095729 | 0.813893 | smallDoses | smallDoses |
0.051045 | 0.119632 | 0.108045 | smallDoses | smallDoses |
0.192631 | 0.305083 | 0.516670 | smallDoses | smallDoses |
0.304033 | 0.408557 | 0.075279 | largeDoses | largeDoses |
0.108115 | 0.128827 | 0.254764 | smallDoses | smallDoses |
0.200859 | 0.188880 | 0.196029 | smallDoses | smallDoses |
0.041414 | 0.471152 | 0.193598 | smallDoses | smallDoses |
0.199292 | 0.098902 | 0.253058 | smallDoses | smallDoses |
0.122106 | 0.163037 | 0.372224 | smallDoses | smallDoses |
0.754287 | 0.476818 | 0.394621 | didntLike | didntLike |
0.291159 | 0.509103 | 0.510795 | largeDoses | largeDoses |
0.527111 | 0.436655 | 0.429005 | largeDoses | largeDoses |
0.479408 | 0.376809 | 0.785718 | largeDoses | largeDoses |
四、算法总结
k-近邻 | ㅤ |
算法功能 | 分类(核心),回归 |
算法类型 | 有监督学习 - 惰性学习,距离类模型 |
数据输入 | 包含数据标签y,且特征空间中至少包含k个训练样本(k≥1)
特征空间中各个特征的量纲需统一,若不统一则需要进行归一化处理
自定义的超参数k(k≥1) |
模型输出 | 在KNN分类中,输出是标签中的某个类别
在KNN回归中,输出是对象的属性值,该值是距离输入的数据最近的k个训练样本标签的平均值 |
1. 优点
- 简单好用,容易理解,精度高,理论成熟,既可以用来做分类也可以用来做回归
- 可用于数值型数据和离散型数据
- 无数据输入假定
- 适合对稀有事件进行分类
2. 缺点
- 计算复杂性高;空间复杂性高;
- 计算量太大,所以一般数值很大的时候不用这个,但是单个样本又不能太少,否则容易发生误分
- 样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少)
- 可理解性比较差,无法给出数据的内在含义(如无法像决策树那样给我们一个肉眼可见的树模型)
决策树
一、概述
决策树(Decision Tree)是有监督学习中的一种算法,并且是一种基本的分类与回归的方法。也就是有两种决策树:分类树和回归树。
什么是决策树
决策树算法的本质就是树形结构,通过一些精心设计的问题就可以对数据进行分类了,在这里需要了解三个概念:
节点 | 说明 |
根节点 | 没有进边,有出边 |
中间节点 | 既有进边也有出边,但进边有且仅有一条,出边也可以有很多条 |
叶节点 | 只有进边,没有出边,进边有且仅有一条。每个叶节点都是一个类别标签 |
*父节点和子节点 | 在两个相连的节点中,更靠近根节点的是父节点,另一个则是子节点,两者是相对的 |
我们可以把决策树看作是一个if-then规则的集合,将决策树转换成if-then规则的过程是这样的:
- 由决策树的根节点到叶节点的每一条路径构建一条规则
- 路径上中间节点的特征对应着规则的条件,叶节点的类标签对应着规则的结论
- 决策树的路径或者其对应的if-then规则集合有一个重要的性质:互斥并且完备。也就是说,每一个实例都被有且仅有一条路径或者规则所覆盖。这里的覆盖是指实例的特征与路径上的特征一致,或实例满足规则的条件
二、决策树的构建准备工作
使用决策树做分类的每一个步骤都很重要,首先我们要收集足够多的数据,如果数据收集不到位,将会导致没有足够的特征去构建错误率低的决策树。数据特征充足,但是不知道用哪些特征好,也会导致最终无法构建出分类效果好的决策树。从算法方面来看的话,决策树的构建就是我们的核心内容
决策树的构建可以分为三个步骤:特征选择、决策树的生成和决策树的剪枝
1. 特征选择
特征选择就是决定用哪个特征来划分特征空间,其目的在于选取对训练数据具有分类能力的特征。这样可以提高决策树学习的效率。如果利用一个特征进行分类的结果与随机分类的结果没有很大的差别,则称这个特征是没有分类能力的,经验上扔掉这些特征对决策树学习的精度影响不会很大
那如何来选择最优的特征来划分呢?一般而言,随着划分过程不断进行,我们希望决策树的分支节点所包含的样本尽可能属于同一类别,也就是节点的纯度(purity)越来越高
在实际使用中,我们衡量的常常是不纯度。度量不纯度的指标有很多种,比如:熵、增益率、基尼指数
这里我们使用的是熵,也叫香农熵,这个名字来源于信息论之父——克劳德·香农
1.1 香农熵及计算函数
熵定义为信息的期望值。在信息论与概率统计中,熵是表示随机变量不确定性的度量
假定当前样本集合D中一共有n类样本,第i类样本为 ,那么的信息定义为:
其中是选择该分类的概率
通过上式,我们可以得到所有类别的信息。为了计算熵,我们需要计算所有类别所有可能值包含的信息期望值(数学期望),通过下面的公式得到:
的值越小,则D的不纯度就越低
香农熵的python代码如下:
构建数据集并计算其香农熵
No. | no surfacing | flippers | fish |
1 | 1 | 1 | yes |
2 | 1 | 1 | yes |
3 | 1 | 0 | no |
4 | 0 | 1 | no |
5 | 0 | 1 | no |
熵越高,信息的不纯度就越高,也就是混合的数据就越多
1.2 信息增益
信息增益(Information Gain)的计算公式其实就是父节点的信息熵与其下所有子节点总信息熵之差。但这里要注意的是,此时计算子节点的总信息熵不能简单求和,而要求在求和汇总之前进行修正
假设离散属性a有V个可能的取值,若使用a对样本数据集D进行划分,则会产生V个分支节点, 其中第v个分支节点包含了D中所有在属性a上取值为的样本,记为。我们可根据信息熵的计算公式计算出的信息熵,再考虑到不同的分支节点所包含的样本数不同,给分支节点赋予权重 ,这就是所谓的的修正
所以信息增益的计算公式为
所以海洋生物数据集中第0列的信息增益就是:
用同样的方法也可以把第1列的信息增益算出来,结果为0.17
2. 数据集最佳切分函数
划分数据集最大准则是选择最大信息增益,也就是信息下降最快的方向
通过上面的手动计算我们可以知道,第0列的信息增益为0.42,第1列的信息增益为0.17,0.42>0.17,所以我们应选择第0列进行数据集切分
验证数据集最佳切分函数返回结果与手动计算结果是否一致
3. 按照给定列切分数据集
通过最佳切分函数返回最佳切分列的索引,我们可以根据这个索引构建一个按照给定列切分数据集的函数
以axis=0,value=1为例验证函数
三、递归构建决策树
目前我们已经学习了从数据集构造决策树算法所需要的子功能模块,其工作原理如下:得到原始数据集,然后基于最好的属性值划分数据集,由于特征值可能多于两个,因此可能存在大于两个分支的数据集划分。第一次划分之后,数据集被向下传递到树的分支的下一个结点。在这个结点上,我们可以再次划分数据。因此我们可以采用递归的原则处理数据集
决策树生成算法递归地产生决策树,直到不能继续下去为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即出现过拟合现象。过拟合的原因在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化,也就是常说的剪枝处理
1. ID3算法
构建决策树的算法有很多,比如ID3、C4.5和CART,基于《机器学习实战》这本书,我们选择ID3算法
ID3算法的核心是在决策树各个节点上对应信息增益准则选择特征,递归地构建决策树。具体方法是:从根节点开始,对节点计算所有可能的特征的信息增益,选择信息增益最大的特征作为节点的特征,由该特征的不同取值建立子节点;再对子节点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止。最后得到一个决策树
递归结束的条件是:程序遍历完所有的特征列,或者每个分支下的所有实例都具有相同的分类。如果所有实例具有相同分类,则得到一个叶节点。任何到达叶节点的数据必然属于叶节点的分类,即叶节点里面必须是标签
2. 编写代码构建决策树
四、决策树的存储
构造决策树是很耗时的任务,即使处理很小的数据集,也要花费几秒的时间,如果数据集很大,将会耗费很多计算时间。因此为了节省时间,建好树之后立马将其保存,后续使用直接调用即可
这边使用的是numpy里面的
save()
函数,它可以直接把字典形式的数据保存为.npy文件,调用的时候直接使用load()
函数即可。这边遇到了一个报错:
ValueError: Object arrays cannot be loaded when allow_pickle=False
查询了一些相关解决办法
采用了方法四——在numpy.load函数之前先写一条代码设置值,之后再换回来
五、使用决策树执行分类
训练集使用dataSet,测试集使用dataSet前三行数据,可以看出对训练集拟合得很好
使用SKlearn中的graphviz包实现决策树的绘制
朴素贝叶斯
一、概述
贝叶斯分类算法是统计学的一种概率分类方法,朴素贝叶斯分类是贝叶斯分类中最简单的一种。其分类远离就是利用贝叶斯公式根据某特征的先验概率计算出其后验概率,然后选择具有最大后验概率的类作为该特征所属的类。之所以称为“朴素”,是因为贝叶斯分类只做最原始、最简单的假设:所有的特征之间是统计独立的
假设某样本X有个属性,那么有。满足这样的公式就说明特征统计独立
1. 条件概率公式
条件概率(Conditional probability),就是指在事件B发生的情况下,事件A发生的概率,用来表示
根据文氏图可知:在事件B发生的情况下,事件A发生的概率就是除以
同理可得:
所以