小叶在给一台教学设备编写检查程序。设备读数过高需要检查,过低也需要检查,只有靠近正常值的一段可以直接通过。AI建议先给每条记录一个分数,再按分数是否超过门槛来判断。这听上去简单,可是把原读数直接当分数时,一个门槛只能截住一头,另一头总会漏掉。

小叶当然可以写两条判断:“过高,或者过低”。还有另一种办法:先计算读数离正常值有多远,再用一个门槛判断。原来的记录没有变,设备也没有增加探头,但问题已经变得容易表达。这就是本章要理解的特征构造:把已有数据转换成适合当前任务的表示。

前几章经常把很多列压成较少的列。本章反过来问:增加几列为什么有时有用?如果新列只是从旧列算出来,它究竟增加了什么?又怎样识别一种表示只是让旧数据看起来很漂亮,换一批数据就失效?

本章全部设备、记录和数值均为教学虚构。案例中的异常标准用来说明表示与判断的关系,不是实际设备的操作规范。各节会交代何时沿用原任务,何时另做预测实验。

一、困难可能出在判断方式,而不是数据不够

先把读数整理成容易比较的偏差。设备的正常基准事前规定为20,每偏离2个读数单位记作1个偏差单位。用 表示原读数,定义无量纲偏差:

读数14对应偏差−3,读数26对应偏差3。这两条记录偏离方向相反,偏离程度相同。本例规定,偏差的绝对值超过2时标为异常,恰好等于2仍算正常。也就是原读数低于16或高于24才异常。

小叶先看五条记录:

原读数 偏差 按既定规则的标签
14 −3 异常
18 −1 正常
20 0 正常
22 1 正常
26 3 异常

如果只准使用“偏差大于某值就异常”,可以抓住读数过高,却会漏掉过低。如果改成“偏差小于某值就异常”,情况刚好相反。无论怎样移动这个门槛,都无法把两头一起选出来,同时留下中间。

给原偏差乘一个系数,再加一个固定数,也解决不了这件事。这种分数写成 ,其中 控制偏差对分数的影响, 是共同起点。按照分数是否大于0分类,就是一条仿射阈值规则。当 为正时,它仍然只选偏大的那一侧;为负时,只选偏小的一侧;为零时,所有记录得到相同分数。

这里真正受限的是规则的形状。原读数已经足以判断异常,因为既定标准正是根据它定义的。我们没有发现“一个数装不下这个问题”,只发现“一次加权后过一个门槛”这种简单规则不够用。

这一区别会直接影响小叶向AI提出的下一步要求。若认为数据不够,可能去采购新探头、增加采集工作;若知道关系已在数据里,只是现有规则表达不了,就可以先改变表示,或者允许程序使用两条条件。两种方案都能解决这个教学问题,升维是理解其中一种方案的入口。

二、增加平方列,把两头的异常放到同一边

小叶在偏差旁边增加一列平方偏差。五条记录的新列依次为9、1、0、1、9。负偏差在平方后也变成非负数,过高和过低终于可以用同一种“偏离程度”来比较。

现在只要规定“平方偏差大于4时异常”,就能得到原规则要求的结果。比较的现实含义是:无论偏向哪一边,只要偏离正常值足够远,都进入检查范围。平方在这里把方向相反、程度相同的偏离归到一起,方便用同一个门槛判断。

把一条原记录 变成一对数 ,记为:

符号 读作“phi”,在这里就是转换规则的名字。这种把输入转换成一组特征的规则叫特征映射。输入只有一个数,输出有两个坐标,因此这是一次从一维表示到二维表示的升维。

原偏差的两头异常经过平方特征可由一条水平边界区分
图 A10-01|原偏差的两头异常经过平方特征可由一条水平边界区分

图左保留原偏差,异常点在正常点的两边。图右横轴仍是原偏差,纵轴改为平方偏差。同一条记录在图右得到一个新位置,所有可能的记录沿着抛物线排列。水平线“平方偏差等于4”把上方异常点与下方正常点分开。

请把两件事放在一起看:在新坐标里,边界是一条直线;回到原读数,它仍对应一低一高两个边界。我们改变了表示问题的坐标,任务本身的正常范围没有变化。

