1.1 什么是机器学习
1.1.1 机器的学习能力
1997年5月11日,一台名为“深蓝”的超级电脑战胜国际象棋名家卡斯帕罗夫。20世纪末的一场人机大战终于以计算机的微弱优势取胜。
2016年3月,阿尔法围棋程序(AlphaGo)挑战世界围棋冠军李世石,以4比1的总比分取得了胜利。此事震惊世界,2016年因此被称为人工智能(Artificial Intelligence,AI)元年。
为什么会引发这么大的轰动呢?
除了围棋变化特别大的原因外,更重要的是阿尔法程序已经具备了自我学习和自我进化能力。
机器的这种学习能力,作为人工智能的核心要素,将会对人类社会的生产、生活、军事等活动产生难以估量的影响。
1.1.2 机器学习(Machine Learning,ML)的定义
机器学习:一种从数据当中发现复杂规律,并且利用规律对未来时刻、未知状况进行预测和判定的方法,是当下被认为最有可能实现人工智能的方法。
机器学习:计算机利用已有的数据(经验),得出了某种模型,并利用此模型预测未来的一种方法。
机器学习是计算机科学与统计学结合的产物,主要研究如何选择统计学习模型,从大量已有数据中学习特定经验。机器学习中的经验称为模型,机器学习的过程即根据一定的性能度量准则对模型参数进行近似求解,以使得模型在面对新数据时能够给出相应的经验指导。对于机器学习的准确定义,目前学术界尚未有统一的描述,比较常见的是Mitchell教授于1997年对机器学习的定义:“对于某类任务T和性能度量P,一个计算机程序被认为可以从经验E中学习是指:通过经验E改进后,它在任务T上的性能度量P有所提升。”
1.1.3 机器学习与人脑学习比较
人类在成长、生活过程中积累了很多的历史与经验。人类定期地对这些经验进行“归纳”,获得了生活的“规律”。当人类遇到未知的问题或者需要对未来进行“推测”的时候,人类使用这些“规律”,对未知问题与未来进行“推测”,从而指导自己的生活和工作。
机器学习中的“训练”与“预测”过程可以对应到人类的“归纳”和“推测”过程。通过这样的对应,我们可以发现,机器学习的思想并不复杂,仅仅是对人类在生活中学习成长的一个模拟。由于机器学习不是基于编程形成的结果,因此它的处理过程不是因果的逻辑,而是通过归纳思想得出的相关性结论。
这也可以联想到人类为什么要学习历史,历史实际上是人类过往经验的总结。“历史往往不一样,但历史总是惊人的相似”。通过学习历史,从历史中归纳出人生与国家的规律,指导我们的下一步工作,这是具有莫大价值的。
人脑: 总结经验-->发现规律-->预测未来
电脑: 训练数据-->建立模型-->预测未知属性
1.1.4 机器学习与人工智能、深度学习的关系
人工智能:是机器展现的人类智能,它的含义很广泛,是一个综合性系统。
机器学习:计算机利用已有的数据(经验),找出某种规律构建模型,并用它来解决实际问题。它是实现人工智能的一种方法,并非实现人工智能的唯一方法,但是近年来人工智能的研究一般使用机器学习。
深度学习:是机器学习的一个重要分支和延伸,是包含多隐层的神经网络结构。深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,从而学习到数据本身最关键的特征。简单来说,深度学习就是更深、更加复杂的神经网络结构。
机器学习与人工智能、模式识别、数据挖掘的关系:
相比机器学习,人工智能具有更加广泛的含义,它包括知识表示、智能推理等基础领域和机器人、自然语言处理、计算机视觉等应用领域,而机器学习是人工智能的重要实现技术。机器学习也是模式识别(Pattern Recognition)、数据挖掘(Data Mining)等领域的重要支撑技术。
机器学习与深度学习、神经网络的关系:
近年来,深度学习的机器学习算法备受关注,以至于出现了这样的误解:提起人工智能,人们想到的就是深度学习。然而,深度学习只不过是机器学习算法的其中一种,是实现机器学习的一种技术。深度学习在图像识别领域取得了划时代的成果,是当前热门的算法。目前在图像识别领域之外,深度学习也取得了许多成绩。 传统神经网络(Neural Networks,NN)是实现机器学习中分类、聚类、回归等模型的重要方法。改进后的多层次的神经网络可以自动提取特征,从而有效克服人工提取特征的障碍,由此逐渐发展为机器学习的一个分支,即深度学习(Deep Learning,DL)。 近年来,正是深度学习取得了重大突破,从而推动机器学习,乃至人工智能都得到了蓬勃发展。
1.2 机器学习算法分类及任务
机器学习算法以数据为对象,通过提取数据特征,发现数据中的知识并抽象出数据模型,作出对数据的预测。
机器学习包含不同的种类。根据样本集合中是否包含标签以及包含标签的多少,分类如下:
- 有监督学习
- 无监督学习
- 强化学习
1.2.1 有监督学习(Supervised Learning)
有监督学习是将问题的答案告知计算机,使计算机进行学习并给出机器学习模型的方法。这种方法要求数据中包含表示特征的数据和作为答案的目标数据。有监督学习处理的对象是所谓的有标签训练数据,它利用有标签的训练数据来学习一个模型,它的目标是用学到的模型给无标签的测试数据打上标签。
典型任务:分类、回归
分类(Classification):使用计算机学习出的模型进行预测得到的是离散值。
- 二分类:只涉及两个类别的分类任务,其中一个类为正类(Positive Class),另一个类为负类(Negative Class),如是猫、不是猫两类。
- 多分类(Multi-class Classification):涉及多个类别的分类任务。
回归(Regression):使用计算机学习出的模型进行预测得到的是连续值。
分类和回归的区别:
-
输出不同
- 分类问题输出的是物体所属的类别,回归问题输出的是物体的值。
- 分类问题输出的值是定性的,回归问题输出的值是定量的。
-
目的不同
- 分类的目的是为了寻找决策边界。
- 回归的目的是为了找到最优拟合。
-
结果不同
- 分类的结果没有逼近,对就是对,错就是错。
- 回归是对真实值的一种逼近预测。
分类(Classification)问题:
- 身高1.65m,体重100kg的男人肥胖吗?
- 根据肿瘤的体积、患者的年龄来判断良性或恶性?
回归(Regression、Prediction)问题:
- 如何预测上海浦东的房价?
- 未来的股票市场走向?
如下图所示,已有表示特征的身高和体重数据,作为答案的数据是性别(男/女)。我们向计算机提供这些数据的组合,使计算机进行学习并给出预测模型。然后,将新的身高和体重数据提供给模型,由模型预测出性别。
预测性别这样的类别的问题叫作分类问题。由于这次是将数据分类到两个类别中,所以叫二元分类;还有将数据分类到更多类别,比如10个类别的情况,这样的情况叫作多元分类。这种答案变量不是连续值,而是作为类别数据的离散值的问题就是分类问题。
另一个典型的分类问题的例子就是垃圾邮件过滤。用户判断邮件是否为垃圾邮件的过程就是打标签的过程,标签数据就是目标变量,邮件的发件人和内容则为特征值。打了标签的数据越多,机器学习的效果就越好,得到的结果的精度越高。
除了分类问题之外,有监督学习还包括回归问题。如上图“有监督分类示意图”所示,已有表示特征的性别和身高数据,以及答案数据——鞋的尺码。在分类问题中,男和女的标签分别被数值化为0和1,这两个数值之间的大小关系是没有意义的。与之相对,鞋的尺码26.5 cm和24cm之间的大小关系则是有意义的。对这样的数据进行预测的问题就是回归问题。在回归问题中,目标变量作为连续值处理的,所以预测值有可能是23.7 cm这种不存在的尺码。
1.2.2 无(非)监督学习(Unsupervised Learning)
有监督学习是将特征值和目标变量(答案)作为一套数据进行学习的方法,而无监督学习的数据中没有作为答案的目标变量,也就是说无监督学习的训练数据没有标签,它自动从训练数据中学习知识,建立模型。数据并不被特别标识,计算机自行学习分析数据内部的规律、特征等,进而得出一定的结果(如内部结构、主要成分等)。
典型任务:聚类、降维
聚类(Clustering):
- 如何将教室里的学生按爱好、身高划分为5类?
降维( Dimensionality Reduction ):
- 如何将高维空间中的数据点映射到低维度的空间中?
疑问:没有答案,该如何去学习呢?
无监督学习将表示特征的数据作为输入,通过将数据变形为其他形式或者找出数据中的部分集合,来理解输入数据的构造。此外,与有监督学习相比,无监督学习的结果难以解释,或者要求分析者基于经验加以主观的解释。有监督学习以“能否正确预测目标变量”为指标,相比之下,为了能够对结果进行解释,在进行无监督学习时,用户需要对输入数据的前提知识有一定程度的了解。
举一个无监督学习的例子。我们思考一下对某个中学的学生成绩进行分析的场景。假设各科目之间存在着这样的关联性:擅长数学的学生也擅长理科,但不擅长语文和文科。
对于这样的输入数据,在使用无监督学习的代表性算法主成分分析(Principal Component Analysis;PCA)时,引入了新的轴,以说明被称为第一主成分的数据。在第一主成分上的坐标可以解释为“小值表明该生擅长理科,大值表明该生擅长文科”,如表1-2所示,可以将数学、理科、语文、文科这4个特征值归纳在1个轴上加以展示。
这个例子使用PCA通俗易懂地解释了分析结果,但是需要根据输入数据选择合适的算法。近年来,无监督学习的研究在图像和自然语言处理方面取得了进展,是当前备受瞩目的领域。这里介绍的PCA属于降维算法。降维是以更少的特征值来理解数据的算法。无监督学习中也包括聚类算法。聚类是将数据分类为几个簇(相似数据的集合)的算法。人类很难直接理解多变量数据(由3个以上的变量构成的数据),通过聚类,数据能够以簇这种简单的形式进行展现。
1.2.3 强化学习(Reinforcement Learning)
强化学习是以在某个环境下行动的智能体获得的奖励最大化为目标而进行学习的方法。用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题,基于与环境的交互是最大特征。通过尝试来发现各个动作产生的结果,对各个动作产生的结果进行反馈(奖励或惩罚)。在这种学习模式下,输入数据直接反馈到模型,模型必须作出调整。
简单介绍:在主机游戏(环境)中,玩家(智能体)为了获得赛点(奖励)并取得最终的胜利,会无数次地重复尝试。可以把强化学习看作有监督学习的目标变量被作为奖励提供的情况。拿主机游戏示例,由于全部场景下所有操作的组合实在太多,很难通过人力进行评估,所以可以将游戏的场景和操作作为特征值,将游戏赛点作为目标变量,玩家无须依赖人力,通过无数次的游戏即可自行收集特征值和目标变量的数据组。强化学习在重复地玩游戏、查看结果中不断学习更恰当的行动。
1.2.4 半监督学习(Semi-supervised learning)
半监督学习是监督学习和无监督学习相结合的一种学习方法,介于监督学习和非监督学习之间,输入数据部分被标识,部分没有被标识,没标识数据的数量常常远远大于有标识数据数量。
在某些情况下,我们仅能够获得部分样本的标签。半监督学习就是同时从有标签数据及无标签数据中进行经验学习的机器学习。
这种学习模型可以用来进行预测,但是模型首先需要学习数据的内在结构以便合理的组织数据来进行预测。
1.3 机器学习的应用场景
机器学习在各领域的应用都取得了较大进展,比如自动驾驶领域,文章的自动分类和自动翻译,医疗领域使用机器学习对X射线影像的分析以助于疾病的早期发现,以及气象信息领域的应用等。
近年来,随着计算机越来越便宜,数量越来越多,机器学习的研究也在不断加速。互联网产业的发达和物联网(Internet of Things;IoT)等技术的应用也为机器学习带来了丰富的数据。
根据数据的特性选择合适的算法,就会有前所未有的发现。
机器学习可以解决的问题
-
给定数据的预测问题
- 数据清洗/特征选择
- 确定算法模型/参数优化
- 结果预测
-
不能解决什么
- 大数据存储/并行计算
- 做一个机器人
1.4 机器学习术语
1.4.1 数据集(Dataset)
数据是进行机器学习的基础,所有数据的集合称为数据集。
数据集分为训练数据和测试数据。测试数据即为测试集,是需要应用模型进行预测的那部分数据,是机器学习所有工作的最终服务对象。为了防止训练出来的模型只对训练数据有效,一般将训练数据又分为训练集和验证集,训练集用来训练模型,而验证集一般只用来验证模型的有效性,不参与模型训练。
1.4.2 实例及其属性(特征)
实例(Instance):指一个完整的训练或测试数据,如一张图片、一段文本句子、一条音频等,是单个的样本。
属性(特征):属性(Attribute),特征(Feature),属性即特征,特征即属性,指每个样本在某方面的表现或性质。实例一般由多个属性表示。例如一张8×8的图片,有64个属性,如果是黑白两色的,每个属性的取值为二维的,可设为0或1。再如一段长为20个汉字的句子,则有20个属性,当采用GB2312编码时,每个属性有6763个可能取值。
1.4.3 样本
1.4.4 特征、特征值、特征向量
传统机器学习算法一般不直接对实例的属性进行处理,而是对从属性中提炼出来的特征进行处理。例如,从图片里提取出的水果长度与宽度之比的特征,从日期里提取出周几的特征等等。
特征向量(Feature Vector):每个样本的特征对应的特征空间中的一个坐标向量。
表示特征的数据叫作特征值或者特征变量,作为答案的数据叫作目标变量或者标签。
1.4.5 标签(目标变量)
标签(Label):训练数据中可能会指出训练结果的信息,也称之为目标变量。对训练数据来说,标签是指导训练的结论,对测试集来说,标签是要预测的目标。
1.4.6 学习(Learning) 或者训练(Training)
学习(Learning) 或者 训练(Training):从数据中学得模型的过程,这个过程通过执行某个学习算法来完成。
1.4.7 其它
测试(Test)、预测(Predict):学习到模型后,使用其进行预测的过程。
泛化能力(Generalization):学习到的模型适用于新样本的能力。机器学习的目标是使得学习到的模型能很好得适用于新样本,而不是仅仅在训练样本上适用。
1.5 机器学习的开发流程
本部分阐释机器学习的大致步骤,理解作为机器学习算法基础的处理流程,并加深理解机器学习的概念。
1.5.1 数据的重要性
在使用机器学习时,必须要有汇总并整理到一定程度的数据。以数据为基础,按规定的法则进行学习,最终才能进行预测。
没有数据,就不能进行机器学习。换言之,收集数据是首先要做的事情。
通过这张图可以看出,各种不同算法在输入的数据量达到一定级数后,都有相近的高准确度。于是诞生了机器学习界的名言:
- 成功的机器学习应用不是拥有最好的算法,而是拥有最多的数据。
本部分将说明机器学习训练过程的一系列流程。为了便于理解,基于示例数据进行讲解,使用的是主流机器学习库scikit-learn包的内置数据,这个数据便于入手,可自由使用。
数据收集、数据预处理的重要性: 在实际用机器学习解决问题之前,要先收集数据,有时还需要做问卷调查,甚至购买数据。然后,需要为收集到的数据人工标注答案标签,或者将其加工为机器学习算法易于处理的形式,删除无用的数据,加入从别的数据源获得的数据等。另外,基于平均值和数据分布等统计观点查看数据,或者使用各种图表对数据进行可视化,把握数据的整体情况也很重要。此外,有时还需要对数据进行正则化处理。 这些操作被称为数据预处理。有这样一种说法:机器学习工作80%以上的时间花在了数据预处理上。
scikit-learn包: scikit-learn是一个机器学习库,包含了各种用于机器学习的工具。 这个库以BSD许可证开源,谁都可以免费、自由地使用。scikit-learn实现了许多有监督学习和无监督学习的算法,是一套包含了用于评估的工具、方便的函数、示例数据集等的工具套件。在机器学习领域,scikit-learn已成为事实上的标准库,它具有两大优点:一是操作方法统一;二是易于在Python中使用。
1.5.2 数据和学习的种类
前面说过,没有数据,就不能进行机器学习。具体来说,机器学习需要的是什么样的数据呢?
机器学习需要的是二维的表格形式的数据(根据解决问题的目的不同,存在例外的情况)。表格的列中含有表示数据本身特征的多种信息,行则是由多个信息构成的数据集。接下来,我们看一个更具体的例子:学校的某个社团有4名学生,下面的表1-4是每个学生的姓名、身高、体重、出生日期和性别信息的数据。
思考一下用机器学习进行性别预测的问题。
因为要预测的是性别,所以性别列的男或女的数据就是预测对象,即目标变量。根据分类的场景的不同,有时也称为标签或类别标签数据,对应的英文单词为target。
除了性别之外的4个列(姓名、身高、体重、出生日期)是用于预测的原始数据。用于预测的原始数据称为特征值,根据场景的不同,有时也称为特征变量或输入变量,对应的英文单词为feature。
1.5.3 了解示例数据
我们看一下scikit-learn包中内置的示例数据。这里显示了部分鸢尾花(iris)数据。
Python生态圈中用于处理数据的工具有pandas,它常与scikit-learn搭配使用。
关于Python生态中第三方库的相关内容,将在随后的课程知识中介绍。
下面输出数据的基本信息。
import pandas as pd
from sklearn.datasets import load_iris
data = load_iris()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = pd.DataFrame(data.target, columns=["Species"])
df = pd.concat([X, y], axis=1)
df.sample(10)
输出结果如下所示:
查看输出结果,列方向上有sepal length(cm)、sepal width(cm)、petal length(cm)、petal width(cm)、Species这5种信息,意思分别是鸢尾花的萼片长度、萼片宽度、花瓣长度、花瓣宽度、品种。前面4列是表示特征的特征值,最后1列是目标变量。在这个数据集中,目标变量的值为0、1、2这3个值之一。
1.5.4 有监督学习(分类)的例子
本节介绍基于有监督学习解决分类问题的实现方法。
1.5.4.1 例题
例题采用的是美国威斯康星州乳腺癌数据集。这个数据集中包含30个特征值,目标变量的值为“良性”或者“恶性”。数据数量有569条,其中“恶性”(M)数据212条,“良性”(B)数据357条。换言之,这是根据30个特征值判断结果是恶性还是良性的二元分类问题。 下面看一下数据长什么样子。
这份数据可以通过scikit-learn包读取:
import pandas as pd
from sklearn.datasets import load_breast_cancer
data = load_breast_cancer()
# data
这段代码用于导入scikit-learn内置的读取数据集的函数,并将所读取的数据保存在变量data中。
接下来,从数据集中取出特征值赋给X,取出目标变量赋给y。
X = data.data
y = data.target
# X,y
X由多个特征值向量构成,我们将其作为矩阵处理,因此遵照惯例使用大写字母作为变量名。
y是目标变量的向量,其元素值的含义为:0表示恶性(M),1表示良性(B)。
X是大小为569×30的数据,可将其看作569行30列的矩阵。虽然y是向量,但把它当作569行1列的矩阵后,X和y的行就能一一对应了。比如特征值X的第10行与目标变量y的第10个元素相对应。
要想详细了解这个数据集,需要具备相应的医学知识,但是这里我们仅将其作为数值,对其进行有监督学习的二元分类。特征值共有30个,分为平均值、误差值、最差值3类,每类包括10项,分别为半径、纹理、面积等。我们着眼于平均值、误差值、最差值这3类数据中的平均值。
X = X[:,0:10]
print(X.shape)
X
输出结果如下图所示:
这行操作使得只有平均值被重新赋值给了变量X,用作特征值的数据现在缩减到了10项。
1.5.4.2 实现方法
下面基于美国威斯康星州乳腺癌数据集创建并训练进行二元分类的模型。这里使用的分类算法是逻辑回归。虽然算法名中有“回归”二字,却能用于分类。
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
注意 在使用scikit-learn进行模型的初始化和训练时,有可能会看到输出的警告信息。警告信息是Future Warning,即对将来有可能会变更的功能的通知,在训练不收敛时有可能会出现。如果在实践中发现有警告输出,请根据警告内容采取相应的措施。
为了使用逻辑回归模型,上面的代码导入了scikit-learn的LogisticRegression类,然后创建了LogisticRegression类的实例,并将已初始化的模型赋给了model。
model.fit(X, y)
上面的代码使用model(LogisticRegression的实例)的fit方法训练模型,方法的参数是特征值X和目标变量y。
在调用fit方法后,model成为学习后的模型。
y_pred = model.predict(X)
上面的代码使用学习后的模型model的predict方法对学习时用到的特征值X进行预测,并将预测结果赋给变量y_pred。
1.5.4.3 评估方法
下面介绍分类的评估方法。
首先看一下正确率。这里使用scikit-learn的accuracy_score函数查看正确率。
from sklearn.metrics import accuracy_score
accuracy_score(y, y_pred)
输出结果为:0.9138840070298769
代码的输出结果是学习后的模型预测的结果y_pred相对于作为正确答案的目标变量y的正确率。
这个验证通常应使用另外准备的一些不用于学习的数据来进行,否则会产生过拟合(overfitting)问题。过拟合是有监督学习的一个严重问题。有监督学习追求的是正确预测未知的数据,但是现在输出的正确率是使用学习时用过的数据计算出来的。这就意味着我们不知道模型对于未用于学习的未知数据的预测性能的好坏,不知道得到的学习后的模型是不是真正优秀。
关于评估方法,还有其他问题需要考虑。比如,只看正确率就能判断结果是否正确吗?根据数据的特性不同,有些情况下不能保证分类是正确的。这次用的数据中有“恶性”数据212条,“良性”数据357条,可以说是在一定程度上均衡的数据。
对于“良性”“恶性”极不均衡的数据,光看正确率无法判断结果是否正确。我们再以另外一组数据为例,看一下30岁~39岁人群的癌症检测数据。通常来说,诊断为恶性的数据只占整体的百分之几,大多数人没有肿瘤或者肿瘤是良性的。对于这样的数据,如果模型将所有的样本都判断为良性的,那么尽管正确率很高,但光看正确率也不能正确评估这个模型。
1.5.5 无监督学习(聚类)的例子
下面看一下无监督学习的聚类问题的实现方法的各个步骤。与前面一样,这里我们也使用scikit-leam包。
1.5.5.1 例题
例题采用的是scikit-learn包内置的与葡萄酒种类有关的数据集。这个数据集有13个特征值,目标变量是葡萄酒种类。由于这次介绍的是无监督学习的聚类算法,所以不使用目标变量。简单起见,本次只使用13个特征值中的alcohol(酒精度)和color_intensity(色泽)两个特征值。我们对这个数据集应用k-means聚类算法,将其分割为3个簇。
下面使用scikit-leam包加载这个数据集。
from sklearn.datasets import load_wine
data = load_wine()
Y = pd.DataFrame(data.data, columns=data.feature_names)
Y.sample(10)
上面的代码用于导入scikit-learn内置的读取葡萄酒数据集的函数,并将读取的数据保存在变量data中。
接着,仅从数据集中选择alcohol列和color_intensity列作为特征值赋给X。这么做是为了在显示结果时,只用二维图形对结果进行可视化。
X = data.data[:, [0, 9]]
Y=pd.DataFrame(X,columns=['alcohol','color_intensity'])
Y
输出结果如下所示:
特征值X是178行2列的数据。
1.5.5.2 实现方法
下面使用k-means算法实现聚类。
from sklearn.cluster import KMeans
n_clusters = 2
model = KMeans(n_clusters=n_clusters)
上面的代码导入并使用了实现k-means算法的KMeans类。
初始化KMeans类,把它作为学习前的模型赋给变量model。通过n_clusters参数,指示模型将数据分为3个簇。
pred = model.fit_predict(X)
上面的代码用于向学习前的模型model的fit_predict方法传入特征值数据。预测结果赋给变量pred。
下面看一下赋给pred的数据是如何聚类的。
1.5.5.3 查看结果
这里将聚类的结果可视化。
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.scatter(X[pred==0, 0], X[pred==0, 1], color='red', marker='s', label='Label1')
ax.scatter(X[pred==1, 0], X[pred==1, 1], color='blue', marker='s', label='Label2')
# ax.scatter(X[pred==2, 0], X[pred==2, 1], color='green', marker='s', label='Label3')
ax.scatter(model.cluster_centers_[:, 0], model.cluster_centers_[:, 1], s=200, color='yellow', marker="*", label="center")
ax.legend()
plt.show()
结果如图所示:
由于本次使用的特征值只有两种,所以绘制二维图形即可实现结果的可视化。图形中每个数据点对应的是一种葡萄酒。从数据点的颜色可以看出每种酒属于哪个簇。3个黄色的星星是各个簇的重心,是这3个簇的代表点。
原本以酒精度、色泽变量表示的葡萄酒,现在以“属于哪个簇”这种简洁直观的形式展示了出来。此外,要想了解各个簇具有什么特征,只需查看作为代表点的重心的值即可。比如,第3个簇的特点是“酒精度低、色泽淡”。
通过k-means算法实现的聚类是以“将酒精度百分之多少以上的数据分到第1个簇”之类的规则进行聚类的,这些规则不是由人预先设置的,而是由算法自动进行聚类得出的。这一点很重要,说明这个算法具有通用性,可应用于葡萄酒之外的数据。
1.5.6 机器学习的开发流程
问题构建-->获取数据-->探索并准备数据(数据清洗)-->特征工程-->定义模型-->训练模型-->评估模型-->部署模型
1. 抽象问题
机器学习的训练过程通常都是一件非常耗时的事情,胡乱尝试时间成本是非常高的。抽象成数学问题,指的我们明确我们可以获得什么样的数据,目标是一个分类还是回归或者是聚类的问题,如果都不是的话,如果划归为其中的某类问题。
2. 获取数据
获取数据决定了机器学习结果的上限,而算法只是尽可能逼近这个上限。数据要有代表性,否则必然会过拟合。而且对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有数个数量级的差距。
3. 特征工程
特征预处理与特征选择良好的数据要能够提取出良好的特征才能真正发挥效力。特征预处理、数据清洗是很关键的步骤,往往能够使得算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤。筛选出显著特征、摒弃非显著特征,需要机器学习工程师反复理解业务,这对很多结果有决定性的影响。特征选择好了,非常简单的算法也能得出良好、稳定的结果。这需要运用特征有效性分析的相关技术,如相关系数、卡方检验、平均互信息、条件熵、后验概率、逻辑回归权重等方法。
4. 训练模型与调优
目前很多算法都已封装成黑盒供我们调用,但是真正考验水平的是调整这些算法的(超)参数,使得结果变得更加优良。需要我们对算法的原理有深入的理解,理解越深入,就越能发现问题的症结,提出良好的调优方案。
另一视角:
1.6 机器学习的背景知识
1.6.1 希腊字母
1.6.2 数学基础
-
高等数学
- 导数、微分、泰勒公式……
-
线性代数
- 向量、矩阵、行列式、秩、线性方程组、特征值和特征向量……
-
概率论与数理统计
- 随机事件和概率、概率的基本性质和公式、常见分布、期望、协方差……
1.6.3 Python基础
- Anaconda的安装、Jupyter notebook的使用;
- 数据类型、程序流程控制、函数等…
- 数据可视化matplotlib库
- 数组矩阵科学运算numpy库
- 结构化数据pandas库
- 数学科学工程计算scipy库
- 机器学习scikit-learn库
1.7 课程学习之就业方向
从事机器学习领域的工作,大致可以分为三类:算法、工程和数据。做数据主要是指人工标注数据。
从事机器学习算法的学术研究,不仅仅需要具备扎实的理论基础,还需要具备较强的算法实现能力。做算法的应用研究,同样需要较强的算法理解和实践能力。做工程,也需要要对算法有深入的理解,并在算法实践方面特别熟练。
如果想在机器学习领域进行算法研究和工程应用,就必须掌握经典算法的原理,打下扎实的理论基础,同时还要具备较强的算法实践能力。
1.8 开发环境及工具包
课程源码的测试环境:
- OS:Windows10
- Python:3.8.8
- Jupyter Notebook:6.4.8
- Numpy 1.22.2
- Pandas 1.4.1
- Matplotlib 3.5.1
- scikit-learn:1.0.2
工具包:
- Numpy扩展包提供了数组支持;
- Matplotlib包主要用于绘图和绘表,是强大的数据可视化工具;
- Pandas是Python的数据分析和探索工具;
- Scikit-Learn是基于 Python 语言的机器学习工具。它建立在 NumPy, SciPy, Pandas 和 Matplotlib 之上,里面的 API 的设计非常好,所有对象的接口简单,很适合新手上路;
- Jupyter Notebook(此前被称为 IPython notebook),交互式笔记本,支持运行40多种编程语言。