首页 > 技术文章 > [机器学习] XGBoost 中特征共线性问题

chentianyu 2022-01-17 16:23 原文

我一直想知道XGBoost对自变量之间的相关性有多强。在构建XGBoost模型之前,是否应该检查多重共线性?在这篇文章中,我将通过使用Kaggle的两个数据集——信贷欺诈数据和法国巴黎银行加的夫索赔管理——来讨论相关性对XGboost的影响

介绍

相关性是一种统计度量,表示两个变量线性相关的程度(即它们以恒定速率一起变化)。这是一个描述简单关系的常用工具,而无需说明因果关系。相关系数r测量线性关系的强度和方向,例如:

1表示完全正相关。

-1表示完全负相关。

0表示不同变量之间没有关系。

有一种正在进行的理论认为,XGBoost输出不受独立特征集中存在相关变量的影响。这是直观的,因为XGBoost不受对分类变量使用一个热编码的影响。

决策树本质上不受多重共线性的影响。例如,如果您有两个99%相关的特征,在决定拆分时,树将只选择其中一个。如逻辑回归模型将使用其他两种特征。

由于增强树使用单个决策树,因此它们也不受多重共线性的影响。然而,无论模型的算法如何,从用于训练的任何数据集中删除任何冗余特征都是一种良好的做法。在您的情况下,由于您正在衍生新功能,您可以使用此方法,评估每个功能的重要性,并仅保留最终模型的最佳功能。

xgboost模型的重要性矩阵实际上是一个数据。表对象,第一列列出了增强树中实际使用的所有功能的名称。第二列是增益度量,它表示对应特征对模型的相对贡献,通过计算每个特征对模型中每个树的贡献来计算。与另一个特征相比,该度量值越高,则意味着它对于生成预测越重要。

陈天齐就XGBoost如何处理相关变量给出了答案(2018年):

这种差异会影响特征重要性分析中的一个关键案例:相关特征。想象两个完全相关的特征,特征A和特征B。对于一个特定的树,如果算法需要其中一个,它将随机选择(在boosting和Random森林中都是如此)。

然而,在随机森林中,这种随机选择将针对每棵树进行,因为每棵树都独立于其他树。因此,近似地,根据您的参数,50%的树将选择特征A,另外50%的树将选择特征B。因此,A和B中包含的信息的重要性(这是相同的,因为它们完全相关)在A和B中被稀释。因此,您不容易知道这些信息对于预测您想要预测的内容很重要!如果你有10个相关的特征,情况会更糟…

在boosting中,当算法学习到特征和结果之间的特定联系时,它将尝试不重新关注它(理论上是这样,现实并不总是那么简单)。因此,所有的重要性都在特性A或特性B上(但不是两者都有)。您将知道,一个特性在观察结果和标签之间的链接中起着重要作用。如果您需要了解所有相关特征,则仍然需要搜索与检测到的重要特征相关的特征。

让我们用一些例子来检验这一理论,看看XGBoost在部分相关(.8<r<1)变量的情况下是如何反应的:

第1部分:信用欺诈数据:

第一个案例使用Kaggle提供的信用卡欺诈数据。该数据有30列-28个PCA变量、数量和时间。我们使用以下代码段检查数据集中的多个共线变量:

corr=df.corr()
high_corr_var=np.where(corr>0.9)
high_corr_var=[(corr.columns[x],corr.columns[y]) for x,y in zip(*high_corr_var) if x!=y and x<y]
high_corr_var

由于数据具有PCA变量,现有特征集几乎不相关。因此,对于给定的分析,我们会人为地在数据中引入相关性(后面提到的细节)。

在此之前,我们首先将数据分为训练和验证(70:30),并估计两个数据集的AUC(用于基准测试):

序列auc:0.997853,验证auc:0.98187

接下来,我们使用下面的代码估计特征重要性。变量V17是最重要的变量:

variable_imp=pd.DataFrame({‘variable’:X_train.columns,’imp’:xgb_model.feature_importances_})
variable_imp.sort_values(‘imp’,ascending=False,inplace=True)
variable_imp[‘percentile’]=variable_imp[‘imp’]*100/variable_imp.iloc[0,1]
variable_imp

 

 

现在我们在模型中一个接一个地人工引入完全和部分相关的变量。

示例1:引入一个与V17变量完全相关的变量。

X_train[‘new_var’]=3*X_train[‘V17’]+5
X_test[‘new_var’]=3*X_test[‘V17’]+5

模型性能:

序列auc:0.997853,验证auc:0.98187

 

 或者完全相关的变量,对模型性能没有影响——既不影响训练,也不影响验证数据集。此外,变量重要性和排名顺序没有变化

示例2:引入与模型前4个变量部分相关的变量:

new_var_v17 corr with v17=0.98
new_var_v14 corr with v14= 0.96
new_var_v7 corr with v7=0.977
new_var_v10 corr with v10=0.973

模型性能:

列车auc:0.998051,验证auc:0.981696

在部分相关特征的情况下,XGBoost的输出受到轻微影响。我们看到模型的性能发生了微小的变化,这表明XGBoost在处理相关变量时具有鲁棒性。然而,人们可能会注意到,模型中的部分相关变量会影响变量的重要性

上述案例说明了一对自变量之间的高度相关性,即在0.95到0.99之间。笔记本上有一个附加示例的结果,相关值在0.85到0.90之间。同样的结论表明,无论相关值如何,XGBoost输出都是稳定的

第2部分:法国巴黎银行加的夫索赔管理

到目前为止,我们通过添加新的相关变量来进行相关分析。使用这些数据,我们将看到当我们删除高度相关的变量时对XGBoost性能的影响。

数据有133个变量,包括分类和数字类型。需要对数据进行一些预处理——输入缺失变量和分类值的标签编码。

预处理后,我们将数据分为训练和验证(70:30),并估计两个数据集的AUC:

列车auc:0.786068,验证auc:0.751041

下一步是从数据集中一次删除一个完全或部分相关的变量,并观察对XGBoost输出的影响。

示例3:删除相关性>0.9的变量。总共删除了39个变量。

列车auc:0.784501,验证auc:0.751112

在删除部分相关变量时,我们发现性能有了边际提高,这意味着XGboost不会受到删除相关变量的严重影响。

结论

本练习表明,包含相关变量会影响XGBoost模型的特征重要性,但在存在多重共线性的情况下,模型的性能仍然相当稳定和稳健。

推荐阅读