单位 5 / 11

特征工程:生成变体、编码、缩放和避免泄漏

收益:

  • 能够利用领域知识生成有意义的派生特征,并使用适当的方法(one-hot、标签、目标)对分类类别进行编码
  • 能够根据模型类型(标准化、归一化)缩放数值变量并避免不必要或不完整的缩放
  • 能够通过在训练/测试分割后并且仅从训练中学习所有转换来避免特征泄漏

机器学习中有一句老话:“应用机器学习本质上是特征工程。”因为模型的成功往往取决于您为模型提供的输入,而不是您选择的算法。特征工程是从原始数据中生成有意义的信号以供模型学习的艺术。人工智能在这个阶段是丰富的想法来源:当你问“可以从这些数据中产生什么特征”时,它列出了数十条建议。但这些建议有些可能是有价值的,有些可能是无用的,有些可能是危险的(泄漏)。你的工作就是解决这个问题。

为什么要进行特征工程

原始数据很少以最佳形式进入模型。虽然“出生日期”列本身没有意义,但由它生成的“年龄”值是一个强烈的信号。您可以从“订单时间戳”中提取“星期几”、“日/夜”、“是否是假期”等属性。您可以组合两列来生成比率(“债务/收入比率”)。这里,特征工程正在将领域知识转化为数学信号;这就是为什么它是最需要人类智慧的阶段。

将分类变量转换为数字:编码

模型通常使用数字,而不是文本。将分类变量(例如城市、颜色、产品类型)转换为数字称为编码。三种常用方法:

One-hot 编码:为每个类别打开一个值为 0/1 的单独列。 “城市”为伊斯坦布尔、安卡拉、伊兹密尔纵队;如果客户来自伊斯坦布尔,则只有该列将为 1。类别数量较少时理想;如果类别太多,则会产生数百列(这称为“大小爆炸”)。

标签编码:为每个类别提供一个数字(伊斯坦布尔=0,安卡拉=1)。这很简单,但它可能会意外地教会模型一个序列(例如安卡拉 > 伊斯坦布尔);因此在无序类别中谨慎使用。

目标编码:用该类别中目标变量的平均值替换每个类别。它非常强大,但也是最危险的泄漏源:如果考虑到测试数据的目标,模型就会看到未来。它应该仅根据训练数据并仔细计算(在交叉验证内)。

缩放:大数字不会淹没模型

一些模型(基于距离的模型、线性模型、神经网络)对变量的规模敏感。如果“收入”(0-500,000)和“年龄”(0-100)属于同一模式,那么收入可能会占据主导地位,因为它更大。缩放可以解决这个问题。两种常见的方法:标准化(将每个值转换为“距平均值有多少标准差”)和归一化(最小-最大归一化——将值压缩到 0-1 范围内)。基于树的模型(决策树、随机森林)对尺度不敏感,它们不需要缩放。

注意:缩放和编码参数(均值、标准差、类别均值映射)只能根据训练数据计算,然后同样应用于测试数据。包含测试数据是一种泄漏,会使您的模型看起来比实际情况更好。

特征工程中泄漏的核心

特征生成是数据泄漏最常发生的地方。两个典型的错误: 时间泄漏——生成包含未来信息的特征(包括计算“过去 30 天平均值”时预测日之后的天数)。统计泄漏——在训练/测试分割之前从所有数据中计算特征(缩放平均值、目标编码值)。规则:首先进行训练/测试分割后仅从训练数据中学习每个转换。定期执行此操作的最安全方法是使用管道 - 一种将所有转换收集在单个链中并在拆分后应用它们的结构。

方法

为了什么

泄漏风险

注释

独热编码

类别较少的变量

在多个类别中爆炸规模

标签编码

排序类别

乱序教导错误的顺序

目标编码

多品类,信号强

非常高

仅来自教育,在简历中

标准化

线性/距离模型

中等

参数仅取决于教育程度

时间窗功能

时间序列

添加未来

三个迷你箱子

案例 1——贵重财产。信贷团队根据原始的“月收入”和“月债务支付”列生成了“债务收入比”特征。这一衍生特征将模型准确率从 71% 提高到 79%;因为真正决定风险的是利率,而不是绝对收入。教训:由领域知识生成的比率是强信号。