这个例子也说明,构造了两个坐标不代表最后两个都要用。当前异常规则只需要平方偏差,原偏差可以暂时不参与打分。保留原偏差,是给其他判断留下方向信息。比如异常出现以后,程序还需要说明“偏高”还是“偏低”,就不能只看平方结果。

下面的代码把映射和判断分开写。第一列保留方向,第二列表示平方偏离;column_stack 把两列并排放好,features[:, 1] 取出所有行的第二列。

可复制模板
import numpy as np

t = np.array([-3., -1., 0., 1., 3.])
features = np.column_stack([t, t ** 2])
abnormal = features[:, 1] > 4
print(features)
print(abnormal.tolist())

结果的第二列是 [9, 1, 0, 1, 9],异常判断是 [True, False, False, False, True]。这段程序是在实现已知规则,没有用标签训练任何参数。将一种判断写成了矩阵操作,不等于已经让机器从数据中学会了它。

三、为什么曲线模型仍然可以叫线性模型

小叶下一步可能不再预先指定“平方偏差大于4”,而是允许系统根据示例选择不同特征的权重。假如分数写成:

其中 是用于判断的分数, 是待选择的参数。这个分数对原输入 可以形成曲线:一次偏差与平方偏差共同影响结果。但把特征坐标记为 ,同一个分数就是 ,仍然是对已有坐标分别加权后相加。

这里“线性”的参照对象需要说清。在特征坐标中,带固定偏移的规则是仿射的;在机器学习的常用说法中,这类允许截距的模型也归入线性模型。更关键的是,它对待估计的参数是线性的:参数没有彼此相乘,也没有被放进平方、指数等运算里。

这让非线性关系可以接上熟悉的矩阵工具。数据准备阶段先把平方算好,拟合阶段只需要为各列寻找合适的权重。难处理的“曲线形状”有一部分已经交给特征映射,而不是全部交给后面的求解算法。

把每条记录写成一行,并加入全为1的一列,可以得到设计矩阵:用于计算模型输出的特征表。对前面的五个偏差,它是:

这里大写 表示整张特征表;它在小写 给出的两个坐标之前,额外加入了常数列。向量 放三个参数,输出向量 则放五条记录各自的分数。矩阵乘法让每一行使用同一组参数,同时保留每条记录自己的偏差。

全1列对应的是常数项。每行在这一列都得到同样的权重 ,所以它提供一个共同基准,而不是设备的第三次测量。对于当前异常规则,参数可以直接选成 :正常与异常由平方偏离和门槛的差决定,正分数才判异常。

如果以后让AI写拟合代码,设计矩阵的列名和参数顺序就有实际意义。同样三个数,按“常数、偏差、平方偏差”排列,与按“常数、平方偏差、偏差”排列,作用不同。模型文件里保存的参数必须和生成特征的规则一起使用,不能只保存一串看似正确的数字。

常数、原字段、平方项和字段乘积,都是常见的多项式特征。软件中的具体列顺序可以查看scikit-learn的多项式特征说明。本章先手工组织小矩阵,是为了让每列的含义可见。

四、多出一列,为什么没有多出一次观察

原读数只有一次测量,平方偏差却看起来像一个新字段。这时可以问一个朴素问题:知道原偏差以后,还需要到设备旁边看一次,才能知道平方是多少吗?不需要。新列完全由旧列决定。

这类确定的转换没有补充新的观测事实,但可以让已有事实适合某种计算。测好长方形的长度和宽度以后,相乘就能得到面积,无须再测一次;如果目标是估计铺设材料的数量,面积常常比长宽分别加权更直接。表示的价值不必来自新采集,它也可以来自把任务真正关心的关系显露出来。

需要同时检查的是:映射后还能不能找回原输入。对于 ,第一坐标就保存着 ,所以可以直接恢复。这样的映射对不同原输入保持区分,叫单射。名字背后的判断很简单:两条不同原记录会不会被变成完全相同的新记录?

如果只留下 ,偏差−3和3都会变成9,方向就丢了。仅凭9无法决定原来是哪一个,这种变换不是单射。对于“两头都异常”的任务,这个合并不妨碍判断;对于“异常后往哪个方向调整”的任务,它就丢掉了必要信息。

所以,是否保留原列,取决于后续还要回答什么。若系统只存异常标记,用户以后再问偏差大小,也可能无从回答;若存平方值,能比较偏离程度,却未必知道方向;若保留原偏差,方向与程度都还可以重新计算。每一种表示都对应一组以后仍然能够回答的问题。

