【数据挖掘 06】特征工程快速入门



1. 特征工程

特征工程是为机器学习创建新输入特征的过程,是改进预测模型的最有效方法之一。
【数据挖掘 06】特征工程快速入门

标准的机器学习流程

Data preparation accounts for about 80% of the work of data scientists.

【数据挖掘 06】特征工程快速入门

1.1 什么是特征工程?

特征工程是一种从现有特征创建新的输入特征以改善模型性能的方法。

可以将数据清洗视为减法过程,将特征工程视为加法过程。这通常是数据科学家可以提高模型性能的最有价值的任务之一,其原因有三点:

  • 可以隔离并突出显示关键信息,这有助于您的算法将“重点”放在重要的方面。
  • 可以引入自己的领域专业知识。
  • 可以引入其他领域的专业知识。

1.2 什么不是特征工程?

一般来说,以下过程不被认为是特征工程:

  • 原始数据收集;
  • 目标变量构建;
  • 删除重复项,处理缺失值,异常值;
  • 数据缩放(标准化,归一化);
  • 特征选择或PCA;

2. 常用方法

通常可以通过利用有关域的专业知识来构造特征。

2.1 指标变量

第一类特征工程涉及使用指标变量来隔离关键信息。以房价预测数据集为例,房价在2012年前后是完全不同的趋势,如果觉得在2012年前后房屋价格会影响之后的预测,则可以创建一个指标变量,该变量可以是0或1的二元变量。如果观察值满足特定条件,它们对于隔离关键属性非常有用。

【数据挖掘 06】特征工程快速入门

  • 来自阈值的指标变量:假设研究美国消费者的饮酒偏好,并且数据集有年龄特征。可以为 年龄 >= 21 创建指标变量,以区分超过法定饮酒年龄的受试者。
  • 来自多个特征的指标变量:假设预测房屋价格,并且具有 n_bedroomsn_bathrooms 特征。如果带有2张床和2个浴室的房屋作为租赁物业溢价,可以创建一个指标变量进行标记。
  • 特殊事件的指标变量:假设为电子商务网站的每周销售额建模。可以在黑色星期五和圣诞节的一周中创建两个指标变量。
  • 类别组的指标变量:假设分析网站转化,并且数据集具有分类特征 traffic_source。可以通过标记流量来源值为 Facebook AdsGoogle Adwords 的观察值来为 pay_traffic 创建指标变量。

2.2 创建交互特征

启发式方法中的另一个是检查是否可以创建任何有意义的交互特征。这些是两个或多个特征的组合,可以是乘积,总和或两个特征之间的差异。在某些情况下,交互特征必须是两个变量之间的乘积。

例如:

  • 假设已经有 "num_schools" 特征,即距酒店5英里范围内的学校数量。
  • 假设还具有 "median_school" 特征,即那些学校的中位质量得分。
  • 但是,可能真正重要的是:有许多学校选择,并且学校质量很高。
  • 那么,可以简单地创建一个新的特征 "school_score" = "num_schools" × "median_school"

此外,

  • 两个特征的和:假设希望根据初步销售数据预测收入。有特征 sales_blue_penssales_black_pens。如果只关心总体 sales_pens,则可以融合这些特征 。
  • 两个特征之间的区别:有特征 house_built_datehouse_purchase_date,可以利用它们的差异来创建特征 house_age_at_purchase
  • 两个特征的乘积:假设运行定价测试,并且具有特征价格 和指标变量,可以将他们的乘积来创建特征收益。
  • 两个特征的商:有一个具有 n_clicksn_impressions 特征的市场营销活动数据集 。可以按点击数对展示次数进行划分,以创建 click_through_rate,从而可以比较不同数量的广告系列。

2.3 特征表示

此类特征工程很简单,但是很有影响力。

数据不一定总是理想的格式。应该考虑是否可以通过以不同的方式表示相同的特征来获取信息。

  • 日期和时间特征:假设有 purchase_datetime 特征 。提取 purchase_day_of_weekpurchase_hour_of_day 可能更有用 。也可以汇总创建特征,如 purchases_over_last_30_days

  • 数字到分类的映射:有特征 years_in_school。可以使用“小学”, “中学”和 “高中”等课程来创建新的特征等级。

  • 结合稀疏类
    该启发式方法是将稀疏类分组。稀疏类(按分类特征)是那些总观察很少的类。对于某些机器学习算法,它们可能会出现问题,导致模型过拟合。

    • 对于每个类需要多少没有正式的规定。
    • 它还取决于数据集的大小和其它特征的数量。
    • 根据经验,建议组合类别,直到每个类至少有50个观察值。与任何“经验法则”一样,将其用作指导原则(实际上不是作为规则)。
      看一下房地产示例:
      【数据挖掘 06】特征工程快速入门
      首先,可以对相似的类进行分组。在上图中,“exterior_walls” 特征中具有多个非常相似的类。可能希望将 “Wood Siding”,“Wood Shingle” 和 “Wood” 分为一个类,假设都标记为 “Wood”。接下来,可以把其余的稀疏类标注为 “Other” 类,即使有已经是一个"Other" 类。将 ‘Concrete Block’, ‘Stucco’, ‘Masonry’, ‘Other’, ‘Asbestos shingle’ 类标注为 ‘Other’。下图是重新划分类别后的类分布:
      【数据挖掘 06】特征工程快速入门
      组合稀疏类后,单一类减少了,但每个类都有更多的观察值。
  • 添加虚拟变量
    大多数机器学习算法无法直接处理分类特征。具体来说,它们无法处理文本值。因此,需要为分类特征创建虚拟变量。虚拟变量是一组二进制(0或1)变量,每个变量代表分类特征中的单个类。在上面的示例中,在将稀疏类分组之后,剩下了8个类,它们转化为8个虚拟变量(第三列描述了一个使用 Brick 进行观察的样本):

