0.什么是XGBoost?
XGBoost(eXtreme Gradient Boost),中文是极致梯度提升,它是经过优化的分布式梯度提升库,旨在高效、灵活且可移植。
XGBoost提供了一个并行树提升,可以快速准确地解决许多数据科学问题,相同的代码运行在主要的分布式环境上,如Kubernetes,Hadoop,SGE,Dask,Spark,PySpark,并且可以解决数十亿个示例以外的问题。
记得在学吴恩达老师的机器学习课程时,隐约听到这么一句话:以后的决策树方面几乎都是用XGBoost模型,这个模型已经做的非常好了。
关于XGBoost原理部分,任何转述与原论文相比都显得稍逊一筹,所以还是建议大家去看原文,这是论文地址。
1.为什么要使用XGBoost?
即XGBoost的优势:
先看XGBoost有什么好处,再决定用不用😂
- 使用二阶泰勒展开,这样就可以使得损失函数更加精确,能够更好的拟合数据。
- 加入正则化,可以避免了树的过拟合,提高了模型的泛化能力。
- 采用了分块结构block以及并行计算,提高了训练速度和效率,就可以处理大规模的数据集。
- 支持多种目标函数和评估指标,可以处理回归、分类、排序等问题。
- 能够自动处理缺失值和稀疏数据,无需额外的预处理。
总之XGBoost是一种高效、灵活和强大的机器学习算法。
在kaggle竞赛方面,有大量选手都选用XGBoost进行数据挖掘比赛,是数据科学比赛的必杀武器,基于我上次一次kaggle比赛中也使用了XGBoost模型,这篇文章就详细介绍一下这个强大的工具。
如果你也想要学习XGBoost算法,就请继续看下去吧🥰
2.XGBoost的使用
这里将XGBoost的github地址贴出来,大家可以去看原代码。
首先在python中安装XGBoost。
pip install xgboost
然后就可以调用XGBoost的库啦😋
3.XGBoost示例 -- 房价-高级回归预测
在这篇文章中我将用XGBoost来训练我之前参加的一次kaggle竞赛中的数据,大家可以看看这篇文章熟悉一下数据。
如下是我进行模型预测的部分代码:
ini
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去预测存在缺失值的数据,看看结果如何。
python
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的优势在哪呢?
- XGBoost使用了直方图算法和预排序算法来加速分裂点的寻找,提高了训练效率。
- XGBoost使用了正则化项来控制模型的复杂度,防止过拟合。
- XGBoost支持多种目标函数和评价指标,可以灵活地定制模型的优化目标。
- XGBoost支持分布式计算和并行学习,可以处理大规模的数据集。
4.1.4 CatBoost的优势
同时也介绍一下CatBoost的优势:
- CatBoost可以自动处理类别型特征,无需进行编码或转换,提高了模型的准确性。
- CatBoost使用了对称树和深度优先搜索算法来构建决策树,减少了内存消耗和通信开销。
- CatBoost使用了一种改进的均值编码方法来处理分类变量,降低了过拟合的风险。
- CatBoost提供了丰富的可视化工具,可以方便地监控模型的训练过程和结果。
大家可以根据自己需要处理的数据,自行选择这两种算法。
4.2 XGBoost并行训练
XGBoost的并行,并不是每棵树都可以并行训练,每棵树训练前需要等前面的树完成才能开始训练。
XGBoost的并行,指的是特征维度的并行:在训练前,每个特征按特征值对样本进行预排序,并存储为block结构,在后面查找特征分割点时可以重复使用,而且特征已经被存储为一个个block结构,那么在寻找每个特征的最佳分割点时,可以利用多线程对每个block并行计算。
4.XGBoost的应用场景
- 数据挖掘:用来分析数据的特征重要性,挖掘潜在的规律和关联,提高数据的利用价值。
- 推荐系统:用来构建用户画像,根据用户的历史行为和偏好,推荐合适的商品或服务。
- 电商预估:用来预估用户的购买意愿、转化率、订单金额等指标,帮助电商平台优化营销策略和提高效率。
- 金融风控:可以用来评估用户的信用风险、贷款违约率、欺诈行为等因素,帮助金融机构降低损失和提高效率。
XGBoost不足:
XGBoost虽然这么好,还是存在一些不足的。即:
- 虽然利用排序和近似算法可以降低寻找最佳分裂点的计算量,但在节点分裂过程中仍需要遍历数据集;
- 预排序过程的复杂度过高,不仅需要存储特征值,还需要存储特征对应样本的梯度统计值的索引,相当于消耗了两倍的内存。
最后
XGBoost是一种高效的梯度提升决策树算法,它可以处理大规模数据集,并且具有并行计算和自动处理缺失值等优势。在数据挖掘、推荐系统、电商预估和金融风控等领域有着广泛的应用。然而,XGBoost也存在一些不足,如预排序过程的复杂度较高,需要消耗两倍的内存。因此,在选择使用XGBoost时,需要根据实际需求和数据特点进行权衡。