译者 | 朱先忠
审校 | 重楼
引言
你一定听说过“garbage in, garbage out(输入的垃圾数据会导致输出的垃圾结果)”这句谚语,这句话在训练机器学习模型时确实适用。如果我们使用不相关的数据来训练机器学习模型,那么即使是最好的机器学习算法也无济于事。相反,即使使用简单的机器学习算法,使用精心设计的有意义的特征也可以获得卓越的性能。那么,我们如何才能创建这些有意义的特征,从而最大限度地提高我们模型的性能呢?答案是特征工程。
当使用传统的机器学习算法,如回归、决策树、支持向量机和其他需要数字输入的算法时,特征工程尤其重要。然而,创建这些数字输入可不仅仅是关于数据技能的问题。这是一个需要创造力和领域知识的过程,而且它拥有与科学一样多的艺术特征。
从广义上讲,我们可以将特征工程分为两个部分:1)创建新的特征;2)处理这些特征,使其在所使用的机器学习算法中进一步优化。在本文中,我们将讨论特征工程的这两个组成部分相关的跨区段、结构化、非NLP数据集等内容。
创建新特征
原始数据收集可能会让人筋疲力尽,而且在这项任务结束时,我们可能太累了,以至于无法投入更多的时间和精力来创建其他特征。但这正是我们必须抵制直接投入到模型训练的诱惑的地方。我向你保证,这种做法是非常有价值的!
在这个转折点上,我们应该停下来问问自己,“如果我根据我的领域知识手动进行预测,哪些特征会帮助我做好工作呢?”问这个问题可能会为我们的模型创造新的有意义的特征开辟可能性;否则,我们的模型可能会错过这些特征。一旦我们考虑了我们可能从中受益的其他特征,那么我们就可以利用以下技术从原始数据中创建新的特征。
1.聚合
顾名思义,这种技术可以帮助我们组合多个数据点,以创建更全面的视图。我们通常使用计数、求和、平均值、最小值、最大值、百分位数、标准差和变异系数等标准函数对连续数字数据进行聚合运算。每个函数可以捕获不同的信息元素,使用的最佳函数取决于具体的使用场景。通常,我们可以在特定的时间或事件窗口上应用聚合技术,这在特定问题的上下文中是极其有意义的。
让我们举一个例子,我们想预测给定的信用卡交易是否是欺诈性的。对于这个使用场景,我们无疑可以使用特定于交易的特征,但除了这些特征之外,我们还可以从创建聚合的客户级特征中受益,如:
- 客户在过去五年中成为欺诈受害者的次数:一个客户以前曾多次成为欺诈受害者,更有可能再次成为欺诈受害者。因此,使用这种聚合的客户级视图可以提供适当的预测信号。
- 最后五笔交易金额的中位数:通常,当信用卡受损时,欺诈者可能会尝试进行多次小数额交易来测试信用卡。现在,小数额交易非常常见,可能不是欺诈的迹象,但如果我们在短时间内连续看到许多此类交易,这可能表明信用卡受损。对于这样的情况,我们可以考虑创建一个将最后几笔交易金额考虑在内的聚合特征。
上图显示了单个交易金额情况。我们可以看到,孤立的小数额交易并不罕见,也不表明存在欺诈;然而,连续多次小数额交易却是欺诈的迹象。下图显示了最后五笔交易金额的滚动中位数,只有在存在多笔连续小数额交易的模式时,才会返回低值。在这种情况下,底部聚合视图可以使用交易金额作为特征来区分合法的小数额交易和存在欺诈的小数额交易事务。
2.差异和比率
在许多类型的问题中,集合模式的变化对于预测或异常检测是非常有价值的信号。其中,差异和比率是表示数字特征变化的有效技术。就像聚合一样,我们也可以在问题的上下文中在有意义的时间窗口内应用这些技术。
示例:
- 过去1小时内新商户交易的百分比与过去30天内新商户成交的百分比之间的差异:快速连续的高百分比新商户交易本身可能表明存在欺诈风险,但是,当我们看到这种行为与客户的历史行为相比发生了变化时,这将成为一个更加明显的信号。
- 当天的交易次数与最近30天的每日交易次数中位数的比率:当信用卡被破坏时,它可能会在较短的时间窗口内发生许多交易,这可能不符合过去的信用卡使用情况。当前一天的交易计数与最后30天的中间每日的交易计数的比率显著提高可能意味着存在欺诈性使用模式。
从上表中我们可以看出,给定日期的高交易计数本身可能并不意味着存在异常交易行为。相反,基于比率的特征可以促进客户当前交易行为与其过去交易行为之间的比较,从而可以更有效地捕捉异常。
3.年龄编码
我们可以使用年龄计算技术,通过获取两个时间戳或日期之间的差异,将日期或时间戳特征转换为数字特征。如果与特征值相关联的保有期可以是用于预测的有价值的信号,则我们也可以使用该技术将某些非数字特征转换为有意义的数字特征。
示例:
- 信用卡上次使用后的天数:长期处于休眠状态的信用卡上的突然交易可能与高欺诈风险有关。我们可以通过计算自上次使用信用卡以来的日期与当前交易日期之间的时间差来计算这一特征。
- 自客户的设备首次使用以来的天数:如果我们看到来自新设备的交易,它可能比客户使用时间更长的设备进行的交易风险更大。我们可以创建一个特征,将设备的使用年限指示为客户首次使用该设备的日期与当前交易日期之间的差异。
上表显示了一个年龄编码的示例。在这里,我们创建了一个新的数字类型的特征“Days since transaction device first used(自交易设备首次使用以来的天数)”,作为客户设备首次使用日期和当前交易日期之间的天数差。
4.指示器编码
指示器或布尔特征具有二进制值{1,0}或{True,False}。指示器特征是一种非常常见的数据类型,用于表示各种类型的二进制信息。在某些情况下,我们可能已经具有数字形式的二进制特征,而在其他情况下,它们可能具有非数字值。要使用非数字二进制特征进行模型训练,我们所要做的就是将它们映射到数字值。
除了这些常见的情况和指示器特征的使用之外,我们还可以利用指示器编码作为一种工具来表示非数字数据点之间的比较。这个属性使它特别强大,因为它为我们测量非数字特征的变化创造了一种方式。
示例:
- 最近登录事件期间验证失败:最近登录失败事件可能与更高的欺诈交易风险有关。在这种情况下,原始数据可能具有特征值“Yes”或“No”;我们在这里所要做的就是将这些值映射到1或0。
- 与上次交易相比,国家的位置发生了变化:国家位置的变化可能表明信用卡受损。在这里,创建一个表示非数字特征为“国家位置”变化的指示器特征将捕获此国家变化信息。
上表显示了一个指示器编码的示例。在这里,我们通过将客户的当前交易国家与他们以前的交易国家进行比较,创建了一个新的数字特征“Country change from previous transaction(从上次交易以来的国家变化)”。
5.独热编码
如果我们的特征数据是分类形式的,无论是数字的还是非数字的都可以应用独热编码技术。其中,数字分类形式是指包含非连续或非测量数据的数字数据,如地理区域代码、商店ID和其他此类数据。独热编码技术可以将这些特征转换为一组指示器特征,我们可以在训练机器学习模型时使用这些指示器特征。对分类特征应用独热编码将为该分类变量中的每个类别创建一个新的二进制特征。由于新特征的数量随着类别数量的增加而增加,因此该技术适用于类别数量较少的特征,尤其是当我们有较小的数据集时。其中一条标准经验法则建议,如果我们每个类别至少有十条记录,就应该应用这项技术。
示例:
- 交易性购买类别:某些类型的购买类别可能与较高的欺诈风险相关。由于购买类别名称是文本数据,我们可以应用独热编码技术将此特征转换为一组数字指示器特征。如果有十个不同的采购类别名称,独热编码将创建十个新的指示器特征,每个采购类别名称对应一个指示器特征。
- 设备类型:在线交易可以通过几种不同类型的设备进行,如iPhone、Android手机、Windows PC和Mac。其中一些设备更容易受到恶意软件的影响,或者欺诈者很容易访问,因此可能与更高的欺诈风险有关。要以数字形式包括设备类型信息,我们可以对设备类型应用独热编码,这将为每个设备类型创建一个新的指示器特征。
上表显示了独热编码的示例。在这里,我们通过将独热编码技术应用于非数字分类特征“Device Type(设备类型)”,创建了一组新的数字指示器特征。
6.目标编码
目标编码技术适用于应用独热编码的相同类型的特征;但是,与独热编码器相比,这种技术存在一些优点和缺点。当类别的数量很大时(基数很高),使用独热编码将不乐观地增加特征的数量,这可能导致模型过拟合。在这种情况下,目标编码可能是一种有效的技术,但前提是我们正在研究监督学习问题。这是一种将每个类别值映射到该类别目标的预期值的技术。如果处理具有连续目标的回归问题,那么此计算将类别映射到该类别的平均目标值。在二进制目标的分类问题的情况下,目标编码将把类别映射到该类别的正事件概率。与独热编码不同,这种技术的优点是不增加特征的数量。但是,这种技术也存在缺点,就是它只能应用于监督学习问题。应用这项技术也可能使模型容易受到过拟合的影响,特别是在某些类别的观测数量较低的情况下。
示例:
- 商户名称:针对某些商户的交易可能存在欺诈行为。可能有成千上万这样的商家,每个商家都有不同的欺诈交易风险。对包含商家名称的特征应用独热编码可能会引入数千个新特征,这是不可取的。在这种情况下,目标编码可以在不增加特征数量的情况下帮助捕获商家的欺诈风险信息。
- 交易邮政编码:就像商家一样,在不同邮政编码中进行的交易可能代表不同的欺诈风险水平。尽管邮政编码中存在数值,但它们不是连续的测量变量,不应按原样在模型中使用。相反,我们可以通过应用目标编码等技术来合并与每个邮政编码相关的欺诈风险信息。
上表给出了目标编码的示例。在这里,我们通过将目标编码技术应用于非数字分类特征“Merchant Name(商户姓名)”,创建了一个新的数字特征“Merchant Name target encoding(商户姓名目标编码)”。顾名思义,这种技术依赖于目标值来计算新的特征值。
一旦我们从原始数据中创建了新特性,下一步就是对它们进行处理,以获得最佳的模型性能。我们通过下一节中讨论的特征处理来实现这一点。
特征处理
特征处理是指一系列数据处理步骤,以确保机器学习模型符合预期的数据。虽然在使用某些机器学习算法时需要其中一些处理步骤,但其他步骤确保我们在所考虑的特征和机器学习算法之间达成良好的一致性。在本节中,让我们讨论一些常见的特征处理步骤以及为什么需要它们。
1.异常值处理
一些机器学习算法,特别是回归模型等参数算法,会受到异常值的严重影响。这些机器学习算法试图适应异常值,严重影响模型参数并损害整体性能。要处理异常值,我们必须首先识别它们。我们可以通过应用某些经验法则来检测特定特征的异常值,例如绝对值大于平均值加三个标准差,或者一个值在最接近的须值之外(最接近的四分位数加四分位数间距值的1.5倍)。一旦我们确定了特定特征中的异常值,我们就可以使用以下一些技术来处理异常值:
- 删除:我们可以删除至少有一个异常值的观测值。如果我们的数据在不同特征之间存在太多的异常值,我们可能会失去许多观测结果。
- 替换:我们可以用平均值替换异常值,例如给定特征的平均值、中值和模数。
- 特征转换或标准化:我们可以使用对数转换或特征标准化(如下文中所述的)来减少异常值的大小。
- 封顶和截底:我们可以将超出某个值的异常值替换为该值,例如,将第99个百分位数以上的所有值替换为第99个百分点值,将第1个百分位以下的所有值都替换为第1个百分点值。
上图显示了检测单变量异常值的两种常用技术。我们可以看到,这两种技术可以产生不同的异常值集。如果数据遵循正态分布,则应使用均值+3的标准差技术。注意,基于箱形图的技术一般来说更通用些,可以应用于任何分布的数据。
注意,有一些技术可以检测多变量异常值(关于多个特征的异常值)的观测值,但它们更复杂,通常不会在机器学习模型训练方面增加太多的价值。还要注意的是,在使用大多数非参数机器学习模型(如支持向量机)和基于树的算法(如决策树、随机森林和XGBoost)时,不需要考虑异常值。
2.缺失值处理
缺失数据在真实世界的数据集中非常常见。除了XGBoost这样的少数算法外,大多数传统的机器学习算法都不允许在训练数据集中丢失值。因此,修复缺失值是机器学习建模中的常规任务之一。目前,已经存在几种技术可以处理缺失的值;然而,在实现任何技术之前,重要的是要了解丢失数据的原因,或者至少要知道数据是否随机丢失。
如果数据不是随机丢失的,这意味着某些亚组更有可能存在丢失的数据,那么输入这些数据的值可能很困难,尤其是在几乎没有可用数据的情况下。如果数据随机丢失,我们可以使用接下来描述的一些常见处理技术。它们都有各自的优缺点,但是由我们自己来决定什么方法最适合我们的使用场景。
- 删除观测值:我们可以删除至少有一个缺失特征值的观测值。然而,如果我们的数据在不同的特征中有太多的缺失值,那么我们最终可能会失去许多观测结果。
- 删除特征:如果一个特征存在大量缺失值,我们可以选择把这一特征彻底删除掉。
- 用平均值替换:我们可以使用平均值,如给定特征的平均值、中值和模值来替换缺失的值。这种方法实施起来很简单,但可能无法为所有类型的观测提供良好的估计。例如,高欺诈风险交易可能具有与低欺诈风险交易金额不同的平均交易金额,并且使用总体平均值来代替缺失的高欺诈风险的交易金额可能不是一个好的替换方案。
- 最大似然、多重输入、K个最近邻:这些是更复杂的方法,考虑了与数据集中其他特征的关系,可以提供比总体平均值更准确的估计。然而,实现这些方法却需要额外的建模或算法实现。
上表显示了缺失值处理中常用技术的应用。
3.缩放
通常,我们在机器学习模型中使用的特征具有不同的范围。如果我们在不缩放的情况下使用它们,则具有大绝对值的特征将主导预测结果。相反,为了给每个特征一个公平的机会来为预测结果做出贡献,我们必须将所有特征放在同一尺度上。两种最常见的缩放技术是:
- 规一化:此缩放技术将特征值限制在0和1之间。为了应用归一化,我们减去最小特征值,并将其除以该特征的范围(最小值和最大值之间的差)。如果我们的一些特征有尖锐的偏斜或有一些极端的异常值,那么归一化可能不是一种好的技术。
- 标准化:该技术将特征数据分布转换为标准正态分布。我们可以通过减去平均值并除以标准差来实现这项技术。如果特征具有尖锐的偏斜或一些极端的异常值,则通常优选这种技术。
请注意,基于树的算法,如决策树、随机森林、XGBoost和其他算法,可以处理未缩放的数据,并且在使用这些算法时不需要缩放。
上表显示了两种常用特征缩放技术的应用情况。
上图显示了原始、标准化和标准化特征值之间的比例差异。正如我们所看到的,缩放不会影响数据分布的形状。
4.降维
今天,我们拥有大量的数据,我们可以构建大量的特征集合来训练我们的模型。对于大多数算法来说,拥有更多的特征是好的,因为这意味着将提供更多的选项来提高模型性能。然而,并非所有算法都是如此。基于距离度量的算法受到维数灾难——随着特征数量的大幅增加,两个观测值之间的距离值变得毫无意义。因此,要使用依赖于距离度量的算法,我们应该确保不使用大量特征。
如果我们的数据集拥有大量的特征,那么,如果我们不知道保留哪些特征和丢弃哪些特征的话,我们可以使用主成分分析(PCA)等技术。PCA技术能够将旧特征集转换为新特征集。它会创建新的特征,使得具有最高特征值的特征捕获来自旧特征的大部分信息。然后,我们可以只保留前几个新特征,并丢弃其余的特征。
其他统计技术,如关联分析和特征选择算法,可以用于监督学习问题,以减少特征的数量。然而,它们通常不会捕获与PCA对相同数量的特征所捕获的信息水平相同的信息。
上表显示了主成分分析在特征降维中的应用。正如我们所看到的,前三个特征捕获了原始数据集中超过87%的信息。在这种情况下,我们可以选择忽略两个特征(f4和f5),以获得小于13%的信息损失。要保留的特征数量和要消除的特征数量将因问题而异,具体取决于各种因素。
5.向正态分布的转换
这种措施是一个例外,因为它只适用于目标,而不适用于特征。此外,大多数机器学习算法对目标的分布没有任何限制,但某些算法,如线性回归,要求目标正态地分布。线性回归假设所有数据点的误差值对称且集中在零附近(就像正态分布的形状一样),正态分布目标变量确保满足这一假设。
我们可以通过绘制直方图来了解目标的分布情况。像Shapiro-Wilk检验这样的统计检验通过检验这一假设来告诉我们正态性。如果我们的目标不是正态分布的,我们可以尝试各种变换,如对数变换、平方变换、平方根变换等,以检查哪些变换使目标分布正态。还有一种Box-Cox变换,它尝试多个参数值,我们可以选择一个最能将目标的分布变换为正态的参数值。
上图显示了原始目标数据的三种转换。在这种特定情况下,我们可以看到,日志转换最能将原始数据分布转换为正态分布。
注意:虽然我们可以以任何顺序在特征中实现特征处理步骤,但我们必须彻底考虑它们的应用顺序。例如,使用均值替换的缺失值处理可以在异常值检测之前或之后实现。然而,用于替换的平均值可能会有所不同,这取决于我们是在异常值处理之前还是之后处理缺失值。本文中概述的特征处理序列按问题对后续处理步骤的影响顺序处理这些问题。因此,遵循这个顺序通常对解决大多数问题是有效的。
结论
正如引言中所提到的,特征工程是机器学习的一个维度,它使我们能够在特殊程度上控制模型的性能。为了充分利用特征工程的潜力,我们在本文中学习了各种技术,这些技术可以帮助我们创建新的特征并对其进行处理,以优化机器学习模型。无论您选择使用本文中的哪些特征工程原理和技术,我们在此特别强调的是要理解机器学习不仅仅是要求算法找出模式。也就是说,我们通过提供算法所真正需要的数据类型,最终使算法能够有效地完成其工作。
最后,除非另有说明;否则,本文所有图片均由作者本人提供。
译者介绍
朱先忠,51CTO社区编辑,51CTO专家博客、讲师,潍坊一所高校计算机教师,自由编程界老兵一枚。
原文标题:Feature Engineering for Machine Learning,作者:Sumit Makashir
链接:
https://towardsdatascience.com/feature-engineering-for-machine-learning-eb2e0cff7a30。