特征工程是为机器学习创建新输入功能的过程,是改进预测模型的最有效方法之一。
提出功能很困难,耗时,需要专业知识。“应用机器学习”基本上是特征工程。~Andrew Ng
通过功能工程,您可以隔离关键信息,突出显示模式并引入领域专业知识。
不出所料,它很容易被卡住,因为功能工程是如此开放。
在本指南中,我们将讨论20个最佳实践和启发式方法,它们将帮助您浏览特征工程。
什么是特征工程?
特征工程是一个非正式主题,有许多可能的定义。机器学习工作流程是流动和迭代的,所以没有人“正确答案”。
我们将在第4章:数据科学入门的特征工程(在新窗口中打开)中更详细地解释我们的方法。
简而言之,我们将特征工程定义为 从现有特征创建新特征以提高模型性能。
典型的数据科学过程可能如下所示:
- 项目范围/数据收集
- 探索性分析
- 数据清理
- 特征工程
- 模型培训(包括调整超参数的交叉验证)
- 项目交付/见解
什么是非特征工程?
这意味着我们不考虑将某些步骤作为特征工程:
- 我们不认为初始数据收集是特征工程。
- 同样,我们不考虑将目标变量创建为特征工程。
- 我们不考虑删除重复项,处理缺失值或将错误标记的类修复为特征工程。我们把这些放在数据清理下。
- 我们不认为缩放或规范化是特征工程,因为这些步骤属于交叉验证循环(即在您已经构建了分析基表之后)。
- 最后,我们不认为特征选择或PCA是特征工程。这些步骤也属于交叉验证循环。
同样,这只是我们的分类。合理的数据科学家可能不同意,这完全没问题。
有了这些免责声明,让我们深入了解最佳实践和启发式方法!
指标变量
第一种类型的特征工程涉及使用指示符变量来隔离关键信息。
现在,你们中的一些人可能会想,“难道一个好的算法不应该自己学习关键信息吗?”
好吧,并非总是如此。这取决于您拥有的数据量和竞争信号的强度。您可以通过事先突出显示它来帮助您的算法“专注”重要事项。
- 来自阈值的指标变量:假设您正在研究美国消费者的酒精偏好,并且您的数据集具有 年龄 特征。您可以为年龄> = 21 创建指标变量, 以区分超过法定饮酒年龄的受试者。
- 来自多个功能的指标变量: 您正在预测房地产价格,并且您具有n_bedrooms 和n_bathrooms的功能 。如果拥有2张床和2个浴室的房屋作为出租房产获得溢价,您可以创建一个指示变量来标记它们。
- 特殊事件的指标变量: 您正在为电子商务网站的每周销售建模。您可以为黑色星期五和圣诞节创建两个指标变量。
- 类组的指标变量:您正在分析网站转换,而您的数据集具有分类功能 traffic_source。您可以 通过使用“Facebook广告” 或 “Google Adwords”的流量来源值标记观察结果 来为paid_traffic创建指标变量 。
互动功能
下一类特征工程涉及突出显示两个或多个特征之间的交互。
您是否听过这句话,“总和大于部分?”嗯,有些功能可以结合起来提供比个人更多的信息。
具体而言,寻找机会获取多个特征的总和,差异,产品或商。
*注意:我们不建议使用自动循环来为您的所有功能创建交互。这导致“特征爆炸”。
- 两个特征的总和:假设您希望根据初步销售数据预测收入。您具有sales_blue_pens 和sales_black_pens的功能 。如果您只关心整体sales_pens,可以对这些功能进行 总结。
- 两个功能之间的区别:您具有 house_built_date 和 house_purchase_date功能。您可以通过他们的不同来创建功能 house_age_at_purchase。
- 两个功能的产品:您正在运行定价测试,并且您具有功能 价格 和指标变量 转换。您可以使用他们的产品来创建功能 收入。
- 两个功能的商数:您有一个营销活动的数据集,其中包含 n_clicks 和 n_impressions功能。您可以按展示次数划分点击次数以创建 click_through_rate,从而可以比较不同数量的广告系列。
特征表示
下一种类型的特征工程既简单又有影响力。它被称为特征表示。
您的数据并不总是理想的格式。您应该考虑是否通过以不同方式表示相同功能来获取信息。
- 日期和时间功能: 假设您具有purchase_datetime功能 。提取purchase_day_of_week 和purchase_hour_of_day可能更有用 。您还可以聚合观察以创建诸如purchases_over_last_30_days之类的功能。
- 数字到分类映射:您具有years_in_school功能 。您可以 使用“小学”, “中学”和 “高中”等课程 创建新的功能 等级。
- 对稀疏类进行分组:您具有许多具有低样本计数的类的功能。您可以尝试对类似的类进行分组,然后将剩余的类分组为单个 “其他” 类。
- 创建虚拟变量:根据您的机器学习实现,您可能需要手动将分类特征转换为虚拟变量。在对稀疏类进行分组之后,您应该始终执行此操作 。
外部数据
未充分利用的特征工程类型正在引入外部数据。这可以带来性能方面的一些最大突破。
例如,单向量化对冲基金进行研究的方法是将不同的金融数据流分层。
许多机器学习问题可以从引入外部数据中受益。这里有些例子:
- 时间序列数据:关于时间序列数据的好处是,您只需要一个特征,某种形式的 日期,来分层来自另一个数据集的特征。
- 外部API:有很多API可以帮助您创建功能。例如,Microsoft Computer Vision API可以返回图像中的面数。
- 地理编码:让我们说你有 street_address, city和 state。那么,你可以将 它们地理编码为 纬度 和 经度。这将允许您在另一个数据集的帮助下计算诸如本地人口统计特征(例如,median_income_within_2_miles)之类的功能。
- 相同数据的其他来源: 您可以通过多少种方式跟踪Facebook广告系列?您可能拥有Facebook自己的跟踪像素,Google Analytics以及可能还有其他第三方软件。每个来源都可以提供其他人不跟踪的信息。此外,数据集之间的任何差异都可能提供信息(例如,一个来源忽略而另一个来源保留的机器人流量)。
错误分析(后建模)
我们将介绍的最终类型的特征工程属于一个称为错误分析的过程。这是在 训练您的第一个模型后执行的 。
错误分析是一个广义的术语,指的是分析模型中错误分类或高错误的观察结果,并决定您的下一步改进措施。
可能的后续步骤包括收集更多数据,拆分问题或设计解决错误的新功能。要将功能工程使用误差分析,你需要明白 ,为什么 你的模型错过了标记。
就是这样:
- 从较大的错误开始:错误分析通常是手动过程。你没有时间仔细检查每一个观察结果。我们建议从错误分数较高的那些开始。寻找可以形式化为新功能的模式。
- 按类别划分:另一种技术是对观察结果进行细分,并比较每个细分中的平均误差。您可以尝试为具有最高错误的段创建指示符变量。
- 无监督聚类:如果您在查找模式时遇到问题,可以对错误分类的观察值运行无监督聚类算法。我们不建议盲目地将这些群集用作新功能,但它们可以更容易地发现模式。请记住,目标是理解 为什么观察被错误分类。
- 询问同事或领域专家:这是对其他三种技术的很好补充。如果您已经确定了性能不佳的模式(例如通过分段)但是尚不明白原因,那么询问领域专家会特别有用。
结论
如您所见,功能工程有很多可能性。我们已经介绍了20种最佳实践和启发式方法,但它们并非详尽无遗!
当您开始自己尝试时,请记住这些一般准则:
工程师的好功能......
- 可以计算用于将来的观察。
- 通常是直观的解释。
- 通过领域知识或探索性分析获知。
- 必须具备预测潜力。不要只是为了它创建功能。
- 切勿触摸目标变量。这是一个初学者有时陷入的陷阱。无论您是创建指标变量还是交互功能,都不要使用目标变量。这就像“作弊”,它会给你带来非常误导的结果。
最后,如果现在感觉压倒一切,请不要担心!通过实践和经验,您自然会在功能工程方面变得更好。
原文链接:https://elitedatascience.com/feature-engineering-best-practices