机器学习特征工程实战指南
深入讲解特征工程在 ML 模型中的核心作用,主要面向数据科学和 ML 工程师。
深入讲解特征工程在 ML 模型中的核心作用,主要面向数据科学和 ML 工程师。
机器学习模型的效果在很大程度上取决于输入数据和特征的质量 [1]。在传统机器学习中,将原始数据转换为特征对模型准确率至关重要。特征工程旨在把现有数据转换为信息丰富、相关且具有区分能力的特征。尽管深度学习和端到端学习已经彻底改变了图像、文本和信号的处理方式,并实现了自动化,但针对关系型数据和人类行为数据的特征工程,依然是一项需要反复迭代、进展缓慢且费时费力的工作 [2]。
本文将探讨如何通过特征工程技术提高预测模型的准确性和可靠性。此外,还将介绍一些有助于简化特征工程流程的解决方案。
特征工程是传统机器学习模型中的一个关键步骤,专家会从处理后的数据中手动设计并提取相关特征。其目标是将专家知识、直觉判断以及人类的先验认知编码到机器学习模型中。这样可以降低模型的学习难度,尤其是在数据集较小时,同时提高模型的准确率和可解释性。
然而,特征工程并不是一种放之四海而皆准的解决方案。具体选择哪些特征和技术,取决于数据的性质、问题的复杂程度以及模型的目标。此外,特征工程还是一个迭代过程:先评估模型性能,再根据评估结果不断完善和更新特征。
下图展示了一个例子:只需将现有协变量投影到更高维空间,即创建现有特征的多项式变体,就可以让数据变得线性可分,从而使简单的机器学习模型更容易学习。
下表总结了一些适用于传统机器学习模型的基础特征工程技术。
NLP 任务需要从文本数据中提取特征,其中包括:
分词(Tokenization):将文本拆分为单独的单词或 token。
词干提取与词形还原(Stemming and lemmatization):去除单词的前缀和后缀,并将其映射到基本形式或词典形式。
词性标注(Part-of-speech,POS tagging):为每个单词标注相应的词性,例如名词、动词、形容词等。
命名实体识别(Named-entity recognition):定位并标注文本中的命名实体,例如人物、组织和地点。
词袋模型(Bag of Words):使用基于预定义词表的词频整数向量表示文本。
词频—逆文档频率(Term Frequency-Inverse Document Frequency):根据单词在某篇文档中的出现频率,以及它在全部文档中的出现频率,为单词赋予数值权重。
词嵌入(Word Embeddings):根据语义相似性,将单词表示为连续向量空间中的稠密向量。
情感分析(Sentiment analysis):识别文本的情感或语气,判断其为正面、负面还是中性。
主题建模(Topic modelling):识别一篇文档或一组文档中潜在的主题。
计算机视觉中的特征工程涉及从图像中提取特征的技术,包括:
图像增强(Image augmentation):通过图像旋转、滤镜等几何变换扩充训练集,从而提高模型的泛化能力。
边缘检测滤波器(Edge detection filter):使用 Sobel、Prewitt、Laplacian 或 Canny 边缘滤波器,突出图像中的强度变化或边缘。
尺度不变特征变换(Scale-invariant feature transform,SIFT):识别和描述图像中不受缩放与旋转影响的局部特征。
颜色直方图(Colour Histogram):通过图像中各种颜色的分布来表示图像。
方向梯度直方图(Histogram of Oriented Gradients,HOG):根据图像中的梯度分布提取特征。
时间序列分析中的特征工程涉及从时间序列数据中提取特征的技术,包括:
自相关(Autocorrelation):衡量时间序列与其滞后值之间的相关性。
移动平均(Moving averages):在指定窗口内,计算时间序列数据子集的平均值。
趋势分析(Trend analysis):识别时间序列数据中的趋势和模式。
傅里叶变换(Fourier transforms):将时间序列信号分解为不同的频率分量。
梅尔频率倒谱系数(Mel-frequency cepstral coefficients,MFCCs):通过功率谱表示音频信号。
音素(Phonemes):使用音素表示单词,利用人类对单词发音方式的先验认知。
目前有大量工具和开源软件包,可以帮助实现特征工程的自动化并简化其流程。这些软件包利用算法,根据数据特征生成和选择特征,从而减少人工工作,并扩大对潜在特征的探索范围。
Featuretools:专为时序数据和关系型数据的自动化特征工程而设计。
Featuretools:专为时序数据和关系型数据的自动化特征工程而设计。
tsfresh:专为从时间序列及其他序列数据中进行特征工程而设计。
tsfresh:专为从时间序列及其他序列数据中进行特征工程而设计。
AutoFeat:简化从数据中生成非线性特征的过程。
AutoFeat:简化从数据中生成非线性特征的过程。
TPOT(Tree-based Pipeline Optimization Tool):使用遗传编程,自动完成机器学习流水线中的各个环节,包括特征工程、特征选择和模型优化。
TPOT(Tree-based Pipeline Optimization Tool):使用遗传编程,自动完成机器学习流水线中的各个环节,包括特征工程、特征选择和模型优化。
featurewiz:自动完成特征工程和特征选择。
featurewiz:自动完成特征工程和特征选择。
Featuretools 凭借其深度特征合成(Deep Feature Synthesis,DFS)算法 [2],展现出了出色的通用性,尤其适合处理关系型数据集以及需要引入时序聚合的场景。
在本教程中,我们将在一个由四张表组成的数据集上使用 Featuretools:
clients:信用合作社的客户信息
loan:客户过去申请的贷款
payments due:应付款日期和金额
outcomes:贷款还款情况和日期
数据来源:Kaggle [3]
Featuretools 具备三项独特优势,使其成为一个强大的自动化特征工程工具:
Featuretools 基于 EntitySet 运行,也就是数据帧以及它们之间的关系。这种方法简化了关系型数据集的特征工程流程,允许用户定义表之间的关系,并根据这些关系自动生成特征。
es = ft.EntitySet(id = 'clients')
## Entities Dataframe
es = es.add_dataframe(
dataframe_name="clients",
dataframe=clients,
index="client_id",
time_index="joined")
es = es.add_dataframe(
dataframe_name="loans",
dataframe=loans,
index="loan_id",
time_index="loan_start")
es = es.add_dataframe(
dataframe_name="payments_due",
dataframe=payments_due,
index="payment_id",
time_index="due_date")
es = es.add_dataframe(
dataframe_name="outcome",
dataframe=outcome,
time_index="outcome_time")
## Adding Relationships in data frames
# Relationship between clients and previous loans
ed = es.add_relationship('clients', 'client_id', 'loans', 'client_id')
# Relationship between previous loans and payments
es = es.add_relationship('loans', 'loan_id', 'payments_due', 'loan_id')
# Relationship between payments and outcome
es = es.add_relationship('payments_due', 'payment_id', 'outcome', 'payment_id')
es.plot()
“特征基元是 Featuretools 的构建模块。它们定义了可以应用于原始数据集、用来创建新特征的计算。”[4]
特征基元分为两类:
聚合(Aggregation):将每个父级实体对应的子级数据点组合起来,并计算均值、方差等统计量 [3]。
转换(Transformation):对表中的一部分列执行操作,例如从日期中提取日,或计算两列之间的差值等 [3]。
# Index and the time to use as a cutoff time
cutoff_times = es['payments_due'][['payment_id', 'due_date']].sort_values(by='due_date')
# Rename columns to avoid confusion
cutoff_times.rename(columns = {'due_date': 'time'},
inplace = True)
cutoff_times.head()
# subtract 1 day from the time
cutoff_times['time'] = cutoff_times['time'] - pd.Timedelta(0, 'days')
payments_due
# Feature Primitives
agg_primitives = ["sum","min"]
trans_primitives = ["time_since_previous"]
# Deep feature synthesis
agg_primitives = ["sum","count","max"]
trans_primitives = ["time_since_previous"]
# Deep feature synthesis
f, feature_names = ft.dfs(entityset=es, target_dataframe_name='payments_due',
agg_primitives = agg_primitives,
trans_primitives = trans_primitives,
n_jobs = -1, verbose = 1,
cutoff_time = cutoff_times,
cutoff_time_in_index = True,
max_depth = 2)
此外,Featuretools 还提供可视化表示,用于检查、解释和验证生成的特征,从而帮助人们更好地理解之后构建的机器学习模型,并提高模型的可解释性。
各种形式的数据泄漏一直是机器学习模型和系统面临的一项挑战 [5]。Featuretools 提供了一种内置方案,可以防止特征生成过程中的“时间泄漏”:为每条记录指定截止时间,并在计算特征前过滤掉该时间戳之后的所有数据,从而有效避免引入时间泄漏 [6]。
关于如何使用 Featuretools,并在使用过程中正确处理时间因素,可以在 Github 上找到详细教程。
总而言之,特征工程是构建机器学习模型的关键步骤,能够显著提升模型的性能和准确率。Featuretools 等自动化工具与软件包可以简化特征工程流程,并帮助机器学习系统取得成功。
[1] Domingos, P.,2012。《关于机器学习,需要了解的一些实用知识》。Communications of the ACM,55(10),第 78—87 页。
[2] Kanter, J.M. 和 Veeramachaneni, K.,2015 年 10 月。《深度特征合成:迈向数据科学工作的自动化》。收录于 2015 IEEE International Conference on Data Science and Advanced Analytics(DSAA),第 1—10 页。IEEE。
[3] 自动化特征工程教程——Kaggle
[4] 特征基元——Featuretools 文档
[5] Kapoor, S. 和 Narayanan, A.,2023。《数据泄漏与基于机器学习的科学研究中的可复现性危机》。Patterns,4(9)。
[6] 时间处理——Featuretools 文档
如需采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。