特征工程有必要吗?到底什么样的特征工程是有效的?由树模型(如XGBoost)的原理分析

您所在的位置:网站首页 利用迭代方法构造迭代树 特征工程有必要吗?到底什么样的特征工程是有效的?由树模型(如XGBoost)的原理分析

特征工程有必要吗?到底什么样的特征工程是有效的?由树模型(如XGBoost)的原理分析

2023-04-08 09:24| 来源: 网络整理| 查看: 265

XGBoost简介

XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升(Gradient Boosting)的集成学习方法,它通过构建多棵回归树来进行预测。每棵树都根据之前所有树的误差进行建立,通过多轮迭代,逐步缩小误差。XGBoost使用了一种特殊的目标函数,该函数包含了预测误差(如平方损失)和正则化项(用于防止过拟合)。

在XGBoost中,预测值由多棵树的预测结果组合而成。每棵树都对输入特征进行分裂,以尽量降低预测误差。特征分裂时的标准是寻找可以最大化增益(Gain)的特征,即在分裂后预测误差的降低程度。增益的计算依赖于特征分裂前后的样本梯度(Gradient)和海森矩阵(Hessian)的统计量

在每轮迭代中,XGBoost会找到使目标函数下降最快的切分点。为此,它会考虑每个特征的所有可能切分点,并计算每个切分点的增益。增益是基于目标函数的二阶导数计算的,可以理解为预测误差的降低程度。

XGBoost有你想象的那么智能吗?并没有

我举个例子,假设一个数据集中只有A和B行数据,他们的Y(标签值)是一样的,他们的X特征包括“payment”和“time_period”,特征取值分别是600,200和6000,2000,虽然绝对值不一样,但是可以看得出来他们的payment与time_period的比值都是3,这个比值可能是一个重要特征,但是如果只有原特征,xgboost的数据计算过程能否能甄别这个特征呢?

让我们假设现实中就是这个隐藏的比值导致了AB的Y取值都一样。那么也就是说假如存在一个数据远大于原数据集范围,但是比值又相同的点C(60000,20000)拿来预测时,真实的Y应该和上文中AB的Y都取同一个值。

XGBoost能识别这个关系吗?答案是不行的。这是因为XGBoost作为树模型,它的预测结果可以理解为特征分布导致的条件期望。也就是说,基于给定的特征向量,模型预测结果是目标变量的条件期望。

总结,XGBoost 本身主要是一种梯度提升决策树模型,它并没有内置的特征工程功能。特征工程需要在数据预处理阶段完成。

什么模型可以较好的捕捉这种复杂交互关系呢?

能够自动识别特征之间的交互关系的是神经网络模型。关于神经网络,由于其模型结构和学习能力的特点,它确实可以自动学习特征之间的交互和复杂关系。例如,在深度学习模型中,网络的多层结构使得模型可以学习到高阶特征组合。在某种程度上,这意味着神经网络能够捕捉到一些隐含的特征关系,如 "payment" 和 "time_period" 之间的比值。然而,即使神经网络具有自动学习特征的能力,为模型提供明确的特征工程仍然可能有益于提高模型性能。

关于XGBoost与回归、神经网络的对比案例,请看这篇文章:心火试新茶:XGBoost等决策树的巨大缺陷-哪些问题上预测精度甚至不如回归,更不如神经网络?

回到我举的例子,XGBoost在处理特征时并不会直接识别不同特征之间的比值关系。只有通过特征工程,我们才能可以帮助 XGBoost 更好地捕捉这类特征间的关系。

什么样的特征工程是有效的没用的特征工程有哪些

涉及特征量级缩放的特征处理:同比倍数扩大或者缩小,归一化缩放,对某列数据取对数。这些都是对于XGBoost没有用的处理。

但是,在实践中,对特征进行缩放(例如,最小最大缩放或标准化)有时可能对性能产生微弱的影响。

