人工智能-机器学习

集成学习_XGBoost

2022-02-14  本文已影响0人  Nefelibatas

概述

eg:

对于一个问题,INPUT X: age, gender, occupation, ....

Target y: How does the person like computer games?

image-20220212182416599.png

如上图,基学习器采用CART回归树。


微信截图_20220214101756.png

如上图,每个叶子节点对应预测的分数。

XGBoost的分裂节点算法

贪心方法

近似算法

XGBoost算法特点

XGBoost将树模型的复杂度加入到正则项中,从而避免过拟合,泛化性能好

损失函数是用泰勒展开式展开的,用到了一阶导和二阶导,可以加快优化速度

在寻找最佳分割点时,采用近似贪心算法,用来加速计算

不仅支持CART作为基分类器,还支持线性分类器,在使用线性分类器的时候可以使用L1,L2正则化

支持并行计算,XGBoost的并行是基于特征计算的并行,将特征列排序后以block的形式存储在内存中,在后面的迭代中重复使用这个结构。

在进行节点分裂时,计算每个特征的增益,选择增益最大的特征作为分割节点,各个特征的增益计算可以使用多线程并行

优点:速度快、效果好、能处理大规模数据、支持自定义损失函数等

缺点:算法参数过多,调参复杂,不适合处理超高维特征数据

XGBoost工具

参数分为:

通用参数

Booster参数

学习目标参数

代码参考

X_train, X_valid, y_train, y_valid = train_test_split(train_X, train_y, test_size=.2)
# 使用XGBoost
model = xgb.XGBClassifier(
    max_depth=8, #树的最大深度
    n_estimators=1000, #提升迭代的次数,也就是生成多少基模型
    min_child_weight=300, #一个子集的所有观察值的最小权重和
    colsample_bytree=0.8, #列采样率,也就是特征采样率
    subsample=0.8, #构建每棵树对样本的采样率
    eta=0.3,    # eta通过缩减特征的权重使提升计算过程更加保守,防止过拟合
    seed=42    #随机数种子
)

model.fit(
    X_train, y_train,
    eval_metric='auc', eval_set=[(X_train, y_train), (X_valid, y_valid)],
    verbose=True,
    #早停法,如果auc在10epoch没有进步就stop
    early_stopping_rounds=10 
)
model.fit(X_train, y_train)
prob = model.predict_proba(test_data)

官方代码

# 模型参数配置
param = {'boosting_type':'gbdt',
                         'objective' : 'binary:logistic', #任务目标
                         'eval_metric' : 'auc', #评估指标
                         'eta' : 0.01, #学习率
                         'max_depth' : 15, #树最大深度
                         'colsample_bytree':0.8, #设置在每次迭代中使用特征的比例
                         'subsample': 0.9, #样本采样比例
                         'subsample_freq': 8, #bagging的次数
                         'alpha': 0.6, #L1正则
                         'lambda': 0, #L2正则
        }

# 模型训练,得出预测结果
X_train, X_valid, y_train, y_valid = train_test_split(train.drop('Attrition',axis=1), train['Attrition'], test_size=0.2, random_state=42)
train_data = xgb.DMatrix(X_train, label=y_train)
valid_data = xgb.DMatrix(X_valid, label=y_valid)
test_data = xgb.DMatrix(test)
model = xgb.train(param, train_data, evals=[(train_data, 'train'), (valid_data, 'valid')], num_boost_round = 10000, early_stopping_rounds=200, verbose_eval=25)
predict = model.predict(test_data)
test['Attrition']=predict
# 转化为二分类输出
test['Attrition']=test['Attrition'].map(lambda x:1 if x>=0.5 else 0)
test[['Attrition']].to_csv('submit_lgb.csv')
上一篇下一篇

猜你喜欢

热点阅读