还有一种常见误会:既然没有新增信息,为什么一个模型的效果会变好?因为“信息在不在”与“这个模型能不能方便地利用它”是两回事。原来的单阈值规则不会自动组合两端,平方特征替它完成了这一步。若换成能直接使用两条条件的程序,原偏差已经足够,升维就未必带来额外收益。

AI根据长文整理出的标签、摘要,也可以从这个角度理解。它可能让后续筛选更容易,但不保证把原文全部含义保存下来;如果用到了外部检索,还要把外部取得的新事实与对原文的重新组织区分开。本章的数学映射是确定、可复算的小例子,不能据此保证任何语义摘要都无损。

五、列数、矩阵的秩和变化自由度是三种不同的问题

升维以后所有记录仍沿抛物线排列,没有铺满整个平面。它看起来像一条弯曲的线,为什么又说表示有两个维度?因为这里有几种不同的计数,关注的对象不同。

特征维数数的是每条记录有多少个坐标。表示 有两个坐标,连同常数列写成 就有三个。这是数据表的列数,也是后续模型直接接收的数值个数。

内在自由度关注一条合法记录实际能怎样变化。在这条抛物线上,只要选定 ,第二坐标就确定了,不能保持第一坐标不动却随意改变第二坐标。生成记录只需要一个连续变量,因此这条曲线的内在维数为1。这里看的是一条平滑曲线,判断任意复杂数据的内在维数还需要其他方法。

矩阵的秩则问:最多能从现有各列中选出多少个线性无关的列?所选的列彼此不能用固定系数线性组合表示,而其余列都能由这些列组合得到。它关心的是线性关系。平方列由原偏差确定,不等于它是原偏差与常数列的线性组合。

取偏差−1、0、1三条记录,常数列、偏差列、平方列组成:

假如平方列能够由“常数列乘一个固定数,再加偏差列乘另一个固定数”得到,那么它在这三个位置的取值应落在一条直线上。中间平方值为0,两端平方值却同为1,一条直线做不到。

还可以直接看线性无关的条件。设三列按系数 相加后得到全零列。中间那行先要求 ;两端随后分别要求 和 ,只能得到 。所以这三列线性无关,矩阵的秩为3。

于是,同一例子可以同时具有“三个特征坐标”“矩阵秩为3”“由一个连续变量生成”。它们没有矛盾。只要不把非线性的函数依赖误认成线性相关,就不会觉得升维凭空制造了三个互不依赖的测量来源。

这也解释了为什么前一章的线性降维不能随时把这种表示精确压回一个线性坐标,再线性重建全部列。我们确实可以只保存 ,以后重新计算 ;但那一步重建包含平方运算,已经不是线性重建。允许什么运算,决定了“一个数是否够用”的具体含义。

再看样本数量的影响:如果只有两条记录,就不可能从这张两行表里得到秩为3的矩阵;如果所有偏差都只有−1和1,平方列又会与常数列相同。特征设计规定了可能的函数,现有样本决定这些函数在这批数据上能否被区分。看到某次计算秩较低,还需要看采集过哪些输入。

六、交互项:有时重要的是两个条件怎样配合

平方项处理了单个偏差的程度。现在小叶另外接入两个探头,想识别它们偏离方向相同还是相反。这是同一设备项目中的另一个判断任务,不再沿用单探头“超过2异常”的标准。

将两个探头的无量纲偏差分别记为 ,先只看各自为−1或1的四种教学状态。小叶关心的是共同偏向一边,还是朝相反方向变化:

探头偏差 探头偏差 方向关系 乘积
−1 −1 同向 1
−1 1 反向 −1
1 −1 反向 −1
1 1 同向 1

只看某一个探头,正偏差可能遇到同向,也可能遇到反向;负偏差同样如此。判断需要保留两个字段的配合关系。乘积恰好能够表示它:同号乘积为正,异号乘积为负。两个输入相乘得到的新特征叫交互项。

它与简单相加的区别可以通过一个分数看出来。假如预测分数中包含 ,探头 固定时,分数中与 有关的部分是 。也就是说,第一个探头对分数的影响会随着第二个探头的状态变化,交互项让模型能够表达这种配合关系。

