Xgboost生成Feature

本文探讨了使用XGBoost进行特征工程的方法,通过对比不同接口的性能,介绍了如何生成新特征并评估其对模型预测能力的影响。实验结果显示,新增特征虽未显著提升AUC分数,但展示了特征工程在机器学习项目中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

了解了一个新的方法

坐下记录,不过发现这样新特征加入之后,训练的结果并没有提升非常多。


from sklearn.model_selection import train_test_split
from pandas import DataFrame
from sklearn import metrics
from sklearn.datasets  import  make_hastie_10_2
from xgboost.sklearn import XGBClassifier
import xgboost as xgb

#准备数据,y本来是[-1:1],xgboost自带接口邀请标签是[0:1],把-1的转成1了。
X, y = make_hastie_10_2(random_state=0)
X = DataFrame(X)
y = DataFrame(y)
y.columns={"label"}
label={-1:0,1:1}
y.label=y.label.map(label)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) #划分数据集
y_train.head(5)


print("X_train =")
print(X_train.head(5))

print("X_test =")
X_test.head(5)

#XGBoost自带接口
params={
    'eta': 0.3,
    'max_depth':3,   
    'min_child_weight':1,
    'gamma':0.3, 
    'subsample':0.8,
    'colsample_bytree':0.8,
    'booster':'gbtree',
    'objective': 'binary:logistic',
    'nthread':12,
    'scale_pos_weight': 1,
    'lambda':1,  
    'seed':27,
    'silent':0 ,
    'eval_metric': 'auc'
}
d_train = xgb.DMatrix(X_train, label=y_train)
d_valid = xgb.DMatrix(X_test, label=y_test)
d_test = xgb.DMatrix(X_test)
watchlist = [(d_train, 'train'), (d_valid, 'valid')]
 
#sklearn接口
clf = XGBClassifier(
    n_estimators=30,#三十棵树
    learning_rate =0.3,
    max_depth=3,
    min_child_weight=1,
    gamma=0.3,
    subsample=0.8,
    colsample_bytree=0.8,
    objective= 'binary:logistic',
    nthread=12,
    scale_pos_weight=1,
    reg_lambda=1,
    seed=27)
 
model_bst = xgb.train(params, d_train, 30, watchlist, early_stopping_rounds=500, verbose_eval=10)
model_sklearn=clf.fit(X_train, y_train)
 
y_bst= model_bst.predict(d_test)
y_sklearn= clf.predict_proba(X_test)[:,1]

print("XGBoost_自带接口    AUC Score : %f" % metrics.roc_auc_score(y_test, y_bst))
print("XGBoost_sklearn接口 AUC Score : %f" % metrics.roc_auc_score(y_test, y_sklearn))

"""### 生成两组新特征"""

print("原始train大小:",X_train.shape)
print("原始test大小:",X_test.shape)
 
##XGBoost自带接口生成的新特征
train_new_feature= model_bst.predict(d_train, pred_leaf=True)
test_new_feature= model_bst.predict(d_test, pred_leaf=True)

train_new_feature1 = DataFrame(train_new_feature)
test_new_feature1 = DataFrame(test_new_feature)
print("新的特征集(自带接口):",train_new_feature1.shape)
print("新的测试集(自带接口):",test_new_feature1.shape)
 
#sklearn接口生成的新特征
train_new_feature= clf.apply(X_train) # 每个样本在每颗树叶子节点的索引值
test_new_feature= clf.apply(X_test)
train_new_feature2 = DataFrame(train_new_feature)
test_new_feature2 = DataFrame(test_new_feature)


print("test_new_feature1 =")
print(test_new_feature1.head(5))

print("test_new_feature2 =")
test_new_feature2.head(5)

import numpy as np
import pandas as pd

def mergeToOne(df,df_two):
  df = df.reset_index(drop=True)
  df_two = df_two.reset_index(drop=True)

  n = df.shape[1]
  n+=df_two.shape[1]
  print("n = ",n)
  df_new = pd.concat([df,df_two],axis=1)
  df_new.columns = [i for i in range(n)]
  return df_new
 # pd.merge(df,df_two,)
  #return DataFrame(df_new)

#用两组新的特征分别训练,预测
#用XGBoost自带接口生成的新特征训练
new_feature1=clf.fit(train_new_feature1, y_train)
y_new_feature1= clf.predict_proba(test_new_feature1)[:,1]

print("模型训练后树模型:生成的新特征预测结果 AUC Score : %f" % metrics.roc_auc_score(y_test, y_new_feature1))

#用XGBoost自带接口生成的新特征训练
new_feature2=clf.fit(train_new_feature2, y_train)
y_new_feature2= clf.predict_proba(test_new_feature2)[:,1]

print("生成的新特征预测结果 AUC Score : %f" % metrics.roc_auc_score(y_test, y_new_feature2))


new_train = mergeToOne(X_train,train_new_feature1)
new_test = mergeToOne(X_test,test_new_feature1)

  
print(new_train.head(2))
clf.fit(new_train, y_train)
y_new_pre = clf.predict_proba(new_test)[:,1]

print("40维度 : 生成的新特征预测结果 AUC Score : %f" % metrics.roc_auc_score(y_test, y_new_pre))



参考博客

XGBoost Plotting API以及GBDT组合特征实践

MachineLearningTrick

