参考
术语
标签
标签是我们要预测的事物,即简单线性回归中的 变量。标签可以是小麦未来的价格、图片中显示的动物品种、音频剪辑的含义或任何事物。
特征
特征是输入变量,即简单线性回归中的 变量。简单的机器学习项目可能会使用单个特征,而比较复杂的机器学习项目可能会使用数百万个特征,按如下方式指定:
在垃圾邮件检测器示例中,特征可能包括:
- 电子邮件文本中的字词
- 发件人的地址
- 发送电子邮件的时段
- 电子邮件中包含“一种奇怪的把戏”这样的短语。
样本
样本是指数据的特定实例:(是一个矢量)。我们将样本分为以下两类:
- 有标签样本
- 无标签样本 有标签样本同时包含特征和标签。即:
labeled examples: {features, label}: (x, y)
例如,下表显示了从包含加利福尼亚州房价信息的数据集中抽取的3个有标签样本:
housingMedianAge (特征) | totalRooms (特征) | totalBedrooms (特征) | mediaHouseValue (标签) | |
---|---|---|---|---|
15 | 5612 | 1283 | 66900 | |
19 | 7650 | 1901 | 80100 | |
17 | 720 | 174 | 85700 |
无标签样本包含特征,但不包含标签。即:
unlabeled examples: {features, ?}: (x, ?)
模型
模型定义了特征与标签之前的关系。
- 训练是指创建或学习模型:向模型展示有标签的样本,让模型逐渐学习特征与标签之间的关系
- 推断是指将训练后的模型应用于无标签的样本:使用经过训练的模型,做出有用的预测()
回归与分类
- 回归模型可预测连续值:
- 上海一栋房产价值多少
- 用户点击此广告的概率多少
- 分类模型可预测离散值:
- 判断邮件是不是垃圾邮件
- 判断一张照片是狗还是猫
监督学习(Supervised Learning)
已知输入为,输出为的标注训练集,通过学习训练集,得到一种映射模型。即监督学习中训练数据既有特征(feature)又有标签(label)。
无监督学习(Unsupervised Learning)
不知道数据集中数据、特征之间的关系,而是要根据聚类或一定的模型得到数据之间的关系。更像是自学,没有标签(label)
训练集和测试集
- 训练集:用于训练模型的子集
- 测试集:用于测试训练后模型的子集
确保测试集满足以下两个条件:
- 规模足够大:可产生具有统计意义的结果
- 能够代表整个数据集:挑选的测试集的特征应该与训练集的特征相同
训练过程可视化如下:
工作流程:
验证集
将数据集划分为三个子集(增加验证集),可大幅降低过拟合发生的几率:
训练集 验证集 测试集工作流程如下:
- 使用训练集训练模型
- 使用验证集评估模型
- 使用测试集检查评估结果
该流程之所以更好,原因在于它暴露给测试集的信息更少。
泛化(Generalization)
降低损失
迭代方法
梯度下降
- 凸形问题只有一个最低点:即存在一个斜率刚好等于0的位置。这个最小值就是损失函数收敛之处。
- 梯度下降算法:
- 为选择一个起始值(起点)。起点并不重要
- 计算损失曲线在处的梯度
- 沿着负梯度的方向走一步,以便尽快降低损失
梯度是一个矢量,有两个特征:
- 方向
- 大小
学习速率
梯度矢量具有方向和大小。梯度下降算法用梯度乘以一个称为学习速率(又称步长)的标量,以确定下一个点的位置。
-
超参数:是编程人员在机器学习算法中用于调整的旋钮。
-
学习速率过小:花费很长的学习时间
- 学习速率过大:就会在U形底部震荡。
- 合适的速率
下面是速率为0.1的梯度下降算法
可见,在接近于谷底的时候,学习的速率太慢。
随机梯度下降法
- 批量:在梯度下降法中,指的是用于单次迭代中计算梯度的样本总数
一个批量可能相当巨大,如果是超大批量,则单次迭代就可能花费很长时间进行计算。
包含随机抽样样本的大型数据集可能包含冗余数据。实际上,批量大小越大,出现的冗余的可能性越高。
如何通过更小的计算量得出正确的平均梯度。
- 随机梯度下降法(SGD):每次只迭代使用一个样本(批量大小为1),如果进行足够的迭代,SGD也可以发挥作用,但过程会非常杂乱。 “随机”表示构成各个批量的一个样本都是随机选择的。
- 小批量随机梯度下降法(小批量SGD):介于全批量迭代与SGD之间的折中方案。小批量通常包含10~1000个随机选择的样本。
表示(Representation)
特征工程
- 特征矢量:组成数据集中样本的浮点值集
- 特征工程:将原始数据转为为特种矢量
映射数值
整数和浮点数不需要特殊编码,可以与数字权重相乘。
映射分类值
分类特征具有一组离散的可能值,比如street_name特征,选项包括:
{'南京东路', '静安寺', '陆家嘴', '张江路'}
采用数值型映射已经不合适。比如使用street_name作为特征来预测房价模型为例,
- 没有适用于所有街道的单一权重:根据街道名称对房价进行线性调整的可能性不大
- 没有将street_name可能有多个值情况考虑在内。比如许多房屋位于两条街道的拐角处,则无法在street_name中对该信息进行编码
为此,可以为模型中的每个分类特征创建一个二元向量来表示这些值:
-
对适应于样本的值,将相应向量元素设为1
-
将所有其他元素设置为0
-
独热编码:该向量长度等于词汇表中的元素数,但只有一个值为1
-
多热编码:当有多个值为1时
下图是街道Shorebird Way的独热编码:
稀疏表示法
二元向量表示法是非常低效的。
- 稀疏表示法:仅存非零值,仍然为每个特征值学习独立的模型权重
良好特征的特点
- 避免很少使用的离散特征值
- 最好具有清晰明确的含义
- 实际数据内不要掺入特殊值
- 考虑上游不稳定性:特征的定义不应随时间变化。
数据清理
缩放特征值
- 缩放:将浮点特征值从自然范围(例如100到900)转为标准范围(例如0到1 或 -1到+1)。
如果特征集中包含多个特征,则缩放特征可带来如下优势:
- 帮助梯度下降法更快速地收敛
- 帮助避免“NaN陷阱”:在这种陷阱中,模型中一个数值变成NaN,并且模型中的其他数值最终也会因为数学运算变成NaN
- 帮助模型为每个特征确定合适的权重:如果没有特征缩放,则模型会对较大的特征投入过多精力
处理极端值
下面的曲线图表示的是加利福尼亚州住房数据集中称为 roomsPerPerson 的特征。roomsPerPerson 值的计算方法是相应地区的房间总数除以相应地区的人口总数。该曲线图显示,在加利福尼亚州的绝大部分地区,人均房间数为 1 到 2 间。不过,请看一下 x 轴,有非常长的尾巴。
如何最大限度降低这些极端离群值的影响?一种方法是对每个值取对数:
对数缩放仍然留有尾巴。
简单的将特征值限制在一个范围内:
分箱
下面的曲线图显示了加利福尼亚州不同纬度的房屋相对普及率:
按照上图分箱后,可以将纬度37.4表示为
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
分箱之后,我们的模型现在可以为每个纬度学习完全不同的权重
清查
数据集中有很多样本是不可靠的:
- 遗漏值
- 重复样本
- 不良标签
- 不良特征值