当前位置: 代码网 > 科技>人工智能>机器学习 > XGBoost的优势与不足:全面解析这个让无数数据科学家疯狂的算法

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

2024年07月28日 机器学习 我要评论
XGBoost(eXtreme Gradient Boost),中文是极致梯度提升,它是经过优化的分布式梯度提升库,旨在高效、灵活且可移植。XGBoost提供了一个并行树提升,可以快速准确地解决许多数据科学问题,相同的代码运行在主要的分布式环境上,如Kubernetes,Hadoop,SGE,Dask,Spark,PySpark,并且可以解决数十亿个示例以外的问题。记得在学吴恩达老师的机器学习课程时,隐约听到这么一句话:以后的决策树方面几乎都是用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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com