在当前四状态任务中,只用 的正负就足够。若允许探头偏差为0,乘积为0不属于前面四种严格同号或异号状态,需要另行定义这一类怎样处理。特征的数学输出始终有值,但业务分类要覆盖实际可能的状态。

两个探头同向与反向的交错分布可通过交互项分组
图 A10-02|两个探头同向与反向的交错分布可通过交互项分组

为什么直接给两列分别加权、再过一个门槛不行?看图左,同向状态在一条对角线两端,反向状态在另一条对角线两端。一条直线无法把两组放到两个不同的半平面。下面的短证明把这个直观判断落实下来。

设分数为 ,规定分数大于0判同向,其余判反向。两个同向状态的分数分别为 和 。它们若都大于0,相加就要求 。两个反向状态的分数分别为 和 。它们若都不大于0,相加却要求 。两个要求无法同时成立。

加入乘积以后,不必继续移动原来的直线,直接对乘积设零门槛即可。失败原因不是权重“还没调到最好”,而是原来的规则家族压根没有合适成员。这个证明帮助小叶判断什么时候应当改变特征或模型,而不是反复要求AI再调一次参数。

但“交互项”也不自动意味着两个探头存在物理上的因果作用。我们只是构造了一个能区分状态的量。由预测关系上升到因果解释,还需要设备原理或另行安排的实验;单凭一项乘积的权重不能完成这个推断。

七、构造特征,是给模型提供一组可组合的表达

平方和乘积并不是只有这些教学例子才有用。它们揭示了一种设计方法:先看任务依赖怎样的关系,再把这种关系写成模型容易组合的字段。

如果偏离方向无关、只有偏离程度重要,可以用绝对值或平方;如果两个测量共同决定结果,可以考虑乘积、差值或比例。选择要落到具体含义上。两个探头的读数差表示它们之间的不一致,与“两个读数是否同号”不是同一个问题,不能因为都是两列计算,就把它们互相替换。

例如,另一个检测目标可能是两个无量纲偏差的总偏离程度。小叶可以构造 ,它是点 到正常位置 的距离平方。若规则只关心距离是否超过某个半径,这一列就有用。可是同一个圆周上的点会得到相同数值,哪一个探头偏得更多等细节被合并了。能否合并,仍由目标决定。

如果还不清楚哪种关系重要,可以先提供少量有理由的候选特征,让拟合过程选择权重。对两个输入 ,包含不超过二次的所有多项式项是:

“不超过二次”指每一项中输入变量的总次数不超过2,所以 是二次, 已经是三次。原字段让模型表达方向上的变化,平方项允许单字段的弯曲关系,乘积允许一个字段的作用随另一个字段变化,常数项则提供共同基准。模型通过加权相加,组合出不同的响应形状。

这里可以把每一列理解为一种候选表达,而不是先验确定的物理规律。加入平方,只表示允许模型使用曲率;如果其权重最终为零,就没有使用这部分表达。加入乘积也不要求任何任务都必须有交互。特征构造提供选择空间,数据、目标和拟合方法共同决定最后用上哪一部分。

还有一些任务适合分段表示。假如设备只有向上偏离并超过门槛以后,额外偏差才开始产生损耗,可以构造“超出门槛的那一部分”,例如 。它在偏差未超过2时为0,超过以后只记录超出的量。平方特征记录正负两侧的偏离程度,而这一列只在向上越过门槛后起作用,两者表达的条件不同。

这些例子不要求小叶先穷尽所有函数再开始实验。更实际的起点是把原字段留下,增加能够回答当前困难的一两种表达,比较前后效果。若模型本身已经会学习复杂关系,手工添加是否有用也需要重新检查。对一个简单线性模型有帮助的特征,对另一个模型可能只是重复计算。

八、升维也改变了距离和内积

特征映射不仅影响能画出什么边界,也会改变记录之间怎样比较。如果后续用距离寻找相似记录,新增一列就会参与距离计算;“保留了原输入”并不表示“原来近的关系原样保留”。

仍用 ,偏差0与1在原坐标中相距1,偏差2与3也相距1。但前一对映射成 与 ,后一对映射成 与 。在新空间里,后一对的平方特征变化大得多。

按普通欧氏距离计算,两对分别相距 和 。这不是小叶多发现了一次设备变化,而是所选表示对较大偏差的差别更敏感。对于需要着重区分大偏离程度的任务,这可能合适;如果只是想保持原偏差上的均匀差别,这种距离就已经改变了比较标准。

