3.1.1 机器学习的数据统计思维
相信不少产品经理都有与前端工程师沟通需求的经历。如果想要将一个页
面的背景色变成蓝色,只需要告诉工程师一个色值,工程师输入一行代码,就
能够实现这个效果。如果想要将页面中菜单栏与内容栏的间距变大,只需要告
诉他们一个距离,他们输入一行代码,就能改变间距。对于工程师来说,他们
赋予计算机一串指令,编译器根据这串指令一步步执行?去,生成结果。这是
因为对于“程序”背后蕴含的“逻辑关系”,可以通过特定的语法得到想要的
结果,工程师只需要将规则翻译成指令,交给计算机去执行即可。
然而在机器学习中,我们不再使用这种传统开发程序的模式。虽然在机器
学习中,工程师仍需给计算机赋予指令,但这串指令不是为了直接获得结果,
而是一串赋予机器“自主学习”能力的指令。通过“学习”,计算机能够自主
判断应该设置什么背景色,应该设置多宽的间距比较合理。机器学习是一种学
习思维而不是执行思维 。
实际上,这两种模式的背后是从“程序逻辑”到“数据统计”的思维转
变。如图3-1所示,这种“相关而非因果”的概念是机器学习的理论根基。在
这个基础上,可以这样来理解机器学习:计算机使用人为输入的数据,利用特
定的算法,得到某种模型的过程。最终目的是让计算机能够使用模型自主判
断、预测更多未知的信息。因此数据是实现“统计”的基础,有数据才能够统
计规律,分析数据之间隐藏的关系。数据的质量决定了计算机学习的效果

在学习机器学习算法之前,产品经理必须对手上的数据有一个清?的认
识。在实际项目中,在选择算法的时候,除了要考虑需求场景,还需要考虑
手上数据的类型 。某些算法只需要少量样本数据就可以实现目标,某些算法
则需要大量样本数据才能学习规律。某些算法只能处理特定类型的样本数据,
例如朴素贝叶斯算法与分类数据相得益彰,对缺失数据也完全不敏感。
本章我们从机器学习的数据类型开始学习,对数据有一个全面的认识之
后,学习数据可视化展示的方式,从图表的视角直观地了解数据的概况。最后
我们学习模型效果的评价指标,了解如何评价一个模型的效果,理解模型调优
及数据处理的过程。
3.1.2 数据集
数据集是指数据的集合。数据集通常以表格的形式出现,表格中每一行单
独的数据称为“样本”。每行样本通常都会带有一些“属性”,也称为“特
征”,每个属性的具体取值称为属性值。表格的每一列对应一个不同的特征,
一个数据集有多少个特征就有多少列。如图3-2所示,张三、李四、王五等人
所代表的行数据都是不同的样本,每一行对应的性别、年龄、年收入代表这个
人不同的特征。
在有监督学习中,我们把拿到的数据集分成训练集、验证集与测试集三
类 。以一个分类模型为例,训练集是指专门用来供模型进行学习的样本数
据。通过学习这些样本,模型可以调节自身的参数来建立一个分类器。测试
集用于测试训练好的模型的分辨能力,测试模型的性能 。就像一个大题库,
平常老师让学生做其中大部分题目,一小部分题目留着考试的时候检验学生的
水平。训练集与测试集这两个概念比较容易理解,那么验证集有什么作用呢?
在讲解验证集之前,我们先区分一?模型的各种参数。参数又是什么意思
呢?可以形象地理解它就像一个手表中的齿轮,要想使手表走时准确,我们就
要调节这些齿轮旋转的速率以及连接的位置,在计算机中这种直接影响程序的
效果的“齿轮”称为参数。
对于一个模型来说,一般有“普通参数”和“超参数”两种类型的参数。
超参数这个概念理解起来比较费劲,我们通过一个简单的例子来说明普通参数
和超参数的区别。在深圳,高考成绩和高三期间四次模拟考的成绩有很大关
系,四次模拟考分数越高的学生往往高考分数也越高。假设我们想建立一个模
型,通过以往考生四次模拟考的分数,预测这一届某个考生的高考分数能不能
超过一本线。
因为四次模拟考的难易程度是不同的,且通常有一定的规律,所以最简单
的做法是将四次模拟考的分数分别乘上一个权重,这个权重代表这四次考试的
难易程度。最后设置一个阈值,超过这个阈值就判定这个考生的分数能够超过
一本线,如图3-3所示。
模型必须经过学习才能预测。在这个模型中,我们用以往已经参加高考的
考生的四次模拟考成绩以及最后高考结果这两类数据作为训练数据,在训练过
程中会不断调整四个权重。模型一开始接触的数据少,得到的结果可能不太准
确。因此需要经过多次的迭代,不断学习新的数据,模型预测考生能否超过一
本线的准确率才会逐渐上升。
在上述例子中,“四次模拟考的权重”就是普通参数,普通参数是指可以
通过训练更新的参数。而“迭代次数”就是一个超参数,是指不在模型更新范
围内的参数,也就是说超参数一旦设置之后就不会再更新。常见的超参数还有
网络层数、网络节点数、学习率等。普通参数是模型的一部分,通过对训练集
数据的训练其就会自动改变,而超参数在模型以外,是“人为”调节模型效果
的参数。
验证集实际上是用来调节模型的超参数的 。根据验证集的结果可以调节
迭代次数、学习率等,使得结果在验证集上的表现更优。因此可以认为,验证
集验证的过程也是模型训练的一部分。
有读者可能会有疑问,为什么需要划分这么多的数据集?为什么不是把数
据都丢到模型里计算?实际上这些设定都是为了避免出现“过拟合”现象,
即模型训练到最后只认得训练时用的数据,适应不了新的数据,对新数据的
预测效果非常差 。
如果把所有样本数据都用来训练模型,建立的模型自然是最契合这些数据
的,测试的表现看起来也很好。但换其他数据集来测试,这个模型的效果可能
就没那么好。就像是给一家公司的员工采购礼品,如果只问某个团队的意见,
那么最终选择的礼品肯定是这个团队最满意的,但是其他团队的员工可能就没
有那么满意了。测试集和验证集起到了一个优化和验证的作用,在一个团队中
收集了礼品意见以后,拿到其他团队小范围确认一?这个意见,如果大家都是
支持的,则说明在整个公司内都比较认同这个意见。有了验证集和测试集,能
在模型应用到真实数据前预先验证效果,不至于等到模型上线运行以后才发现
效果不好,又要?线继续调整。
当样本数据较多的时候,三个数据集可以按照 5∶2.5∶2.5 的比例划
分,也可以按照8∶1∶1的方式划分,如图3-4所示。无论按照哪种方式划分,
都需保证三个集合的样本是从大集合中随机抽取的。
当样本数据少的时候,不太适用上述的划分方式。无论按什么比例划分,
样本数据太少很难有好的验证结果。在这种情况?,常用的方法是留一小部分
数据做测试集,然后对其余N个样本采用K折交叉验证法。将所有样本数据打
乱,然后均匀分成K份,每次训练时轮流选择其中K-1份进行训练,剩余的一
份做验证集 ,如图3-5所示。使用验证集的时候计算预测误差平方和,最后把
K次的预测误差平方和除以K,比较最后的结果作为选择最优模型的依据。
3.1.3 数据维度
数据维度指的是样本的特征数量,例如图3-2中的样本集中只有姓名、性
别、年龄和年收入四个特征,我们就说这个数据集包含四个维度。特征少称为
低维度,特征多称为高维度,维度高低没有明确的界定范围,是一个相对的概
念。低维度的数据和高维度的数据在模型运算时有很大区别,分析高维度数
据容易造成过拟合现象,因为特征多了以后模型的判断条件过于“细微”了
。
如果想让计算机自主分辨猫和狗的图片,我们只需要把包含“嘴巴”“鼻
子”“纹理”“尾巴”这四个特征的猫和狗的图片提供给模型,经过训练后计
算机就能分辨出猫的图片和狗的图片。如果再加上“毛色”“大小”“四
肢”“爪子”等特征,分类效果不见得比原来只有四个特征的时候更好,因为
特征多了以后模型很难去判断两种不同毛色的猫是不是同一个物种,如图3-6
所示。可见不是数据维度越多对模型效果就越有帮助,这种特征的维度增加带
来的效果降低就称为维数灾难。