这是因为XGBoost 对特征的量级缩放不敏感。 XGBoost 基于树模型,它在特征空间中做的是分割而不是数值计算。换句话说,XGBoost 关注的是特征的排序(即特征值之间的相对大小关系),而不是特征的实际数值。

然而,对于其他模型,如线性回归、逻辑回归、神经网络等,特征缩放通常是很重要的预处理步骤,因为这些模型在计算过程中会涉及特征值的加权求和。在这种情况下,特征的量级会影响参数估计和模型性能。

有用的特征工程有哪些

针对其他特征工程,如文本特征处理、类别特征编码、特征交互等,仍然需要人工进行处理。

特征交互:创建两个或多个特征之间的交互特征。详细见下文特征选择:使用特征选择方法(例如基于树模型的特征重要性、递归特征消除等)可以帮助消除不相关或冗余特征,提高模型性能。详细见下文多重共线性噪声处理:对于多重共线性因子,可考虑采用PCA降维的方法减弱共线性的噪声。详细见下文文本特征处理:将文本信息转化为embedding(目前可通过调用腾讯或者OpenAI等的句嵌入API来非常简单的实现,不要自己重新造轮子!)。关于什么是embedding,看这篇文章:心火试新茶:词向量介绍-目前文本分析主流方法-你不会还在用那些老土过时的文本分析方法吧?。 关于embedding在树模型中使用的思路,可看我的这篇文章心火试新茶:文本嵌入(embedding)在XGBoost这种树模型中使用的思路神经网络关系挖掘:非常容易想到的是,XGBoost是否能够结合神经网络输出来进行自动特征工程?答案是可以的,请看后续这篇:心火试新茶:XGBoost结合神经网络中间层输出-一种自动特征工程的思路特征缩放:由于 XGBoost 主要依赖于树结构进行建模,它对特征的缩放不敏感。但是,在实践中,对特征进行缩放(例如,最小最大缩放或标准化)有时可能对性能产生微弱的影响。特征交互方法

常见的特征交互类型包括:

加法交互:将两个特征相加以创建新特征。例如,特征 A 和特征 B 的加法交互为 A + B。减法交互:将一个特征减去另一个特征以创建新特征。例如,特征 A 和特征 B 的减法交互为 A - B。乘法交互:将两个特征相乘以创建新特征。例如,特征 A 和特征 B 的乘法交互为 A * B。除法交互:将一个特征除以另一个特征以创建新特征。例如,特征 A 和特征 B 的除法交互为 A / B。高阶特征 多项式交互:将特征组合成多项式项以创建新特征。例如,特征 A 和特征 B 的二次多项式交互为 A^2, A * B, B^2。类别特征交互:对于类别特征,可以使用组合(如 one-hot 编码)或其他编码方法(如 target encoding)来创建新特征。

当然,我们没有必要手写一个个穷举这些规则,早就有开源的Python特征工程库可自动实现以上工程的穷举。

自动化特征工程库(Python):

Featuretools:这是一个用于自动特征工程的 Python 库,可以自动构建特征矩阵,支持多种实体和实体间的关系。 网址:https://github.com/alteryx/featuretoolsTPOT:TPOT 是一个自动化机器学习工具,使用遗传算法进行特征工程、模型选择和超参数优化。 网址:https://github.com/EpistasisLab/tpotAutoFeat:这是一个自动化特征工程库,可以自动生成新的数值特征并选择最重要的特征。 网址:https://github.com/cod3licious/autofeatsklearn.preprocessing:虽然这不是一个完全自动化的特征工程库,但 scikit-learn 的 preprocessing 模块提供了许多有用的预处理方法,如特征缩放、类别特征编码等。 网址:https://scikit-learn.org/stable/modules/preprocessing.html特征选择 与 多重共线性问题 解决方法

见我的另一篇文章

心火试新茶:树模型(如XGBoost)对数据噪声、过拟合问题的认识、应对方法简单总结

的后半部分。

谢谢



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3