情况 2 — 目标编码泄漏。一个团队将“邮政编码”转换为具有目标编码的数字(该区域的平均流失率),但在拆分之前根据所有数据进行了转换。该模型在测试集上的准确率为 94%,在生产环境中下降至 68%。 6周的努力白费了。教训:目标编码是在训练中小心完成的。

案例 3——缩放遗忘。一位分析师将收入(0-400,000)和客户年龄(18-75)输入到基于距离的模型中,而没有进行扩展。该模型几乎只考虑收入,消除了年龄效应。当添加缩放后,分段就变得有意义了。教训:在距离/线性模型中,缩放比例并没有被忽略。

四个可复制模板

1)功能创意生成(消除由你决定):

您的角色:特征工程助理。我的 df 列:出生日期、订单时间(时间戳)、收入_tl、债务_tl、城市、产品类别。目标:“贷款能偿还吗”(0/1)。建议可以从这些列中生成 15 个特征;指定每个泄漏的风险(低/中/高)。清楚地标记那些包含未来信息的内容。

2)安全编码(分割后):

编写对“city”和“product_category”进行one-hot 编码的代码。重要提示:仅将编码适合训练数据,然后转换测试数据(使用 sklearn OneHotEncoder)。解释一下你如何处理教育中看不见的类别(handle_unknown)。

3)使用Pipeline进行无泄漏转换:

设置 sklearn Pipeline:将 StandardScaler 应用于数字列,将 OneHotEncoder 应用于分类列,在末尾添加分类器。保证所有转换都是在训练/测试分割之后并且仅从训练中学习的。解释代码以及为什么它是无泄漏的。

4)时间窗功能(泄漏控制):

为每个客户生成“过去 30 天内的订单数”属性,但切勿包含预测日之后的数据。逐行解释代码并没有展望未来。我将提供参考日期栏。

弱提示/强提示

弱提示:

为该数据添加良好的属性。

“好”不明确,目标不明确,没有泄漏控制。人工智能生成随机的、可能是泄漏的特征。

强力提示:

您的角色:功能工程师。目标:“30 天内流失”(0/1),预计参考日期:save_date。 df.Task 中有交易历史记录:生成 8 个特征,针对 EACH 回答“我在预测时是否有此信息”的问题。在时间窗口特征中的参考日期之后添加日期。以管道兼容的方式编写代码,以便在训练/测试部分之后执行。

这里,从一开始就定义了目标、参考时间和泄漏控制。

常见错误

  • 在划分之前学习所有数据的变换。如果缩放/编码参数看到测试数据,则发生泄漏。
  • 不小心使用目标编码。它是最强大但最容易泄露的方法;仅来自训练和交叉验证。
  • 通过时间窗口功能添加未来。如果在预测日之后输入“最近 30 天”计算,则模型会预测未来。
  • 树模型中不必要的缩放和线性模型中不完全的缩放。缩放决策是根据模型类型做出的。
  • 毫无疑问地添加人工智能的每一个功能建议。建议可能包括无用和有漏洞的功能。
提示:为您生成的每个特征写下一个问题:“我可以使用做出预测时拥有的信息来计算这个值吗?”如果答案不是明确的“是”,请不要使用该功能。这一单一规则消除了大多数与功能相关的泄漏。

总之

特征工程是从原始数据生成有意义信号的艺术,通常比算法更能决定模型的成功。编码分类(one-hot、标签、目标)、缩放数值(标准化、归一化)以及利用领域知识生成衍生特征是基本工具。但这个阶段也是泄漏的核心:所有转换都必须在训练/测试分割之后并且只能从训练数据中学习。人工智能产生大量想法;区分有价值和危险的是人类的判断。

应用任务

选择一个目标变量并从您拥有的列中设计至少五个衍生特征。对于每一个问题,以书面形式回答“我在预测时是否有时间”,并消除至少一个“泄漏风险高”的问题。然后在管道中编码要在分区后实现的安全功能。

清单

  • [ ] 我是否在训练/测试拆分后应用了所有转换?
  • [ ] 我是否只从训练中学习缩放/编码参数?
  • [ ] 我是否回答了每个特征的“预测时是否有”问题?
  • [ ] 我是否对目标编码等高风险方法格外小心?
  • [ ] 我是否决定针对模型类型(树/线性)进行适当缩放?