前言

我尝试从线性代数的部分写起,但是我发现这样太拖拉了,对于我的学习来说很不利,所以我打算就不写线性代数和高等数学的内容了,在学习机器学习之前请确保你已经对如下内容有一定的基础:

  • python语言:如果不会请参考我的一些 python 内容或者自行网络上学习
  • 线性代数:考研数学即可
  • 高等数学:考研数学即可

本系列内容参考自:Peter Harrington 的 《Machine Learning in Action》和《智能之门》以及哔哩哔哩,网络上相内容上结合本人实践编写。

什么是机器学习

除了一些无关紧要的情况,人们很难直接从原始数据本身获取所需的信息。例如:对于垃圾邮件的检测,侦测一个单词是否存在没有太大的作用,然后当多个特定单词同时出现,再根据邮件的时间长度等其他因素,就可以快速的判断该邮件是否为垃圾邮件。简单的来说,机器学习就是把无序的数据转换为有用的信息

机器学习用到了统计学知识,在大多数人看来,统计学不过是企业用以炫耀产品功能的一种统计而已。那么我们为什么还需要利用统计学呢?就工程实践来说,它是利用科学知识来解决具体的问题。在某些情况下,我们会面对很多需要确凿解法,或者说一成不变的解决方案,例如自动售卖机,我们投币,然后购买商品即可。

但是现实生活中,往往存在大量的问题并没有确凿的解决方案,或者说没有足够的计算资源来确立方案的模型。为了解决这些问题,我们就需要利用到统计学的相关知识。

关键术语

在研究机器学习算法之前,必须先了解一些基本的术语。通过构建下面的鸟类分类系统,我们将接触机器学习涉及的常用术语。这类系统非常有趣,通常与机器学习中的**专家系统1**有关。开发出能够识别鸟类的计算机软件,鸟类学者就可以退休了(笑🤣)。因为鸟类学者是研究鸟类的专家,因此我们说创建的是一个专家系统。

如下表是我们用于区分不同鸟类需要使用的四个不同的属性值,我们选择使用体重,翼展,有无脚蹼以及背后颜色作为评测基准。现实中,你可能会想测量更多的值。通常做法是测量所有可测属性,然后再挑选重要的部分。下面测量的四种值称之为特征,也可以称作:属性

序号 体重(克) 翼展(厘米) 脚蹼 后背颜色 种属
1 1000.1 125.0 棕色 红尾鹭
2 3000.7 200.0 灰色 鹭鹰
3 3300.0 220.3 灰色 鹭鹰
4 4100.0 136.0 黑色 普通潜鸟
5 3.0 11.0 绿色 瑰丽蜂鸟
6 570.0 75.0 黑色 象牙喙啄木鸟

上表中前两种特征是数值型,可以使用十进制数字;第三种特征是二值型,只可以取 0 或者 1;第四种特征是基于自定义调色板的枚举类型,这里仅选择一些常用的颜色。

机器学习的主要任务就是:分类。我们将会介绍如何使用上表进行分类。如果我们希望在众多的鸟类中识别出象牙喙啄木鸟,最简单的做法就是雇佣一个鸟类学者,让他们在鸟类进食的地方蹲守查看识别。但是这种方法成本过于昂贵,而且专家一次只能在一个地方蹲守。

我们可以自动化的处理上述过程,在鸟类进食的地点放置多台摄像机,然后通过各种传感器获得鸟类的特征,然后接下来的任务就是根据传感器获取的数据进行分类,有很多机器学习的算法善于分类。具体到本例,就是善于区分是否为象牙喙啄木鸟。

最终我们决定使用某个机器学习算法来分类,首先需要做的是算法训练,即学习如何分类,通常我们为算法输入大量已分类数据作为算法的训练集,每个训练样本有四种特征,一个目标变量,如下图所示。

image-20230706215727892

目标变量就是机器学习算法的预测结果,在分类算法中目标变量的类型通常是标称型2的,而在回归算法中通常是连续型3。训练样本集必须确定知道目标变量的值,以便机器学习算法可以发现特征和目标变量之间的关系。正如前面说的,目标变量是物种,也可以简化为标称型的数值。我们通常将分类问题中的目标变量称为类别,并假定分类问题只存在有限个数的类别。

为了测试机器学习算法的效果,通常使用两套独立的样本集:训练数据和测试数据。当机器学习程序开始运行时,使用训练样本集作为算法的输入,训练完成之后输入测试样本。输入测试样本时并不提供测试样本的目标变量,由程序决定样本属于哪个类别。比较测试样本预测的目标变量值和实际样本类别之间的差别,就可以得到算法的实际精确度。