同样,在其他列不变时,把某一列的数值按绝对值大于1的倍数放大,会让它在普通欧氏距离和内积中占更大权重。机器学习中的“相似”,经常是经过某种表示和度量后得到的结果。看见AI给出一组近邻时,可以进一步追问:用了哪些特征,怎样缩放,这个近究竟对应什么差别较小?

有些方法不显式列出全部新坐标,而是直接计算升维后的内积。为看清这件事,另定义一个稍有不同的映射:

这里 是两条不同记录的偏差,点号表示对应坐标相乘再相加。中间坐标特意乘 ,是为了让两个中间坐标相乘后恰好得到 ,与右边平方展开一致。它不是前面的未缩放映射,比较方式也随之不同。

比如比较偏差2与3,逐坐标做内积会得到49;直接用右边的规则也得到49。右边接收两个原输入,却返回它们在指定特征空间的内积。这种函数是核函数的一种实例,相关计算思路常称为核技巧。重点是某些算法只需要内积,因此可以把“先展开再比较”合成一步。

49在这里不是“相似度49%”,也不是概率;这个核的输出没有被限制在0到1之间。本章不展开核分类器,只借这个等式说明:高维表示有时可以通过运算关系来使用,未必先存成一张很宽的表。对显式特征映射及其近似方法,可进一步查看scikit-learn的核近似介绍。

九、更多候选表达,为什么也会带来更多困难

从两个字段扩成六列似乎很轻松。但如果设备已经记录100个字段,把所有二次项都加进去,表会宽得多。先不谈算法时间,只数需要提供多少列。

设原字段有 个。不超过二次的完整展开,包括1个常数列、 个原字段、 个平方项,以及不同字段两两相乘的交互项。交互项的数量是 :每个字段可以与其他字段配对,但一对只能计一次。总列数因此为:

这个式子记录的是候选表达的增长。4个原字段会展开为15列;100个原字段会展开为5,151列。200条记录原本只有20,000个数值位置,展开后变成1,030,200个。数据行数还是200,只是为每一行安排了更多描述。

如果允许每一列各有一个待估计权重,需要根据200条结果确定的参数却超过了5,000个。在线性预测模型中,若不另外限制这些参数,仅靠200条记录无法唯一确定5,151个自由系数。这并不自动证明模型不能用;有些算法会采用最小范数、惩罚等额外选择规则,给出确定的参数,但这与数据本身已经排除其他解释是两回事。

更微妙的是,有些特征在已有输入范围内非常相近。比如所有偏差都只在1附近小幅变化,平方关系在这段小范围里可以很接近一条直线。模型可能难以分清效果究竟应归到原偏差还是平方偏差,少量测量变化就会让各列权重明显变动。矩阵的秩即使在数学上足够,估计也可能不稳定。

提高次数还会放大数值尺度差异。原偏差较大时,高次幂的数值很快增长,运算和参数比较都会更敏感。先用合适的基准和尺度表示输入,通常能改善计算条件,但缩放不能凭空提供缺少的样本,也不能证明每个新项都有任务价值。

小叶可以据此把“全部组合一次”改成有目的的比较:先保留原列,再加入平方,接着只加入有理由的交互项。每增加一类表示,都看它解决了什么误差,又引入多少参数和维护工作。必要时使用限制复杂度的方法,或者增加覆盖关键状态的数据。A12讨论损失与优化时,会再解释怎样把拟合目标和复杂度要求放在一起。

最重要的检验仍然是:旧数据上多得到的灵活性,是否在新情形里继续有用。下面把这个问题实际算一次。

十、一次标定实验:旧点全部对上,为什么反而选错

小叶现在另做设备标定,任务从“判正常或异常”改为“预测响应有多大”。输入仍用无量纲偏差 ,输出 是一种教学响应刻度。为看清噪声的影响,我们事先设定真实关系是 ,但拟合程序只得到测量表,不得到这条真实公式。

五个训练偏差取−2、−1、0、1、2。除了中心点故意加上0.2的测量扰动,其余点与真实关系相同:

偏差 无扰动响应 提供给拟合的响应
−2 5 5
−1 2 2
0 1 1.2
1 2 2
2 5 5