<think>好的,我现在需要帮用户解答关于XGBoost特征重要性方法的优点和局限性,用于论文预答辩。用户还希望了解原理、学术资料和参考文献。首先,我得回顾一下XGBoost的基本原理,特别是特征重要性的计算方法。XGBoost通常使用三种方法:权重统计(Frequency)、增益(Gain)和覆盖(Cover)。需要分别解释这三种方法的原理。 然后,优点方面,用户可能需要知道为什么XGBoost的特征重要性在应用中受欢迎。比如计算效率高,能够捕捉非线性关系,提供多种评估方式等。需要确保这些优点有文献支持,可能需要引用相关论文或文档。 接下来是局限性。这里需要注意常见的批评点,比如对高基数特征的偏好,忽略特征间的交互作用,以及可能的不稳定性。这些点需要具体说明,并可能引用相关研究指出这些局限性。 关于学术资料和参考文献,用户需要权威的来源,比如XGBoost的原作者陈天奇的论文,或者Scikit-learn的文档,以及其他相关研究论文。需要检查这些引用是否准确,并正确标注引用标识。 还要确保回答结构清晰,符合用户要求的系统级指令,比如正确使用LaTeX格式,生成相关问题。同时要注意用户是用于论文预答辩,所以回答需要严谨,学术性强,可能还需要指出在学术写作中需要注意的问题,比如结合其他方法验证的重要性。 最后,生成的相关问题需要围绕XGBoost的特征重要性展开,可能涉及改进方法、与SHAP值的比较、处理高基数特征的方法,以及在深度学习中的应用等。这些问题应该对用户的进一步研究有帮助。 现在需要组织这些思路,确保每个部分逻辑连贯,引用正确,并且用中文自然表达。同时检查LaTeX格式是否正确,特别是行内公式使用$...$,独立公式用$$...$$。例如,在解释增益计算时,可能需要公式,如信息增益的计算公式。 需要避免使用Markdown,但用户示例中代码块是用```python包裹的,所以可能需要保留代码块的格式。不过用户的问题中可能不需要代码,所以重点在文字描述和公式。 总结步骤: 1. 解释XGBoost特征重要性方法的原理(三种方法)。 2. 列出优点,每个优点简要说明,并引用文献。 3. 分析局限性,同样每个点详细说明,引用相关研究。 4. 提供学术资料和参考文献,正确标注引用。 5. 生成相关问题,帮助用户进一步探讨。 需要确保每个部分的信息准确,引用正确,语言流畅,符合学术写作的要求。同时注意用户提到的预答辩用途,可能需要强调实际应用中的注意事项,比如结合其他评估方法。</think>### XGBoost特征重要性方法解析 #### 一、原理说明 XGBoost通过以下三种方法评估特征重要性: 1. **权重统计(Frequency)** 统计特征在所有树中被选为分裂节点的次数占比,表达式为: $$f_j = \frac{\text{特征}j\text{的分裂次数}}{\text{总分裂次数}}$$ 2. **增益(Gain)** 计算特征在分裂时带来的平均信息增益,表达式为: $$G_j = \frac{\sum_{t=1}^{T} \Delta L_t}{\text{特征}j\text{的分裂次数}}$$ 其中$\Delta L_t$表示单次分裂的损失函数减少量[^1]。 3. **覆盖(Cover)** 统计特征分裂时覆盖的样本量,反映特征对数据分布的贡献。 #### 二、优点分析 1. **计算高效** 重要性计算与模型训练同步完成,无需额外计算资源。 2. **非线性捕捉** 基于树结构的分裂过程能自动捕捉特征间非线性关系,优于线性模型的系数分析。 3. **多维度评估** 提供频率、增益、覆盖三种指标,可从不同角度解释特征作用。例如,增益更适合分析预测贡献,频率反映特征泛化能力。 4. **可解释性强** 特征重要性排序可直接用于特征筛选,在Kaggle竞赛中广泛应用(如房价预测、用户流失分析)[^2]。 #### 三、局限性探讨 1. **高基数特征偏差** 类别型特征经过独热编码后,会生成大量稀疏特征,导致权重被稀释。例如,在信用卡欺诈检测中,经过编码的"交易国家"特征重要性可能被低估。 2. **忽略交互作用** 重要性分数仅反映单特征贡献,无法揭示特征组合的影响。实验表明,在广告点击率预测任务中,单独使用"用户年龄"和"广告类别"的重要性评分,可能低于二者的实际交互效应[^3]。 3. **数据分布敏感** 当特征间存在强相关性时,重要性评分可能出现随机波动。研究显示,对波士顿房价数据集重复运行XGBoost,重要特征排名变动幅度可达20%[^4]。 4. **覆盖度偏差** 在类别不平衡数据中,覆盖度可能偏向多数类样本分布区域。例如医疗诊断场景中,对罕见病的预测特征覆盖度评分易被主流病例特征压制。 #### 四、学术参考文献 1. **核心算法论文** Chen T, Guestrin C. XGBoost: A Scalable Tree Boosting System. KDD 2016. (必引文献)[^1] 2. **方法对比研究** [1] Lundberg S M, Lee S I. Consistent feature attribution for tree ensembles. arXiv:1706.06060, 2017. (建议引用SHAP对比分析) 3. **局限性分析文献** [2] Strobl C, et al. Bias in random forest variable importance measures. BMC Bioinformatics, 2007. (高基数特征偏差理论推导)[^4] 4. **应用案例参考** [3] Practical Lessons from Predicting Clicks on Ads at Facebook. ICDM 2014. (工业级特征工程实践) ```python # 特征重要性计算示例代码 from xgboost import plot_importance import matplotlib.pyplot as plt model = xgboost.train(params, dtrain) plot_importance(model, importance_type='gain') plt.show() ``` #### 五、论文写作建议 1. 在方法论章节需明确说明使用的特征重要性类型(如选择增益指标) 2. 讨论局限性时应结合实验数据,例如展示SHAP值与XGBoost重要性排序差异 3. 特征筛选建议采用组合策略:XGBoost重要性 + 统计检验 + 领域知识
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值