假定这个鸟类分类程序,经过测试满足精度要求,是否我们就可以看到机器已经学会如何区分不同的鸟类了呢?这部分工作称之为:知识表示,某些算法可以产生很容易理解的知识表示,而某些算法的知识表示也许只能被计算机所理解。在某些场合下,人们可能并不小建立一个专家系统,而仅仅对机器学习算法获取的信息感兴趣。此时,采用何种方式表示知识就显得非常重要了。

机器学习的主要任务

上面的例子介绍了机器学习如何解决分类问题的,它的主要任务是将实例数据划分到合适的分类中。机器学习的另一项任务是:回归,它主要用于预测数值型数据。大多数人可能都见过回归的例子——数据拟合曲线:通过给定数据点,拟合最优的曲线。分类和回归属于监督学习,之所以称之为监督学习,是因为这类算法必须知道预测什么,即目标变量的分类信息。

与监督学习对应的是无监督学习,此时数据没有类别信息,也不会给定目标值在无监督学习中,将数据集合分成由类似的对象组成的多个类的过程被称为聚类;将寻找描述数据统计值的过程称为密度估计。此外,无监督学习可以减少数据特征的维度,以便我们可以使用二维或者三维图形更加直观的展示数据信息。如下表列出了机器学习的主要任务及其相关算法:

监督学习 无监督学习
K-近邻算法 K-均值
朴素贝叶斯算法 DBSCAN
支持向量机 最大期望算法
决策树 Parzen 窗设计
线性回归
局部加权线性回归
Ridge 回归
Lasso 最小回归系数估计

你可能注意到上表中很多算法可以解决同样的问题,有心人会关心:为什么解决同一个问题存在四种方法?精通其中一种算法,是否可以处理所有类似的问题?下面将会解答一些疑问。

如何选择合适的算法

上表中所列的算法中选择实际可用的算法,必须考虑下面两个问题:

  1. 使用机器字习算法的目的,想要算法完成何种任务,比如是预测明天下雨的概率还是对投票者按照兴趣分组;
  2. 需要分析或收集的数据是什么。

首先考虑使用机器学习算法的目的。如果想要预测目标变量的值,则可以选择监督学习算法,否则可以选择无监督学习算法。确定选择监督学习算法之后,需要进一步确定目标变量类型,如果目标变量是离散型,如是/否、1/2/3、A/B/C或者红/黄/黑等,则可以选择分类算法;如果目标变量是连续型的数值,如0.0~100.00、—999~999或者+00~—00等,则需要选择回归算法。

如果不想预测目标变量的值,则可以选择无监督学习算法。进一步分析是否需要将数据划分为离散的组。如果这是唯一的需求,则使用聚类算法;如果还需要估计数据与每个分组的相似程度,则需要使用密度估计算法。

在大多数情况下,上面给出的选择方法都能帮助读者选择恰当的机器学习算法,但这也并非一成不变。

其次需要考虑的是数据问题。我们应该充分了解数据,对实际数据了解得越充分,越容易创建符合实际需求的应用程序。主要应该了解数据的以下特性:特征值是离散型变量还是连续型变量,特征值是否存在缺省值,何种原因造成的缺省,是否存在异常值等等。充分了解上面提到的数据特征可以缩短选择机器学习算法的时间。

我们只能在一定程度上缩小算法的选择范围,一般并不存在最好的算法或者可以给出最好结果的算法,同时还要尝试不同算的执行效果。

开发机器学习应用程序的步骤

  • 收集数据:用多种方法获取样本数据
  • 准备输入数据:获取数据后确保样本的格式符合要求
  • 分析输入数据:此步骤是人工分析数据,检测数据中的值是否正常,有没有垃圾数据,没没有空值等
  • 训练算法
  • 测试算法
  • 使用算法

Python相关

关于 Python 相关的基础内容和说明可以参考【1.0】Python入门,此处我不在赘述,还需要说明的一点就是本系列内容将会使用到NumPy函数库,它包含大量的线代数学相关函数以供使用,具体安装也不再赘述,可以参考【6.0】虚拟环境和包

End

现在数据越来越重要了,从程序的角度,由原来的事件驱动,到现在的数据驱动,数据是核心,而从数据中分析出相关结果是算法。



  1. 1.专家系统是一种具有专门知识和经验的计算机智能程序系统,它采用知识表示和知识推理技术来模拟通常由领域专家才能解决的复杂问题。专家系统由知识库和推理机组成,知识库存储着逻辑推理的规则,推理机则从外部输入的问题中提取相关知识并进行推理,最终给出答案或解决方案。
  2. 2.标称型变量是一种表示不同类别或类型的变量,其中每个类别都是独立且没有内在顺序或数量关系的。标称型变量的取值只能用于区分不同的类别,而不能进行比较或排序。
  3. 3.与标称型变量不同,连续型变量是基于数值的,具有无限个可能的取值。这种变量通常表示一种度量、数量或连续范围内的观测或测量结果。连续型变量的取值可以是实数,可以包括小数和分数,并且在可能的取值范围内可以存在无限个可能值。