XGBoost简介
XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升(Gradient Boosting)的集成学习方法,它通过构建多棵回归树来进行预测。每棵树都根据之前所有树的误差进行建立,通过多轮迭代,逐步缩小误差。XGBoost使用了一种特殊的目标函数,该函数包含了预测误差(如平方损失)和正则化项(用于防止过拟合)。
在XGBoost中,预测值由多棵树的预测结果组合而成。每棵树都对输入特征进行分裂,以尽量降低预测误差。特征分裂时的标准是寻找可以最大化增益(Gain)的特征,即在分裂后预测误差的降低程度。增益的计算依赖于特征分裂前后的样本梯度(Gradient)和海森矩阵(Hessian)的统计量
在每轮迭代中,XGBoost会找到使目标函数下降最快的切分点。为此,它会考虑每个特征的所有可能切分点,并计算每个切分点的增益。增益是基于目标函数的二阶导数计算的,可以理解为预测误差的降低程度。
XGBoost有你想象的那么智能吗?并没有
我举个例子,比如对于同一个数据集中的A和B行数据,他们的“payment”和“time_period”分别是600,200和6000,2000,虽然绝对值不一样,但是可以看得出来他们的payment与time_period的比值都是3,这个比值可能是一个重要特征,但是如果只有原特征,xgboost的数据计算过程能否能甄别这个特征呢?
答案是不行的。XGBoost 本身主要是一种梯度提升决策树模型,它并没有内置的特征工程功能。特征工程需要在数据预处理阶段完成。
什么模型可以较好的捕捉这种复杂交互关系呢?
能够自动识别特征之间的交互关系的是神经网络模型。关于神经网络,由于其模型结构和学习能力的特点,它确实可以自动学习特征之间的交互和复杂关系。例如,在深度学习模型中,网络的多层结构使得模型可以学习到高阶特征组合。在某种程度上,这意味着神经网络能够捕捉到一些隐含的特征关系,如 "payment" 和 "time_period" 之间的比值。然而,即使神经网络具有自动学习特征的能力,为模型提供明确的特征工程仍然可能有益于提高模型性能。
回到我举的例子,XGBoost在处理特征时并不会直接识别不同特征之间的比值关系。只有通过特征工程,我们才能可以帮助 XGBoost 更好地捕捉这类特征间的关系。
什么样的特征工程是有效的
没用的特征工程有哪些
涉及特征量级缩放的特征处理:同比倍数扩大或者缩小,归一化缩放,对某列数据取对数。这些都是对于XGBoost没有用的处理。
但是,在实践中,对特征进行缩放(例如,最小最大缩放或标准化)有时可能对性能产生微弱的影响。
这是因为XGBoost 对特征的量级缩放不敏感。 XGBoost 基于树模型,它在特征空间中做的是分割而不是数值计算。换句话说,XGBoost 关注的是特征的排序(即特征值之间的相对大小关系),而不是特征的实际数值。
然而,对于其他模型,如线性回归、逻辑回归、神经网络等,特征缩放通常是很重要的预处理步骤,因为这些模型在计算过程中会涉及特征值的加权求和。在这种情况下,特征的量级会影响参数估计和模型性能。
有用的特征工程有哪些
针对其他特征工程,如文本特征处理、类别特征编码、特征交互等,仍然需要人工进行处理。
特征交互:创建两个或多个特征之间的交互特征。详细见下文特征选择:使用特征选择方法(例如基于树模型的特征重要性、递归特征消除等)可以帮助消除不相关或冗余特征,提高模型性能。详细见下文多重共线性噪声处理:对于多重共线性因子,可考虑采用PCA降维的方法减弱共线性的噪声。详细见下文文本特征处理:将文本信息转化为embedding(目前可通过调用腾讯或者OpenAI等的句嵌入API来非常简单的实现,不要自己重新造轮子!)。关于embedding在树模型中使用的思路,可看我的这篇文章文本嵌入(embedding)在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)对数据噪声、过拟合问题的认识、应对方法简单总结
的后半部分。
谢谢