XGBoost的优势与不足:全面解析这个让无数数据科学家疯狂的算法


highlight: arta
theme: cyanosis

0.什么是XGBoost?

XGBoost(eXtreme Gradient Boost),中文是极致梯度提升,它是经过优化的分布式梯度提升库,旨在高效、灵活且可移植。

XGBoost提供了一个并行树提升,可以快速准确地解决许多数据科学问题,相同的代码运行在主要的分布式环境上,如Kubernetes,Hadoop,SGE,Dask,Spark,PySpark,并且可以解决数十亿个示例以外的问题。

记得在学吴恩达老师的机器学习课程时,隐约听到这么一句话:以后的决策树方面几乎都是用XGBoost模型,这个模型已经做的非常好了。

关于XGBoost原理部分,任何转述与原论文相比都显得稍逊一筹,所以还是建议大家去看原文,这是论文地址

1.为什么要使用XGBoost?

即XGBoost的优势:

先看XGBoost有什么好处,再决定用不用😂

  1. 使用二阶泰勒展开,这样就可以使得损失函数更加精确,能够更好的拟合数据。
  2. 加入正则化,可以避免了树的过拟合,提高了模型的泛化能力。
  3. 采用了分块结构block以及并行计算,提高了训练速度和效率,就可以处理大规模的数据集。
  4. 支持多种目标函数和评估指标,可以处理回归、分类、排序等问题。
  5. 能够自动处理缺失值和稀疏数据,无需额外的预处理。

总之XGBoost是一种高效、灵活和强大的机器学习算法。

在kaggle竞赛方面,有大量选手都选用XGBoost进行数据挖掘比赛,是数据科学比赛的必杀武器,基于我上次一次kaggle比赛中也使用了XGBoost模型,这篇文章就详细介绍一下这个强大的工具。

如果你也想要学习XGBoost算法,就请继续看下去吧🥰

2.XGBoost的使用

这里将XGBoost的github地址贴出来,大家可以去看原代码。

首先在python中安装XGBoost。

pip install xgboost

然后就可以调用XGBoost的库啦😋

3.XGBoost示例 – 房价-高级回归预测

在这篇文章中我将用XGBoost来训练我之前参加的一次kaggle竞赛中的数据,大家可以看看这篇文章熟悉一下数据。

如下是我进行模型预测的部分代码:

import xgboost
model = xgboost.XGBRegressor()
model.fit(x, y)
y_pred = model.predict(x)

print('预测值',y)
predict = [data_test['Id'],y_pred]
predict_df = pd.DataFrame(predict).T
predict_df.to_csv(file_test_out,index=False)

如下是预测的部分数据:

我将预测的数据提交到kaggle竞赛上,想看看XGBoost模型预测的效果怎么样。

下面是我一个月前提交的结果,我用的CatBoost模型,上面一次是我用XGBoost模型,分数并没有提高(本题是分数越低越好),因为CatBoost也是一个和XGBoost比肩的一个算法模型,但是我处理的数据是更加适配CatBoost模型的数据,所以可能不太适配XGBoost模型。但是我会继续去测试XGBoost模型的。

4.XGBoost的巧妙之处

4.1 XGBoost处理缺失值

在对获取的数据中存在缺失值,一般采用手动对缺失值进行填充,如均值、中位数等,然后将填充的数据当做有值的特征进行处理,但是这样人工填充不一定准确,而且没有什么理论依据。

而XGBoost采用的策略是先不处理那些值缺失的样本,采用那些有值的样本搞出分裂点,在遍历每个有值特征的时候,尝试将缺失样本划入左子树和右子树,选择使损失最优的值作为分裂点。

竟然不需要处理缺失值,想想我每次处理缺失值时的糟心啊,XGBoost简直就是神器。

4.1.1 XGBoost预测存在缺失值的数据

突然有一个好的idea邪恶的想法我想实现一下,在房价预测这个问题,缺失值我都是采用手动补全的,既然XGBoost可以不用对缺失值进行填充,那我就尝试一下用XGBoost去预测存在缺失值的数据,看看结果如何。

import pandas as pd
import xgboost
import numpy as np  # 导入numpy库
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import GridSearchCV

file_train_in = r'E:@DS\python练习\kaggle\House Prices\In_data\train.csv'
file_test_in = r'E:@DS\python练习\kaggle\House Prices\In_data\test.csv'
# file_out = r'E:@DS\python练习\kaggle\House Prices\Out_data\predict.csv'

train = pd.read_csv(file_train_in)
test = pd.read_csv(file_test_in)


# # 打印train数据中的数值型数据
# print(train.select_dtypes(include=['int64', 'float64']).columns)