【数据挖掘 06】特征工程快速入门

  • 删除未使用的特征
    最后,从数据集中删除未使用或多余的特征。未使用的特征是那些没有意义的特征。示例包括:
    • ID;
    • 预测时将不可用的特征;
    • 其他文字说明;

冗余特征通常是那些已在特征工程期间添加的其它特征所取代的特征。


2.4 外部数据

特征工程还可以引入外部数据,这可以实现一些最大的性能突破。例如,量化对冲基金进行研究的一种方法是将不同的财务数据流分层在一起。

引入外部数据可以使许多机器学习问题受益。这里有些例子:

  • 时间序列数据:关于时间序列数据的好处是,只需要一个特征(某种日期形式)即可从另一个数据集中插入特征。
  • 外部API:有很多辅助创建特征的API。例如,Microsoft Computer Vision API 可以从图像返回人脸数。
  • 地理编码:假设有 street_addresscitystate。可以将它们为纬度和经度。这将允许借助另一个数据集来计算诸如局部人口统计信息(例如,median_income_within_2_miles)之类的特征。
  • 相同数据的其他来源:可以通过多种方式跟踪广告活动,Google Analytics(分析)以及其他第三方软件,每个来源都可以提供其他来源无法跟踪的信息。另外,数据集之间的任何差异都可能是有益的(例如,一个来源忽略而另一个来源保留的漫游器流量)。

2.5 误差分析(建模后)

错误分析的过程是在训练模型之后执行的。误差分析是一个广义术语,是指分析模型中分类错误或误差较大的观测值,并决定下一步的改进措施。

可能的后续步骤包括收集更多数据,分解问题或设计可解决错误的新功能。要将错误分析用于特征工程,需要了解为什么模型没有标记。

这是如何做:

  • 从更大的错误开始:误差分析通常是手动过程,没有时间仔细检查每个观察结果,建议从错误分数更高的那些开始,寻找可以形式化为新特征的模式。
  • 按类别细分:另一种技术是细分观察结果,并比较每个细分中的平均误差。可以尝试为误差最大的细分创建指标变量。
  • 无监督聚类:如果在发现模式上遇到麻烦,则可以对分类错误的观测值运行无监督聚类算法。不建议盲目地将这些集群用作新特征,但是它们可以使发现模式更加容易。请记住,目标是了解为什么观察结果会被错误分类。
  • 向同事或领域专家咨询:这是对其他三种技术的极大补充。如果发现性能不佳的模式(例如,通过细分),但还不了解原因,则询问域专家尤其有用。

3. 两个实例

假设我们得到了一个数据“飞行日期时间与状态”。然后,根据日期时间数据,预测航班的状态。
【数据挖掘 06】特征工程快速入门
由于航班状态取决于一天中的小时,而不取决于日期时间。我们将创建新特征 Hour_Of_Day。使用 Hour_Of_Day 特征,由于该特征与航班状态直接相关,因此机器会学得更好。
【数据挖掘 06】特征工程快速入门
在这里,创建新的特征 Hour_Of_Day 就属于特征工程。

让我们来看另一个例子。假设我们给定了标签 Price_Of_House 的纬度,经度和其他数据,预测该地区房屋的价格。如果单独使用纬度和经度,则没有任何用处。因此,这里我们将使用交叉特征工程。我们将纬度和经度结合起来以构成一个要素。合并为一个特征将有助于模型更好地学习。

在这里,结合两个特征以创建一个有用的特征就是特征工程。

有时,我们使用存储桶式(bucketized column)列特征工程。假设我们得到一个数据,其中一列是年龄,输出是分类(X,Y,Z)。通过查看数据,我们意识到输出(X,Y,Z)取决于年龄范围,例如11-20岁的年龄范围输出到X,21-40岁的输出到Y,41-70岁的输出到 Z。在这里,将为11-20岁,21-40岁和41-70岁的年龄段创建3个存储桶。我们将创建一个新功能,即具有数值1、2、3的存储桶列“ Age_Range,其中1映射到存储桶1,2映射到存储桶2,3映射到存储桶3。

在这里,创建 Age_Range 存储桶是要素工程。

有时,删除不需要的功能也是功能工程。由于不相关的功能会降低模型的性能。


完成数据清洗和特征工程之后,已将原始数据集转换为分析基本表(analytical base table,ABT),这是要建模的基础。

关键是选择机器学习算法,算法可以在许多选项(内置特征选择)中自动选择最佳特征。尽管提供了许多输入功能,但这将尽可能避免模型过拟合。


参考:
https://elitedatascience.com/feature-engineering
https://elitedatascience.com/feature-engineering-best-practices
https://medium.com/mindorks/what-is-feature-engineering-for-machine-learning-d8ba3158d97a