小叶比较三个模型:只用常数与一次项;加入平方项;一直加到四次项。它们都用同一种办法选参数,让五条训练记录的预测误差平方之和尽可能小,这叫最小二乘拟合。平方让正负误差不会互相抵消,也让较大的偏差在比较中占更大分量。

这里的平方有两种不同用途:把输入平方是在构造特征,把预测误差平方是在规定怎样评价拟合。两者可以独立选择。一次模型也能用平方误差拟合,二次模型也可以配别的评价准则,不要因为它们都出现“平方”就认为是同一项操作。

计算后,一次模型几乎是一条水平线,预测值始终约3.04;二次模型约为 ;四次模型为 。数据左右对称,所以这些拟合中的奇次项系数为零,数值计算可能留下非常接近零的舍入结果。

一次模型无法同时跟随中间低、两端高的关系,这是欠拟合:所允许的表达不足以描述这里的重要变化。平方特征给二次模型提供了需要的弯曲形状,它已经能靠近整体趋势。

四次模型更加灵活,能精确穿过五个训练点,包括中心那个被扰动的1.2。如果只看训练误差,小叶一定会选它。但这份完美对应部分来自对测量扰动的追随,不代表对设备真实关系理解得更好。

怎么知道?另外取四个没有用于拟合的偏差−1.5、−0.5、0.5、1.5,作为本次模型选择的验证点。为隔离训练噪声的影响,这四点的验证响应按教学真实关系生成,不加扰动。它们位于原采样点之间,可以查看模型在没有见过的位置怎样预测。

把每点的预测误差平方后求平均,得到均方误差,简称MSE。训练MSE与验证MSE分别比较各自那批记录,样本数不同也各自除以自己的数量。它衡量平均平方偏差,单位是响应刻度的平方;在本例同一刻度下,数值越小,表示这批预测总体上越接近给定响应。

模型 使用的最高次数 训练MSE 验证MSE
一次 1 2.646400 1.624100
二次 2 0.004114 0.004590
四次 4 0,数值计算接近0 0.015869

四次模型在训练点上没有误差,却在这些验证点上比二次模型误差更大。这就是本例中过拟合的具体证据:增加的灵活性更贴近已见测量,也跟随了不应当推广的扰动,换到未见位置反而较差。

三种特征展开的拟合曲线及训练验证误差比较
图 A10-03|三种特征展开的拟合曲线及训练验证误差比较

四次模型为什么会把一个中心点的测量扰动带到其他位置?用 表示它在偏差 处的预测,将这个预测与真实响应相减,可写成:

这个误差在原来四个无扰动训练位置上恰好为零,因此不妨碍模型穿过它们;在中心则恰好抬高0.2,对上那次有扰动的测量。但这个乘积在其他位置未必为零,曲线为了对上中心点而作的改变,也延伸到了训练点之间。额外特征并没有只修正一条孤立记录,它改变的是一整条预测函数。

下面的短程序复现比较。vander 生成从常数到指定最高次数的各列,increasing=True 让列按次数递增。lstsq 求误差平方和最小的一组系数,返回值的第一项是系数向量;@ 再把特征表与系数相乘,得到预测。

可复制模板
import numpy as np

train_t = np.array([-2., -1., 0., 1., 2.])
train_y = np.array([5., 2., 1.2, 2., 5.])
valid_t = np.array([-1.5, -0.5, 0.5, 1.5])
valid_y = 1 + valid_t ** 2

for degree in [1, 2, 4]:
    train_x = np.vander(train_t, degree + 1, increasing=True)
    valid_x = np.vander(valid_t, degree + 1, increasing=True)
    weights = np.linalg.lstsq(train_x, train_y, rcond=None)[0]
    train_mse = np.mean((train_x @ weights - train_y) ** 2)
    valid_mse = np.mean((valid_x @ weights - valid_y) ** 2)
    print(degree, round(train_mse, 6), round(valid_mse, 6))

输出与表中六位小数一致。最小二乘函数的输入与求解含义见NumPy官方说明;不同次数在噪声数据上可能出现的欠拟合和过拟合,可参考scikit-learn的官方演示。本章的数据、函数和比较是另行设计的教学实验。