#  将数据类型转换为数值型
def encode_categorical_columns(column):
    return column.astype('category').cat.codes


train[train.select_dtypes(include=['object']).columns] = train[train.select_dtypes(include=['object']).columns].apply(encode_categorical_columns)
test[test.select_dtypes(include=['object']).columns] = test[test.select_dtypes(include=['object']).columns].apply(encode_categorical_columns)

print(train.select_dtypes(include=['object']).columns)

# 预测
X_train = train.drop('SalePrice', axis=1)
y_train = train['SalePrice']
X_test = test

model = xgboost.XGBRegressor()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)

#  数据提交
submission_df = pd.DataFrame({
    'Id': test['Id'],
    'SalePrice': y_pred
})
predict_file_path = r'C:\Users\19313\Desktop\其他\kaggle竞赛\房价预测\xgboost_predict.csv'
submission_df.to_csv(predict_file_path, index=False)

训练结束,赶紧提交一下

哦豁,不对数据进行缺失值处理竟然排名会有这么高,第1888名,这是我参加的竞赛中排名最高的了🥰还真是越努力越心酸,辛苦手动处理的数据,还没有不处理来的好🤣

这也从侧面显示出XGBoost的优越性吧。

4.1.2 CatBoost预测存在缺失值的数据

这个时候我又想测试一下CatBoost,于是代码模型已改,开始使用CatBoost进行预测。

干的好呀,CatBoost又一次刷新了我的排名,看来CatBoost比XGBoost更加优秀。(有点打脸了😅)

学习本来就是一个不会到会的,这一过程会经历的曲折只有到终点才知道,很正常。至少我知道了XGBoost在某些方面还是不如其他的一些算法,世间万物都有缺点,真的很正常。(开始升华🤪)

4.1.3 XGBoost的优势

那XGBoost相比于CatBoost的优势在哪呢?

  1. XGBoost使用了直方图算法和预排序算法来加速分裂点的寻找,提高了训练效率。
  2. XGBoost使用了正则化项来控制模型的复杂度,防止过拟合。
  3. XGBoost支持多种目标函数和评价指标,可以灵活地定制模型的优化目标。
  4. XGBoost支持分布式计算和并行学习,可以处理大规模的数据集。
4.1.4 CatBoost的优势

同时也介绍一下CatBoost的优势:

  1. CatBoost可以自动处理类别型特征,无需进行编码或转换,提高了模型的准确性。
  2. CatBoost使用了对称树和深度优先搜索算法来构建决策树,减少了内存消耗和通信开销。
  3. CatBoost使用了一种改进的均值编码方法来处理分类变量,降低了过拟合的风险。
  4. CatBoost提供了丰富的可视化工具,可以方便地监控模型的训练过程和结果。

大家可以根据自己需要处理的数据,自行选择这两种算法。

4.2 XGBoost并行训练

XGBoost的并行,并不是每棵树都可以并行训练,每棵树训练前需要等前面的树完成才能开始训练。

XGBoost的并行,指的是特征维度的并行:在训练前,每个特征按特征值对样本进行预排序,并存储为block结构,在后面查找特征分割点时可以重复使用,而且特征已经被存储为一个个block结构,那么在寻找每个特征的最佳分割点时,可以利用多线程对每个block并行计算。

4.XGBoost的应用场景

  1. 数据挖掘:用来分析数据的特征重要性,挖掘潜在的规律和关联,提高数据的利用价值。
  2. 推荐系统:用来构建用户画像,根据用户的历史行为和偏好,推荐合适的商品或服务。
  3. 电商预估:用来预估用户的购买意愿、转化率、订单金额等指标,帮助电商平台优化营销策略和提高效率。
  4. 金融风控:可以用来评估用户的信用风险、贷款违约率、欺诈行为等因素,帮助金融机构降低损失和提高效率。

XGBoost不足:

XGBoost虽然这么好,还是存在一些不足的。即:

  • 虽然利用排序和近似算法可以降低寻找最佳分裂点的计算量,但在节点分裂过程中仍需要遍历数据集;
  • 预排序过程的复杂度过高,不仅需要存储特征值,还需要存储特征对应样本的梯度统计值的索引,相当于消耗了两倍的内存。

最后

XGBoost是一种高效的梯度提升决策树算法,它可以处理大规模数据集,并且具有并行计算和自动处理缺失值等优势。在数据挖掘、推荐系统、电商预估和金融风控等领域有着广泛的应用。然而,XGBoost也存在一些不足,如预排序过程的复杂度较高,需要消耗两倍的内存。因此,在选择使用XGBoost时,需要根据实际需求和数据特点进行权衡。

1ABC2273.jpg

  • 64
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值