机器学习(Machine Learning,简称 ML)是人工智能领域的一个分支,也是人工智能的核心,其涉及知识非常广泛,比如概率论、统计学、近似理论、高等数学等多门学科。
机器学习的目的是设计、分析一些让计算机可以自动“学习”的算法,最终让计算机拥有像人类一样的智慧,甚至于超越人类。这一结果的实现,要得益于机器学习算法(Machine Learning Algorithms),它提供了一整套解决问题的方案和思路,即先做什么、再做什么、最后做什么。
如果把机器学习比作一列火车的话,那么机器算法就是火车头,引领你成功抵达目的地。
Python机器学习
就当下而言,Python 无疑是机器学习领域最火的编程语言,这得益于 Python 对科学计算的强大支持。因此,本套教程中关于机器学习算法的代码均采用 Python 机器学习库 sklearn 编写。
机器学习的最主要的一项工作就是“训练模型”,训练模型的过程就是机器学习算法实现的过程,这里的算法和我们经常提及的算法有些区别,比如插入排序、归并排序等,它们的结果都是“计算出来的”,只要确定输入,就可以给定一个值,而机器学习的算法是“猜”出来的,既然是猜,那么就会有对有错,机器学习会根据猜的“结果”,不断的优化模型,从而得出正确率最高的“结果”。
机器学习的学习形式可以分为两大类:
- 有监督学习
- 无监督学习
每一类学习形式都对应着相应的算法,比如线性回归算法、KNN 分类算法、朴素贝叶斯分类算法、支持向量机算法等等,并且这些算法都有与其相适用的场景,本套教程将对上述算法的原理和应用做详细的介绍。
教程特点
机器学习算法,毫无疑问是比较难学的,它不仅拥有望而生畏的数学公式,还有晦涩难懂的逻辑思路。本教程尽量以通俗易懂的方式讲解所有算法,由于教程中会涉及较多的数学知识,我们在保证知识严谨性的基础上,尽量绕开繁琐、难懂的数学定义,让您更容易理解,从而尽快实现机器学习算法入门。
本套机器学习算法教程推崇“学以致用”,使用机器学习算法解决实际问题才是学习者的最终目的,所以教程中还会涉及如何将机器学习算法应有到实际场景中。除此之外,通过对本教程的学习,您还可以熟练掌握 Python 机器学习算法库 sklearn 的使用。
读者和阅读条件
本套教程的目标读者是想要学习 Python 机器学习算法的学生、程序员、研究人员或者爱好者,以及想要知道机器学习算法是什么和怎么用的读者。由于教程中代码是基于 Python 编写的,如果您对 Python 语言有较好的掌握,那么学习本教程将事半功倍,关于 Python,您可以跳转到《Python教程》进行系统学习。
一、什么是人工智能
很早就想写一门关于 Python“机器学习”的教程,不过碍于自身知识的局限性,不知如何下手。如果写的教程通篇只是探讨代码、数学知识、算法原理,这样的教程读起来必然索然无味。经过冥思苦想,终于突发灵感,可不可以写一部关于“机器学习算法”的入门教程呢?让初学者更容易理解常用的机器学习算法,从而帮助那些想要了解机器学习的人,打开通往人工智能世界的大门。
1、写在前面的话
机器学习是一门涉及了大量逻辑与算法的技术,令很多人望而却步,既想掌握,又害怕自己数学知识“拖后腿”,最终导致前功尽弃。
本教程本着“讲一点,透一点”尽量绕开繁琐的数学公式,以简单、通俗易懂的形式讲解“机器学习算法”。对于必须讲解的数学公式,也会竭尽所能“讲透彻,讲细致”,其次也会结合算法的原理与应用场景讲解具体实例,最终打通你的“任督二脉”,助你走进人工智能的世界。
在正式讲解机器学习算法之前,我们需要对人工智能做简单的认了解与认识。
2、人工智能应用
我们正处在一个日新月异、飞速变革的时代,层出不穷的新技术,无时无刻不刷新着我们的世界观,这其中信息技术发挥了巨大的作用,比如计算机、互联网、智能家居等技术的普及极大地方便了人们的生活,这在几十年前根本是无法想象的。
近些年“人工智能”热潮的兴起,这给我们的生活带来了巨大的改变。无人驾驶、机器翻译、语音识别、图像识别,这些都是“人工智能”的产物。比如 AlphaGo Zero 一台没有任何围棋知识的智能机器,经过几天的自我博弈成为了世界第一的围棋大师;“风格多变 app”能自动将用户的上传的照片转变为具有艺术风格的照片;“机器翻译”可以在很短的时间内将一种语言翻译成另外一种语言,以及 AI 智能医生能够将病情诊断变得更加精准。
图1:世界第一围棋大师
在过去的几年内,“人工智能”技术不仅在学术上取得了巨大的突破,也开始走向寻常百姓家,比如小度、天猫精灵等语音控制机器。
3、人工智能发展简史
“人工智能”(Artificial Intelligence),英文缩写为 AI 从字面意思来看,它指的是让机器获得像人一样的智慧。电影《黑客帝国》中的大 BOSS 就是一个名叫“矩阵”的智能机器。但“人工智能”真的会像科幻电影一样,在不久的将来控制世界与人类吗?其实这种担心就目前而言大可不必,这种可能只能存在于影片艺术表现形式中。不过你要问“人工智能”会取代人类吗?这一点倒值的你我深思。
(1) 第一次兴起
“人工智能”并非一个新兴概念,早在 1950 年 艾伦·图灵 就提出了图灵测试机的构想。随后,在 Dartmouth (达特茅斯)学会上,“人工智能”的概念被首次提出。在这之后人工智能经历了一段崎岖的发展历程。
从 20 世纪 50 年代中期至 70 年代中期,众多学者、科学家投身于人工智能领域的研究。但是由于硬件设施、计算机技术发展还不成熟,远不能满足人工智能对计算机算力、数据获取与存储的要求,从而导致人工智能迎来了第一个低谷期。在这一时期许多具有指导意义的著作相继发表,这为后续的再度发展打下了理论基础。
寒冬虽然来临,不过有着坚韧不拔精神的学者们仍未放弃,直至于 20 世纪 80 年代,卡内基梅隆大学终于设计出了第一套专家系统——XCON,该专家系统具有一套强大的知识库和推算能力,可以模拟人类专家来解决特定领域问题。随后日本、美国相继成立专家团队希望用 10 年的时间研究出智能计算机,由此带来了“人工智能”的第二次发展热潮。
(2) 第二次发展
在第二个发展热潮中,有一个最引人注目的成果,那就是“反向传播算法”得到了成功应用,它为神经网络的发展奠定了基础。1986 年第一届深度学习神经信息处理系统研讨会(简称 NIPS)在美国举办,该会议吸引了很多不同领域的研究人员。但是由于技术应用实现困难,加之计算机算力、数据等不足,从而导致了“人工智能”的第二个低谷期。
(3) 第三次崛起
时间终于来到了 21 世纪,由于互联网和云计算的兴起,计算机硬件、性能也得到了大幅度提升,因此“人工智能”在经历了数十年的低谷期后终于迎来了第三次发展热潮。
2005 年美国国防部高级研究计划局(简称 DARPA)举办的自动驾驶挑战赛中,一辆由斯坦福大学研发的无人驾驶汽车 “Stanley” 赢得胜利,这是“无人驾驶技术”第一次出现在世人面前。截止目前为止,许多高端科技已经相继问世,比如谷歌机器翻译、AI 诊断医生、语音识别、图像识别、以及人工智能协同“AlphaGO”等等。
互联网和云计算之所以让“人工智能”再次复兴,其原因主要有两点:一是互联网能够提供海量的数据;二是云计算提供了超强的计算能力。科研工作者们坚信,在经历这些坎坷后人工智能定会在当下以及未来迎来更加蓬勃的发展。
4、机器学习&深度学习
人工智能(Artificial Intelligence)是计算机科学技术的一个分支,指的是通过机器和计算机来模拟人类智力活动的过程。人工智能自 1950 年诞生以来,理论和技术日益成熟,应用领域也不断扩大,涉足了领域包括机器人、语言识别、图像识别、自然语言处理等。人工智能并不是人的智能,而是让机器像人一样思考,甚至于超过人类。
如今人工智能已经走进了千家万户,对于普通大众来说,它已经是一个耳熟能详的名字。但还有两个词语您可能没有听说过,它就是机器学习和深度学习。
对于从事计算机领域的工作者或者技术爱好者来说,机器学习与深度学习并不陌生,然而对于初学者而言就可能傻傻分不清楚,那么它们之前到底存在什么关系呢?其实它们之间是包含与被包含关系,下面展示了它们之间的关系图,如下所示:
图2:三者关系图
从图中可以看出,机器学习是人工智能的一部分,而深度学习又是机器学习的一部分。人工智能的范围最为广泛,机器学习是人工智能的核心分支,也是当前发展最迅猛的一部分,而关于深度学习,它之前也属于“机器学习”的一个分支,其主要研究对象是神经网络算法,因想要区别于“机器学习”,它重新起了一个高大上的名字。下面以最具有代表性的机器学习来做进一步介绍。
单从定义上来说,机器学习是一种功能、方法,或者更具体的说是一种算法,它能够赋予机器进行学习的能力,从而使机器完成一些通过编程无法直接实现的功能。但从具体的实践意义来说,其实机器学习是利用大量数据训练出一个最优模型,然后再利用此模型预测出其他数据的一种方法。比如要识别猫、狗照片就要拿它们各自的照片提炼出相应的特征(比如耳朵、脸型、鼻子等),从而训练出一个具有预测能力的模型。
(1)学习形式分类
机器学习是人工智能的主要表现形式,其学习形式主要分为:有监督学习、无监督学习、半监督学习等,如果你之前没有接触过机器学习,那么对于“监督”一词会不明就里,其实你可以把这个词理解为习题的“参考答案”,专业术语叫做“标记”。比如有监督学习就是有参考答案的学习,而无监就是无参考答案。
1) 有监督学习
有监督学习(supervised learning),需要你事先需要准备好要输入数据(训练样本)与真实的输出结果(参考答案),然后通过计算机的学习得到一个预测模型,再用已知的模型去预测未知的样本,这种方法被称为有监督学习。这也是是最常见的机器学习方法。简单来说,就像你已经知道了试卷的标准答案,然后再去考试,相比没有答案再去考试准确率会更高,也更容易。
2) 无监督学习
理解了有监督学习,那么无监督学习理解起来也变的容易。所谓无监督学习(unsupervised learning)就是在没有“参考答案”的前提下,计算机仅根据样本的特征或相关性,就能实现从样本数据中训练出相应的预测模型。
除了上述两种学习形式外,还有半监督学习和强化学习,它不在本教程的讨论范畴之内,有兴趣的可以自己研究一下。
(2)预测结果分类
根据预测结果的类型,我们可以对上述学习形式做具体的问题划分,这样就可以具体到实际的应用场景中,比如有监督学习可以划分为:回归问题和分类问题。如果预测结果是离散的,通常为分类问题,而为连续的,则是回归问题。
1) 回归&分类
连续和离散是统计学中的一种概念,全称为“连续变量”和“离散变量”。比如身高,从 1.2m 到 1.78m 这个长高的过程就是连续的,身高只随着年龄的变化一点点的长高。那么什么是“离散变量”呢?比如超市每天的销售额,这类数据就是离散的,因为数据不是固定,可能多也可能少。关于什么是“回归”和“分类”在后续内容中会逐步讲解。
2) 聚类
无监督学习是一种没有“参考答案”的学习形式,它通过在样本之间的比较、计算来实现最终预测输出,比如聚类问题,那什么是“聚类”?其实可以用一个成语表述“物以类聚,人以群分”,将相似的样本聚合在一起后,然后进行分析。关于聚类也会在后续内容中逐步讲解。
在学习机器学习技术的过程中,我们会遇到很多专业术语或者生僻词汇,这些名词大多数来自于数学或者统计学领域,比如模型、数据集、样本、熵,以及假设函数、损失函数等,这些属词汇于基本的常识,但是如果你第一次接触的话,也会感觉到些许惊慌。在下一节我们将介绍机器学习的常用术语。
二、机器学习常用术语
机器学习是一门专业性很强的技术,它大量地应用了数学、统计学上的知识,因此总会有一些蹩脚的词汇,这些词汇就像“拦路虎”一样阻碍着我们前进,甚至把我们吓跑。因此认识,并理解这些词汇是首当其冲的任务。本节将介绍机器学习中常用的基本概念,为后续的知识学习打下坚实的基础。
1、机器学习术语
(1)模型
模型这一词语将会贯穿整个教程的始末,它是机器学习中的核心概念。你可以把它看做一个“魔法盒”,你向它许愿(输入数据),它就会帮你实现愿望(输出预测结果)。整个机器学习的过程都将围绕模型展开,训练出一个最优质的“魔法盒”,它可以尽量精准的实现你许的“愿望”,这就是机器学习的目标。
(2) 数据集
数据集,从字面意思很容易理解,它表示一个承载数据的集合,如果说“模型”是“魔法盒”的话,那么数据集就是负责给它充能的“能量电池”,简单地说,如果缺少了数据集,那么模型就没有存在的意义了。数据集可划分为“训练集”和“测试集”,它们分别在机器学习的“训练阶段”和“预测输出阶段”起着重要的作用。
(3) 样本&特征
样本指的是数据集中的数据,一条数据被称为“一个样本”,通常情况下,样本会包含多个特征值用来描述数据,比如现在有一组描述人形态的数据“180 70 25”如果单看数据你会非常茫然,但是用“特征”描述后就会变得容易理解,如下所示:
图1:样本&特征
由上图可知数据集的构成是“一行一样本,一列一特征”。特征值也可以理解为数据的相关性,每一列的数据都与这一列的特征值相关。
(4) 向量
任何一门算法都会涉及到许多数学上的术语或者公式。在本教程写作的过程中也会涉及到很多数学公式,以及专业的术语,在这里我们先对常用的基本术语做一下简单讲解。
第一个常用术语就是“向量”,向量是机器学习的关键术语。向量在线性代数中有着严格的定义。向量也称欧几里得向量、几何向量、矢量,指具有大小和方向的量。您可以形象地把它的理解为带箭头的线段。箭头所指:代表向量的方向;线段长度:代表向量的大小。与向量对应的量叫做数量(物理学中称标量),数量只有大小,没有方向。
在机器学习中,模型算法的运算均基于线性代数运算法则,比如行列式、矩阵运算、线性方程等等。其实对于这些运算法则学习起来并不难,它们都有着一定运算规则,只需套用即可,因此你也不必彷徨,可参考向量运算法则。向量的计算可采用 NmuPy 来实现,如下所示:
import numpy as np
#构建向量数组
a=np.array([-1,2])
b=np.array([3,-1])
#加法
a_b=a+b
#数乘
a2=a*2
b3=b*(-3)
#减法
b_a=a-b
print(a_b,a2,b3,b_a)
输出结果:
[2 1] [-2 4] [-9 3] [-4 3]
简而言之,数据集中的每一个样本都是一条具有向量形式的数据。
(5) 矩阵
矩阵也是一个常用的数学术语,你可以把矩阵看成由向量组成的二维数组,数据集就是以二维矩阵的形式存储数据的,你可以把它形象的理解为电子表格“一行一样本,一列一特征”表现形式如下:
图2:矩阵表格
如果用二维矩阵的表示的话,其格式如下所示:
2、假设函数&损失函数
机器学习在构建模型的过程中会应用大量的数学函数,正因为如此很多初学者对此产生畏惧,那么它们真会有这么可怕吗?其实我认为至少没有你想的那么可怕。从编程角度来看,这些函数就相当于模块中内置好的方法,只需要调用相应的方法就可以达成想要的目的。而要说难点,首先你要理解你的应用场景,然后根据实际的场景去调用相应的方法,这才是你更应该关注的问题。
假设函数和损失函数是机器学习中的两个概念,它并非某个模块下的函数方法,而是我们根据实际应用场景确定的一种函数形式,就像你解决数学的应用题目一样,根据题意写出解决问题的方程组。下面分别来看一下它们的含义。
(1) 假设函数
假设函数(Hypothesis Function)可表述为y=f(x)
其中 x 表示输入数据,而 y 表示输出的预测结果,而这个结果需要不断的优化才会达到预期的结果,否则会与实际值偏差较大。
(2) 损失函数
损失函数(Loss Function)又叫目标函数,简写为 L(x),这里的 x 是假设函数得出的预测结果“y”,如果 L(x) 的返回值越大就表示预测结果与实际偏差越小,则证明预测值越来越“逼近”真实值,这才是机器学习最终的目的。因此损失函数就像一个度量尺,让你知道“假设函数”预测结果的优劣,从而做出相应的优化策略。
(3) 优化方法
“优化方法”可以理解为假设函数和损失函数之间的沟通桥梁。通过 L(x) 可以得知假设函数输出的预测结果与实际值的偏差值,当该值较大时就需要对其做出相应的调整,这个调整的过程叫做“参数优化”,而如何实现优化呢?这也是机器学习过程中的难点。其实为了解决这一问题,数学家们早就给出了相应的解决方案,比如梯度下降、牛顿方与拟牛顿法、共轭梯度法等等。因此我们要做的就是理解并掌握“科学巨人”留下的理论、方法。
对于优化方法的选择,我们要根据具体的应用场景来选择应用哪一种最合适,因为每一种方法都有自己的优劣势,所以只有合适的才是最好的。
上述函数的关系图如下所示:
图3:函数关系图
3、拟合&过拟合&欠拟合
拟合是机器学习中的重要概念,也可以说,机器学习的研究对象就是让模型能更好的拟合数据,那到底如何理解“拟合”这个词呢?
(1)拟合
形象地说,“拟合”就是把平面坐标系中一系列散落的点,用一条光滑的曲线连接起来,因此拟合也被称为“曲线拟合”。拟合的曲线一般用函数进行表示,但是由于拟合曲线会存在许多种连接方式,因此就会出现多种拟合函数。通过研究、比较确定一条最佳的“曲线”也是机器学习中一个重要的任务。如下图所示,展示一条拟合曲线(蓝色曲线):
图4:曲线拟合
提示:很多和数学相关的编程语言都内置计算拟合曲线的函数,比如 MATLAB 、Python Scipy 等,在后续内容中还会介绍。
(2) 过拟合
过拟合(overfitting)与是机器学习模型训练过程中经常遇到的问题,所谓过拟合,通俗来讲就是模型的泛化能力较差,也就是过拟合的模型在训练样本中表现优越,但是在验证数据以及测试数据集中表现不佳。
举一个简单的例子,比如你训练一个识别狗狗照片的模型,如果你只用金毛犬的照片训练,那么该模型就只吸纳了金毛狗的相关特征,此时让训练好的模型识别一只“泰迪犬”,那么结果可想而知,该模型会认为“泰迪”不是一条狗。如下图所示:
图5:过拟合
过拟合问题在机器学习中经常原道,主要是因为训练时样本过少,特征值过多导致的,后续还会详细介绍。
(3) 欠拟合
欠拟合(underfitting)恰好与过拟合相反,它指的是“曲线”不能很好的“拟合”数据。在训练和测试阶段,欠拟合模型表现均较差,无法输出理想的预测结果。如下图所示:
图6:欠拟合
造成欠拟合的主要原因是由于没有选择好合适的特征值,比如使用一次函数(y=kx+b)去拟合具有对数特征的散落点(y=log2x),示例图如下所示:
图7:欠拟合示例图
欠拟合和过拟合是机器学习中会遇到的问题,这两种情况都不是我期望看到的,因此要避免,关于如何处理类似问题,在后续内容中还会陆续讲解,本节只需要大家熟悉并理解常见的机器学习术语和一些概念即可。
三、Python机器学习环境搭建
常言道“工欲善其事,必先利其器”,在学习机器学习算法之前,我们需要做一些准备工作,首先要检查自己的知识体系是否完备,其次是要搭建机器学习的开发环境。本教程以讲解算法为主,不会涉及太复杂的应用案例,在讲解过程中会穿插一些示例代码,这样不仅能够帮助你理解算法原理,同时又能让你体会到算法的应用过程。
机器学习的研究方向有很多,比如图像识别、语音识别、自然语言处理、以及深度学习等,因此它是一门较为复杂的技术,有一定的“门槛”要求。如果你对编程知识一无所知,就想熟练应用机器学习,这几乎是天方夜谭。那么您应该掌握哪些知识才能更好地学习本教程呢?包括下列四大核心知识。
1、Python
对于编程人员来说,想到“机器学习”第一个关联起来的词汇就是“Python”。近几年, Python 之所成为炙手可热的“流量小生”,这与它对“人工智能”领域的“鲸吞”有很大关系。目前而言,在人工智能领域能与 “Python”一较高下的只有 R 语言。不过由于 Python 语言的简洁性、易读性,以及 Python 对科学计算和深度学习框架(Tensorflow、Pytorch 等)的良好支持等,使得 Python 处于远远领先的位置。
图1:2021年编程语言排行榜
目前为止,Python 是对“机器学习”最为友好的一门语言,因此学习机器学习的第一个前提条件就是熟练应用 Python 语言。关于 Python 的学习不再本教程介绍范围之内,您可以参考《Python编程基础》《(一)Python基础教程》进行针对性学习。
2020 年 Python 官方宣布暂停对 Python 2.x 版本的维护工作,并把 2.7 版本作为最后一个支持维护的版本。截止本教程书写前,Python 最新版本是 3.9 版本,因此建议你选择 3.6 以上版本来安装使用。Python 除了自身的拥有强大的标准库外,还有非常丰富的第三方支持库。您可使用 Python 内置的包管理器pip
轻松地管理资源包的下载与更新。
Python 官方网站提供了完善的资料文档和版本下载支持(Welcome to Python.org)。
图2:Python官网首页(点击高清图)
2、NumPy
NumPy(NumPy)属于 Python 的第三方扩展程序包,它是 Python 科学计算的基础库,提供了多维数组处理、线性代数、傅里叶变换、随机数生成等非常有用的数学工具。
NumPy 的安装方式非常简单,在安装好 Python 的基础上使用包管理器来安装,命令如下所示:
pip install numpy
我们知道机器学习与数学有着非常紧密的关系,因此熟练的应用 NumPy 也是你要面对的第一个挑战,它可以让你认识到 Python 在科学计算方面的优势。NumPy 并不在本教程讲解范畴内,这里推荐大家参考《NumP教程》《NumP教程》进行学习。
图3:NumPy官方网站
3、Pandas
Pandas 属于 Python 第三方数据处理库,它基于 NumPy 构建而来,主要用于数据的处理与分析。我们知道对于机器学习而言数据是尤为重要,如果没有数据就无法训练模型。Pandas 提供了一个简单高效的 DataFrame 对象(类似于电子表格),它能够完成数据的清洗、预处理以及数据可视化工作等。除此之外,Pandas 能够非常轻松地实现对任何文件格式的读写操作,比如 CSV 文件、json 文件、excel 文件。Pandas 同样不在本教程的介绍范畴之内,推荐您阅读《Pandas教程》。
图4:Pandas官方网站
Pandas 安装非常简单,同样可以使用 pip 包管理器完成安装,如下所示:
pip install pandas
4、Scikit-Learn
最后介绍机器学习中的重要角色 Scikit-Leran(官网:scikit-learn: machine learning in Python — scikit-learn 1.3.2 documentation),它是一个基于 Python 语言的机器学习算法库。Scikit-Learn 主要用 Python 语言开发,建立在 NumPy、Scipy 与 Matplotlib 之上,它提供了大量机器学习算法接口(API),因此你可以把它看做一本“百科全书”。由于 Scikit-Learn 的存在极大地提高了机器学习的效率,让开发者无须关注数学层面的公式、计算过程,有更多的更多的时间与精力专注于业务层面,从而解决实际的应用问题。
图5:Scikit-Learn官方网站
Scikit-Learn 的基本功能主要被分为六大部分:分类,回归,聚类,数据降维,模型选择和数据预处理。本教程将围绕机器算法的讲解 Scikit-Learn 实际的应用。 Scikit-Learn 安装也非常简单,执行以下命令即可安装:
pip install scikit-learn
安装完成后导入 scikit 即可应用 Scikit-Learn,如下所示:
import sklearn
当你想要调用机器学习算法时也非常简单,Scikit-Learn 已经将算法按模型分类,比如线性回归算法可以从线性模型中调用,如下所示:
from sklearn import linear_model
model = linear_model.LinearRegression()
后续内容会逐一讲解 Scikit-Learn 库中的常用算法示例应用。本节介绍了在学习机器学习算法前,你应该掌握的必备知识。如果你已经掌握了本节介绍的前三个核心知识,并且还具备一定的数学基本知识(高中即可),那么你就拥有了学习机器学习算法的能力。
四、线性回归算法详解
本节我们会认识第一个机器学习算法 —— 线性回归算法(Linear Regression),它是机器学习算法中较为简单,且容易理解的算法模型,你可以把它看做您的第一个“Hello World”程序。
我们先从语义上了解“线性回归”,如果您是第一次接触“线性回归”这个词,那么可以把它分开来看,其中“性代”表线性模型,而“回归”则表示回归问题,也就是用线性模型来解决回归问题。看完上述解释,您脑子中可能仍有许多“问号”,线性还可以理解,比如我们所熟知的直线、曲线、线性方程等,那么“回归”又代表什么呢?
其实“回归”一词最早由英国科学家弗朗西斯·高尔顿提出。1875 年,高尔顿利用子代豌豆与父代豌来确定豌豆尺寸的遗传规律。实验的大意是说:非常矮小的的父辈倾向于有偏高的子代,非常高大的的父辈倾向于有偏矮的子代。。这表明子代的身高向着父辈身高的平均值回退,后来人们把这种研究方法称为“回归预测”。
1、线性回归是什么
线性回归主要用来解决回归问题,也就是预测连续值的问题。而能满足这样要求的数学模型被称为“回归模型”。最简单的线性回归模型是我们所熟知的一次函数(即 y=kx+b),这种线性函数描述了两个变量之间的关系,其函数图像是一条连续的直线。如下图蓝色直线:
图1:线性连续函数
还有另外一种回归模型,也就是非线性模型(nonlinear model),它指因变量与自变量之间的关系不能表示为线性对应关系(即不是一条直线),比如我们所熟知的对数函数、指数函数、二次函数等。
图2:非线性连续函数
我们知道“线性回归”就是利用线性模型来解决“回归问题”,那到底什么是回归问题呢?你可以把它理解为“预测”真实值的过程。
在《三国演义》中有一个非常精彩的片段“七星坛诸葛祭风”说的是诸葛亮借东风的故事。其实我们抛开历史,单从科学角度出发,诸葛亮借东风就是一个“回归问题”。首先诸葛亮需要掌握大量的天文地理知识,并凭借自己的知识对以往的天气数据进行大量研究,最后才能预测某个时间将有“东风来临”。这种相似的回归问题,在实际生活中我们经常遇到,比如根据历史行情预测股票走势、预测房屋售价以及电影票房预估等等,而要实现这些预测就需要大量的“历史数据”作为支撑点。
在上述讲解过程中,我们反复提起“预测”与“历史数据”,既然是预测,那么就不能说它是 100 % 精确,所以线性回归只是无限地逼近“真实值”,而这个逼近的过程需要大量“历史数据”提供支持。因此线性回归就是利用线性模型来“预测”真实值的过程。
2、线性回归方程
那么线性回归是如何实现预测的呢?其实主要是通过“线性方程”,或叫“回归方程”来实现。下面列举一个简单的例子,现有以下一组数据:
输入 | 输出 |
---|---|
1 | 2 |
2 | 4 |
3 | 6 |
... | ... |
9 | ? |
根据上表中的规律预测出 9 所对应的输出值,并写出线性方程。这个示例是不是非常简单,我们很容易想到 9 对应的是“18”,这是一道小学生都能解出来题,但请您不要小看这么一个简单的示例,它同样说明了很多问题。线性方程如下所示:
Y = 2 * X
在上述线程方程中2
代表权值参数,而求这个参数的过程就是“回归”,一旦有了这个参数,再给定输入,做预测就非常容易了。具体的做法就是用回归系数乘以输入值,这样就得到了预测值。上述示例的预测函数(或称假设函数)可记为:
y = w1x + b
在前面介绍专业术语时,我们提起过“假设函数”,上述函数就是线性模型的“假设函数”。其中 x 表示输入的样本数据,y 表示输出的预测结果,而 w1 指的是线性回归模型的权值参数,b 指的是线性回归模型的“偏差值”。解决线性回归问题的关键就在于求出权值参数、偏差值。
权值,可理解为个不同“特征”对于预测结果的重要性。权值系数越大,那么这一项属性值对最终结果的影响就越大。
在实际应有中,线性回归模型要更复杂一些,比如要分析实际特征值对结果影响程度的大小,从而调整相应特征值的回归系数。下面举一个简单的应用示例:
现在要判断一个西瓜是否是成熟,根据我们的日常经验可从以下几个特征来判断:外表色泽(x)、根蒂(y)、敲声(z)。而以上三个特征所占用的权值参数也不同。如下所示:
y = 0.2x1 + 0.5x2 + 0.3 x3 + 1
上述表达式可以看出每一个特征值对预测结果的影响程度不同,根蒂是否“枯萎”对结果影响最大,而外表色泽是否鲜亮,敲声是否沉闷则占据次要因素。
当然采集数据的时也会存在一些无用数据,比如西瓜的外形、价格,这些特征不会对预测结果产生影响,因此它们权值参数为“0”。从这个例子可以得出“权值参数”是决定预测结果是否准确的关键因素。
3、实现预测的流程
下面通过一个具体实例讲解线性回归预测的具体流程。
(1) 数据采集
任何模型的训练都离不开数据,因此收集数据构建数据集是必不可少的环节。比如现在要预测一套房子的售价,那么你必须先要收集周围房屋的售价,这样才能确保你预测的价格不会过高,或过低。如下表所示:
图3:数据集样本
当然上述样本数量远远不足,如果想要更加准确的预测就要收集更多的数据,至少保证 100 条样本。表格中的最后一栏是“房屋售价”,这是“有监督学习”的典型特点,被称为“标签”也就是我们所说的“参考答案”。表格中的面积、数量、距离市中心距离(km),以及是否是学区房,这些都是影响最终预测结果的相关因素,我们称之为“特征”,也叫“属性”。
你可能会认为影响房屋售价的不止这些因素,没错,不过采集数据是一个很繁琐的过程,因此一般情况下,我们只选择与预测结果密切相关的重要“特征”。
(2) 构建线性回归模型
有了数据以后,下一步要做的就是构建线性回归模型,这也是最为重要的一步,这个过程会涉及到一些数学知识,至于如何构建模型,下一节会做详细介绍。
构建完模型,我们需要对其进行训练,训练的过程就是将表格中的数据以矩阵的形式输入到模型中,模型则通过数学统计方法计算房屋价格与各个特征之间关联关系,也就是“权值参数”。训练完成之后,您就可以对自己的房屋价格进行预测了。首先将数据按照“特征值”依次填好,并输入到模型中,最后模型会输出一个合理的预测结果。示意图如下所示:
图4:流程示意图
从上图可知,回归模型承担着非常重要的作用,关于如何构建回归模型,在下一节将做详细介绍。
五、构建线性回归模型
本节讲解如何构建线性回归算法中的“线性模型”,所谓“线性”其实就是一条“直线”。因此,本节开篇首先普及一下初中的数学知识“一次函数”。
1、一次函数
一次函数就是最简单的“线性模型”,其直线方程表达式为y = kx + b
,其中 k 表示斜率,b 表示截距,x 为自变量,y 表示因变量。下面展示了 y = 2x + 3 的函数图像:
图1:函数图像y=2x+3
函数中斜率 k 与 截距 b 控制着“直线”的“旋转”与“平移”。如果斜率 k 逐渐减小,则“直线”会向着“顺时针”方向旋转,为 k= 0 的时候与 x 轴平行。截距 b 控制“直接”的上下平移,b 为正数则向上平移,b 为负数则表示向下平移。
在机器学习中斜率 k 通常用 w 表示,也就是权重系数,因此“线性方程”通过控制 w 与 b 来实现“直线”与数据点最大程度的“拟合”。如下图(黑色 x 号代表数据样本)所示:
图2:线性拟合
线性方程不能完全等同于“直线方程”,因为前者可以描述多维空间内直接,而后者只能描述二维平面内的 x 与 y 的关系。
2、构建线性模型
在线性回归问题中数据样本会呈现“线性”分布的态势,因此我们使用“线性方程”来最大程度的“拟合数据”。线性方程预测的结果具有连续性,下面通过示例简单说明:小亮今年 8 岁,去年 7 岁,前年 6 岁,那么他明年几岁呢?估计你闭着眼都能想到答案,但是我们要从机器学习的角度去看待这个问题。
首先年龄、时间是一组连续性的数据,也就是因变量随着自变量规律性地连续增长,显然它是一个“回归问题”。下面把上述数据以二维数组的形式表示出来,构建一个数据集,如下所示:
[[2021,8],
[2020,7],
[2019,6]]
我们知道两个点就可以确定一条“直线”,因此将两组数据带入 y = kx + b,最终求得“线程方程”:
y = x - 2013
上述函数就是所谓的“假设函数”,通过它即可实现对结果的预测。这个函数的图像如下所示:
图3:假设函数图像
从上述函数图像可以看出,直线对数据样本恰好“拟合”。这是最标准的拟合直线,通过它就可以“预测”出小亮明年的年龄了。上述示例就构建了一个简单的的“线性模型”。读到这里你会惊叹“怎么如此简单”,其实线性模型就是这么简单。对于机器学习而言,最关键的就是“学习”,在大量的数据中,通过不断优化参数,找到一条最佳的拟合“直线”,最终预测出一个理想的结果。
提示:上述示例是一个理想化的“线性模型”,在实际应用中要复杂的多,不过“万变不离其宗”。
机器学习是一门数学、统计学、计算机科学的结合技术,因此它有着独特的知识体系,比如会将数据集分为“训练集”与“测试集”,而且还会通过“损失函数”来不断优化预测结果,关于这些知识会在后需内容详细介绍。
六、线性回归:损失函数和假设函数
通过前面内容的介绍,我相信你对线性回归算法已经有了初步的认识。那我们应该如何在一大堆数据中求解出“线性方程呢”比如前面提及的房价预测问题?这种问题才是符合实际应用的。数据样本会散落在“线性方程”的周围(下图 2 所示), 而我们要做就是让线性方程的“直线”尽可能“拟合”周围的数据点。本节我们将从数学角度解析线性回归模型。
1、假设函数
通过前面知识的学习,我们知道假设函数是用来预测结果的。前面讲述时为了让大家更容易理解“线性回归”,我们以“直线方程”进行了类比讲解,然而线性方程并不等同于“直线方程”,线性方程描绘的是多维空间内的一条“直线”,并且每一个样本都会以向量数组的形式输入到函数中,因此假设函数也会发生一些许变化,函数表达式如下所示:
乍一看你可能蒙圈了,记住不用紧张。其实它和 Y=wX + b 是类似的,只不过我们这个标量公式换成了向量的形式。如果你已经学习了 《NumPy 教程》,那么这个公司很好理解,Y1
仍然代表预测结果, X1
表示数据样本, b
表示用来调整预测结果的“偏差度量值”,而wT
表示权值系数的转置。矩阵相乘法是一个求两个向量点积的过程,也就是按位相乘,然后求和,如下所示:
图1:矩阵乘法运算
矩阵 A 的每一行分别与矩阵 B 的每一列相乘,比如 1*5+2*5+3*7 =36 、1*2+2*6+3*6=32、1*6+2*7+3*4=32,即可得出结果的第一行数据。
转置操作的目的是为了保证第一个矩阵的列数(column)和第二个矩阵的行数(row)相同,只有这样才能做矩阵乘法运算。
您也可以将假设函数写成关于 x 的函述表达式,如下所示:
2、损失函数
我们知道,在线性回归模型中数据样本散落在线性方程的周围,如下图所示:
图2:线性回归模型
损失函数就像一个衡量尺,这个函数的返回值越大就表示预测结果与真实值偏差越大。其实计算单个样本的误差值非常简单,只需用预测值减去真实值即可:
单样本误差值 = Y1 - Y
但是上述方法只适用于二维平面的直线方程。在线性方程中,要更加复杂、严谨一些,因此我们采用数学中的“均方误差”公式来计算单样本误差:
公式是求“距离”因此要使用平方来消除负数,分母 2 代表样本的数量,这样就求得单样本误差值。当我们知道了单样本误差,那么总样本误差就非常好计算了:
最后,将假设函数带入上述损失函数就会得到一个关于 w 与 b 的损失函数(loss),如下所示:
在机器学习中使用损失函数的目的,是为了使用“优化方法”来求得最小的损失值,这样才能使预测值最逼近真实值。
在上述函数中 n、Y、X1 都是已知的,因此只需找到一组 w 与 b 使得上述函数取得最小值即可,这就转变成了数学上二次函数求极值的问题,而这个求极值的过程也就我们所说的“优化方法”。关于如何求极值会在下一节做详细介绍。
下一部分将在Python机器学习算法入门教程(第二部分)展开描述。