这个实验支持在当前候选中优先继续验证二次模型,没有证明二次永远最好。真实项目一般看不到无噪声公式,验证值也可能含测量误差;需要按应用分布取得更多独立记录。若用这四点选择了模型,它们就已参与模型选择,不能再把同一次分数当成完全独立的最终效果证明。

还应分开看插值范围内预测与外推。前面的验证点都在−2到2之间;如果设备可能运行到偏差3,已超出训练覆盖范围。此处真实响应为10,二次模型约预测9.84,四次模型预测12。它说明高次项在外部可能放大差别,但实际设备的外部规律仍要另取数据检验,不能拿范围内部的准确度替代。

十一、同一套特征规则,必须一直指同一件事

小叶已经选出一个可继续检验的表示,接下来还要保证新记录采用相同含义的坐标。如果训练时的“偏差”以20为基准,使用时却换成最近一批数据的平均读数,模型接收的虽然仍是一列数字,它代表的已经不是原来的偏差。

回到最初异常任务,原读数24按规定换算为偏差2,平方偏差4,刚好在正常边界。如果后来一批读数集中在24附近,程序擅自以24为中心,同一读数就会变成偏差0、平方0。模型看到的已经从“处于边界”变成“完全没有偏离”。再高一些的异常读数也可能因此被移进正常范围。

问题不在于重新计算平均值这件事始终错误,而在于基准改变了判断的含义。确实要改用相对近期状态的异常标准,就需要把新任务、转换参数和判别规则一起重新设计和验证。不能悄悄改变转换规则,却继续解释为对原正常值的偏离。

本章最初的20与2是事前规定的基准和尺度。如果在别的任务里,中心和尺度要从训练数据估计,那么对验证及以后输入应复用这组估计;只依据训练数据确定转换,才能保持评估边界。对平方等无需估计参数的固定公式,可以直接复用公式,但哪些项值得保留仍然是模型选择的一部分。

训练和使用还要保持列的顺序、单位、缺失值处理一致。如果原字段换了单位,却没有相应调整基准、尺度或权重,得到的不会自动是同一个预测。尤其在包含平方与交互项时,一处原字段定义变化会同时影响多个派生字段。把输入说明、转换规则、估计出的转换参数与模型权重一起保存,才能知道新记录实际经过了什么计算。

还有一种更隐蔽的失效:小叶为了预测是否需要维修,把“维修后是否恢复”也放进特征表。这一列也许与结果高度相关,却在作出预测的时刻还不存在。它不是通过升维挖出的能力,而是提前使用了当时拿不到的答案线索。评估时见过、实际使用时得不到的信息,会使效果显得过于乐观。scikit-learn关于预处理一致性和数据泄漏的说明给出了这些问题的操作示例。

十二、回到小叶的选择:决定增加什么,也决定保留什么

现在可以给开头的设备检查一个具体安排。单探头按既定范围判断异常,用绝对偏差或平方偏差都能把两端放进同一种规则。若选平方特征,小叶仍保留原偏差,既能判异常,又能在后续报告中说明偏高还是偏低。这个阶段可以直接实现已经给定的规则;以后要从样本中确定未知关系时,再考虑拟合参数。

双探头要识别同向或反向,乘积表达的是当前目标真正需要的配合关系;只给两个原字段分别加权再调门槛,无法解决四种状态的交错。小叶可以把乘积纳入表示,同时保留两个原字段,方便以后追查各探头的具体变化。

对于另做的响应预测实验,结果支持先保留到二次的特征,继续采集未见输入进行验证。四次模型的训练分数更漂亮,却没有在当前验证中获益,所以不以训练点全部对上作为升级理由。若未来验证发现二次表达遗漏了稳定关系,再根据错误出现的位置与条件决定增加什么。

这三个决定对应同一条思路:先指出现有表示和模型在哪一步不够用,再构造能表达那种关系的特征,最后用与任务相符的结果检验它。维数是描述方法的一个性质,不能代替任务价值的判断。

以后让AI协助处理资料、设计预测系统或检查模型建议时,小叶可以把要求写得更具体:保留哪些原始区别;新增的每列代表什么;哪些内容只是由原数据计算得到;参数使用怎样的列顺序;改动是否改善未见数据上的结果。这样,讨论就从“要不要更高维”落到“哪些关系值得让系统看见,以及看见之后是否真的更好用”。

练习与参考分析

练习一:同一程度,两个不同方向