造成这种现象的原因是模型学习了很多“特殊情况”,例如银行贷款审批
通过的客户名单中,如果有一小部分客户恰巧“没房没车”,那么模型就会认
为房和车这两个特征并不重要从而忽略了很多“没房没车”,?得不到贷款的
客户。我们希望模型能够学习更多带有普适性的数据,从而避免对新数据的分
辨效果变差。
3.1.4 数据类型
数据类型是数据在多个方面的不同表现。在描述同一对象的不同特点时,
可以用不同类型的特征,通常可分为定性或定量两类特征。例如在描述张三这
个人的状态时,有“职业”“家庭住址”“婚姻状况”这样的定性数据,也
有“年龄”“身高”“年收入”这样的定量数据。
除了定性和定量这种区分,还可以分为数值型、字符型、布尔型等。例
如“年收入”“年龄”这两个字段是数值型,“家庭住址”“职业”是字符
型,还有像“是否有房”“是否有社保”这种回答只有“是”或“否”的字段
就是布尔型的字段。
很多传统的机器学习算法主要是基于统计的结果寻找数据规律,所以计
算机只能够识别能够被统计的数据类型 。在机器学习领域,数据可分为两大
类:数值型和类别型,图3-7展示了数据类型的分类结果。

数值型泛指用数字表示的特征,分为连续型和离散型两种。连续型属性是
指在一定区间内可以任意取值的属性,其数值是连续不断的,相邻两个数值之
间有无限个可取值。例如人体的身高、体重和三围,这种都是在一个区间范围
内可能有连续取值的属性,如在180cm到181cm之间有无限的取值,张三的身高
是181.2cm,李四的身高是181.5cm。离散型属性是指只能用自然数或整数来计
算的属性。例如家庭人口数量、购买的保险数量、信用卡数等这都不能取小
数,只可能是1、2、3……这样的整数。数值型字段只能通过测量的方法获
得,离散型字段只能通过计数的方式获得。
类别型是指互斥、互不相交的类别,分为定类型和定序型两种。这两个类
型名称虽然相似但很容易区分,定序型属性的取值是可排序的,例如取值
为“高、中、低”“第一名、第二名、第三名”,这样的属性都是定序型;反
之定类型的属性都是不能排序的,例如性别只有男和女,血型只有A、B、O、
AB这种不能排序的取值。
为了让计算机理解“高、中、低”这三个属性值有什么区别,应将“高、
中、低”对应转化为“1、2、3”的数值形态。但这种转化并非数据类型的转
化,转化后还是类别型属性。数值型属性通过加减乘除的运算可以组合出新的
属性。但是对于类别型的属性来说,就算转化为数值形态,进行加减乘除等
运算依然是没有实际意义的 。“中”和“低”相加不会等于“高”,因此在
类别型属性中,“1”+“2”不等于“3”,转化仅仅是为了让计算机能够区分
不同的类别。理解这一点对于数据预处理和特征工程特别重要。