小叶改为以50为正常基准,每5个读数单位记作1个偏差单位,仍规定绝对偏差超过2才异常。读数35和65分别如何表示?只留下平方偏差,能完成异常判断和偏离方向报告吗?

参考分析: 两条读数分别得到偏差−3和3,升维表示为 与 ,都满足平方偏差大于4,因此都异常。若只存9,仍能完成当前异常判断,但无法说明一条偏低、一条偏高。这里不需要争论“平方是否是好特征”,应按两个输出要求分别判断;保留原偏差可以同时满足它们。新的基准和尺度要明确记录,不能沿用正文中20和2的换算参数。

练习二:非线性依赖是否一定造成线性冗余

小叶只有偏差−2和2两种输入,记录了常数列、偏差列和平方列。三列的秩是多少?后来新增偏差0的记录,为什么结论改变?这是否意味着新设备突然多了三个独立测量来源?

参考分析: 原来平方列总为4,是常数列的4倍。常数列与偏差列线性无关,因此两行三列表的秩为2。加入偏差0以后,平方列的新增值为0,不能再保持常数列4倍的关系。三个不同输入支持三列线性无关,秩为3。可以沿正文的系数为零检查:中间记录先确定常数系数,再由正负两端确定另外两个系数。变的是样本使这些函数可区分的程度,原观测仍只有一个偏差变量,平方仍由它计算得到。

练习三:换了任务,原来合适的特征还够不够

两个探头原来只需判断同向或反向,小叶只存乘积。后来任务改为“任一探头的绝对偏差超过2就标记”。记录 与 能否仅凭乘积区分?如果增加两个平方列,怎样表达新判断?

参考分析: 两条记录的乘积都为3,但第一条有一个探头超过2,第二条没有,恰好等于2不算超过。仅凭乘积无法区分。保留原字段以后,可直接判断绝对偏差;若使用平方列,可判断两个平方中是否任一个大于4。两条记录的平方组合分别是 和 ,足以完成新目标。注意“任一超过”与“平方和超过某门槛”不是同一个标准,不能未经检查就把它们互换。

练习四:把一列复制十次,算不算有用的升维

小叶把原偏差复制成十个相同的字段,交给一个带截距的线性打分模型。特征维数增加了,它能否因此解决正文开头的两端异常问题?如果在复制后的表示上直接算欧氏距离,会发生什么?

参考分析: 十列分别加权后相加,只相当于把十个权重合成一个总权重,再乘原偏差。规则仍然是一条原偏差上的仿射阈值,没有增加需要的非线性表达,因此解决不了两端异常。十列也彼此线性相关。在普通欧氏距离下,同一差值被计入十次,距离变为原来绝对差值的 倍。这里只有一个原字段,所有两点距离同乘这个倍数,不改变近邻的排序;若只复制多字段中的某一列,就会改变各字段的相对权重,排序也可能改变。

练习五:训练误差更小,要不要立即升级

在正文的标定实验中,四次模型训练误差为零,而二次模型不为零。小叶的同学建议先选四次,再把那四个验证点也加入训练,使模型进一步贴近它们。这个过程之后,还能用原来的四点报告最终效果吗?如果真实响应恰好具有稳定的四次关系,又应怎样判断?

参考分析: 原实验的验证结果支持二次模型;训练误差为零没有推翻这项证据。把验证点加入训练可以作为后续重新拟合的一种安排,但这些点已经参与选择和拟合,不能再充当完全未见的最终检验。需要另保留符合实际使用分布的数据。若真实关系确实需要四次表达,四次模型可能优于二次,本文没有排除这种情况。应该让独立验证、输入覆盖和误差分析提供证据,而不是把某个次数固定成“先进”或“过度”的标签。

练习六:不把高维表写出来,也能比较吗

用正文的映射 比较偏差−1和2。分别通过显式内积和 计算。若误用未缩放的 ,结果是否相同?这些数值能直接当作相似概率吗?

参考分析: 正确映射的内积为 ,直接计算核函数得到 ,两种途径相同。未缩放映射的内积却是 ,因为中间坐标的权重改变了。核等式对应一套确定的映射,不能随意省掉缩放系数。两个结果都不能直接当作相似概率;本题结果碰巧较小,也不改变这个函数在其他输入下可能大于1的事实。使用时应说明比较规则的含义,而不是给任意内积加上百分号。