决策树的集成机器学习算法,使用梯度上升框架,适用于分类和回归问题。
XGBoost实现的是一种通用的Tree Boosting算法,此算法的一个代表为梯度提升决策树(Gradient Boosting Decision Tree, GBDT),其原理是首先使用训练集和样本真值训练一棵树(指CART回归树,是一个二叉树,根据基尼指数选取根节点和每个叶子节点所生成的一个树),然后使用这棵树预测训练集,得到每个样本的预测值,由于预测值与真值存在偏差,所以二者相减可以得到“残差”。接下来训练第二棵树,此时不再使用真值,而是使用残差作为标准答案。两棵树训练完成后,可以再次得到每个样本的残差,然后进一步训练第三棵树,以此类推。树的总棵数可以人为指定,也可以监控某些指标(例如验证集上的误差)来停止训练。
在预测新样本时,每棵树都会有一个输出值,将这些输出值相加,即得到样本最终的预测值。
相较于GBDT算法,xgboost的改进之处在于以下几点:
a.引进了正则项,具有预剪枝、防止模型过拟合的作用;
b.使用泰勒二次展开项对目标函数近似求解,速度更快,效率更高,同时支持自定义目标函数,只要函数可二阶求导;
c.能自动处理缺失值,xgb处理缺失值的方法是将缺失值单独作为一类处理,在节点分裂时根据提升度大小决定归类于左叶子节点 或者右叶子节点;
d.支持并行化计算,xgb会对特征变量做预排序,并将结果保存为block模块储存在硬盘中,树分裂时调用多线程对多个特征变量做运算,极大的提高了计算速度。另外,不同于GBDT在分裂时使用贪心算法逐个计算信息增益或信息熵,xgb会计算特征变量分位点,并给出特征值对应的分裂权重,使用近似贪心算法在特征分裂时能减少计算量,提升效率。
首先明确算法的目标:希望建立K个回归树,使得树群的预测值尽量接近真实值(准确率)而且有尽量大的泛化能力,从数学角度看这是一个泛函最优化,XGBOOST的目标函数为:
表示第i个样本的预测误差,误差越小越好。后面
表示树的复杂度的函数,越小复杂度越低,泛化能力越强,表达式为:
其中,T表示叶子节点的个数,w表示节点的数值(这是回归树的东西,分类树对应的是类别。
一般的目标函数都包含下面两项:
其中,误差/损失函数鼓励我们的模型尽量去拟合训练数据,使得最后的模型会有比较少的偏差。而正则化项则鼓励更加简单的模型。因为当模型简单之后,有限数据拟合出来结果的随机性比较小,不容易过拟合,使得最后模型的预测更加稳定。
直观上看,目标函数要求预测误差尽量小,叶子节点尽量少,节点数值尽量不极端(这个怎么看,如果某个样本数值为4,那么第一个回归树预测为3,第二个预测为1;另外一组回归树,一个预测2,一个预测2,那么倾向后一种,为什么呢?前一种情况,第一棵树学的太多,太接近4,也就意味着有较大的过拟合的风险)
那怎么实现呢?其通过贪心策略+最优化(二次最优化)
贪心算法分裂的方式是一种暴力搜索的方式,遍历每一个特征,遍历该特征的每一个取值,计算分裂前后的增益,选择增益最大的特征取值作为分裂点(树的节点)。
这里是怎么用贪心策略的呢,刚开始你有一群样本,放在第一个节点,这时候T=1,w是多少呢,不知道,是求出来的,这时候所有样本的预测值都是w(决策树的节点表示类别,回归树的节点表示预测值),带入样本的预测值此时损失函数变为:
误差表示用的是平方误差,那么上述函数就是一个关于w的二次函数求最小值,取最小值的点就是这个节点的预测值,最小的函数值为最小损失函数。
以上式子将目标函数转成了二次函数最优化问题。若不是二次函数将使用泰勒公式转成二次函数。目标函数已经确定好了,接下来要选个特征分裂成两个节点,变成一棵弱小的树苗,那么需要:
(1)确定分裂用的特征,关于选取特征最简单的是粗暴的枚举(遍历所有特征),选择损失函数效果最好的那个;
(2)通过二次函数求最值的方式(二次函数求导为0 )确定节点的预测值以及最小的损失函数。
在分裂的时候,每次节点分裂,损失函数被影响的只有这个节点的样本,因而每次分裂,计算分裂的增益(损失函数的降低量)只需要关注打算分裂的那个节点的样本。继续分裂,按照上述的方式,形成一棵树,再形成一棵树,每次在上一次的预测基础上取最优进一步分裂/建树。
当出现一下情况时就停止节点的分裂:
(1)当引入的分裂带来的增益小于一个阀值的时候,我们可以剪掉这个分裂,所以并不是每一次分裂损失函数整体都会增加的,有点预剪枝的意思;
(2)当树达到最大深度时则停止建立决策树,设置一个超参数max_depth,因为树太深很容易出现的情况学习局部样本,过拟合;
(3)当样本权重和小于设定阈值时则停止建树,解释一下,涉及到一个超参数-最小的样本权重和min_child_weight,和GBM的 min_child_leaf 参数类似,但不完全一样,大意就是一个叶子节点样本太少了,也终止同样是过拟合;
主要根据模型搭建的流程,对比传统代码方式和利用Sentosa_DSML社区版完成机器学习算法时的区别。
import pandas as pd #读取样本数据 data = pd.read_csv('./TestData/iris.csv')
import pandas as pd from sklearn.model_selection # 特征和标签分离 x = data.drop('species', axis=1) y = data['species'] # 分割数据集,测试集比例是 20%,训练集比例是 80% x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2) # 输出训练集和测试集的样本数 print("训练集样本数:", len(x_train)) print("测试集样本数:", len(x_test))
连接类型和样本分区算子,划分训练集和测试集数据。
首先,连接样本分区算子可以选择数据训练集和测试集划分比例。
右键预览可以看到数据划分结果。
其次,连接类型算子将Species列的模型类型设为Label标签列。
from xgboost.sklearn import XGBClassifier #模型初始化 clf = XGBClassifier( booster = 'gbtree', objective = 'multi:softmax', num_class = 3, gamma = 0.1, # 最小分裂损失 max_depth = 6, # 树的最大深度 reg_lambda = 2, # L2 正则化 subsample = 1, # 子采样率 colsample_bytree = 0.8, # 每棵树随机采样的列数占比 min_child_weight = 1, # 最小叶子节点样本权重和 eta = 0.3, # 学习率 seed = 1000, # 随机种子 nthread = 4, # 线程数 n_estimators = 100 # 迭代次数 )
样本分区完成后,连接XGBoost分类算子,双击在右侧进行模型属性配置。
from sklearn.metrics import recall_score # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print('accuracy: %2.2f%%' % (accuracy * 100)) # 计算加权精度 (weighted precision) weighted_precision = precision_score(y_test, y_pred, average='weighted') print('Weighted Precision: %2.4f' % weighted_precision) # 计算加权F1分数 weighted_f1 = f1_score(y_test, y_pred, average='weighted') print('Weighted F1 Score: %2.4f' % weighted_f1) # 计算加权召回率 (weighted recall) weighted_recall = recall_score(y_test, y_pred, average='weighted') print('Weighted Recall: %2.4f' % weighted_recall)
利用评估算子对模型进行评估
训练集评估结果
测试集评估结果
from sklearn.metrics import confusion_matrix import seaborn as sns import matplotlib.pyplot as plt # 计算混淆矩阵 cm = confusion_matrix(y_test, y_pred) # 可视化混淆矩阵 plt.figure(figsize=(8, 6)) sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', cbar=False) plt.xlabel('Predicted') plt.ylabel('Actual') plt.title('Confusion Matrix') plt.show() # 显示重要特征 plot_importance(clf) plt.title('Feature Importance') plt.show()
数据加载和样本分区同上
# 读取数据 data = pd.read_csv('./TestData/winequality.csv') #特征和标签分离 x = data.drop('quality', axis=1) y = data['quality'] #分割数据集,测试集比例是 20%,训练集比例是 80% x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42) # 输出训练集和测试集的样本数 print("训练集样本数:", len(x_train)) print("测试集样本数:", len(x_test))
from xgboost import XGBRegressor #建立XGBoost回归模型 model = XGBRegressor( n_estimators=100, # 设置迭代次数 max_depth=6, # 最大树深度 learning_rate=0.1, # 学习率 reg_lambda=1, # L2 正则化 subsample=0.8, # 子样本采样率 colsample_bytree=0.8, # 树的列采样率 random_state=42 ) # 模型训练 model.fit(x_train, y_train) # 模型预测 y_pred = model.predict(x_test)
样本分区完成后,连接XGBoost回归算子,进行模型属性配置并执行,得到XGBoost回归模型。
from sklearn.metrics import mean_absolute_error, mean_squared_error import numpy as np # 预测结果 y_pred = model.predict(x_test) # 评估指标 r2 = r2_score(y_test, y_pred) mae = mean_absolute_error(y_test, y_pred) mse = mean_squared_error(y_test, y_pred) rmse = np.sqrt(mse) # MAPE (Mean Absolute Percentage Error) mape = np.mean(np.abs((y_test - y_pred) / y_test)) * 100 # SMAPE (Symmetric Mean Absolute Percentage Error) smape = np.mean(2 * np.abs(y_pred - y_test) / (np.abs(y_test) + np.abs(y_pred))) * 100 # 打印评估结果 print(f"R² Score: {r2}") print(f"Mean Absolute Error (MAE): {mae}") print(f"Mean Squared Error (MSE): {mse}") print(f"Root Mean Squared Error (RMSE): {rmse}") print(f"Mean Absolute Percentage Error (MAPE): {mape}%") print(f"Symmetric Mean Absolute Percentage Error (SMAPE): {smape}%")
利用评估算子对模型进行评估
训练集评估结果
测试集评估结果
#可视化特征重要性 plot_importance(model) plt.title('Feature Importance') plt.show()
右键XGBoost回归模型即可查看模型信息:
相比传统代码方式,利用Sentosa_DSML社区版完成机器学习算法的流程更加高效和自动化,传统方式需要手动编写大量代码来处理数据清洗、特征工程、模型训练与评估,而在Sentosa_DSML社区版中,这些步骤可以通过可视化界面、预构建模块和自动化流程来简化,有效的降低了技术门槛,非专业开发者也能通过拖拽和配置的方式开发应用,减少了对专业开发人员的依赖。
Sentosa_DSML社区版提供了易于配置的算子流,减少了编写和调试代码的时间,并提升了模型开发和部署的效率,由于应用的结构更清晰,维护和更新变得更加容易,且平台通常会提供版本控制和更新功能,使得应用的持续改进更为便捷。
Sentosa数据科学与机器学习平台(Sentosa_DSML)是力维智联完全自主知识产权的一站式人工智能开发部署应用平台,可同时支持零代码“拖拉拽”与notebook交互式开发,旨在通过低代码方式帮助客户实现AI算法模型的开发、评估与部署,结合完善的数据资产化管理模式与开箱即用的简捷部署支持,可赋能企业、城市、高校、科研院所等不同客户群体,实现AI普惠、化繁为简。
Sentosa_DSML产品由1+3个平台组成,以数据魔方平台(Sentosa_DC)为主管理平台,三大功能平台包括机器学习平台(Sentosa_ML)、深度学习平台(Sentosa_DL)和知识图谱平台(Sentosa_KG)。力维智联凭借本产品入选“全国首批人工智能5A等级企业”,并牵头科技部2030AI项目的重要课题,同时服务于国内多家**“双一流”高校及研究院所**。
为了回馈社会,矢志推动全民AI普惠的实现,不遗余力地降低AI实践的门槛,让AI的福祉惠及每一个人,共创智慧未来。为广大师生学者、科研工作者及开发者提供学习、交流及实践机器学习技术,我们推出了一款轻量化安装且完全免费的Sentosa_DSML社区版软件,该软件包含了Sentosa数据科学与机器学习平台(Sentosa_DSML)中机器学习平台(Sentosa_ML)的大部分功能,以轻量化一键安装、永久免费使用、视频教学服务和社区论坛交流为主要特点,同样支持“拖拉拽”开发,旨在通过零代码方式帮助客户解决学习、生产和生活中的实际痛点问题。
该软件为基于人工智能的数据分析工具,该工具可以进行数理统计与分析、数据处理与清洗、机器学习建模与预测、可视化图表绘制等功能。为各行各业赋能和数字化转型,应用范围非常广泛,例如以下应用领域:
**金融风控:**用于信用评分、欺诈检测、风险预警等,降低投资风险;
**股票分析:**预测股票价格走势,提供投资决策支持;
**医疗诊断:**辅助医生进行疾病诊断,如癌症检测、疾病预测等;
**药物研发:**进行分子结构的分析和药物效果预测,帮助加速药物研发过程;
**质量控制:**检测产品缺陷,提高产品质量;
**故障预测:**预测设备故障,减少停机时间;
**设备维护:**通过分析机器的传感器数据,检测设备的异常行为;
**环境保护:**用于气象预测、大气污染监测、农作物病虫害防止等;
**客户服务:**通过智能分析用户行为数据,实现个性化客户服务,提升用户体验;
**销售分析:**基于历史数据分析销量和价格,提供辅助决策;
**能源预测:**预测电力、天然气等能源的消耗情况,帮助优化能源分配和使用;
**智能制造:**优化生产流程、预测性维护、智能质量控制等手段,提高生产效率。
欢迎访问Sentosa_DSML社区版的官网Sentosa_DSML社区版官网,免费下载体验。同时,我们在B站、CSDN、知乎、博客园等平台有技术讨论博客和应用案例分享,欢迎广大数据分析爱好者前往交流讨论。
Sentosa_DSML社区版,重塑数据分析新纪元,以可视化拖拽方式指尖轻触解锁数据深层价值,让数据挖掘与分析跃升至艺术境界,释放思维潜能,专注洞察未来。
社区版官网下载地址:https://sentosa.znv.com/
社区版官方论坛地址:http://sentosaml.znv.com/
B站地址:https://space.bilibili.com/3546633820179281
CSDN地址:https://blog.csdn.net/qq_45586013?spm=1000.2115.3001.5343
知乎地址:https://www.zhihu.com/people/kennethfeng-che/posts
博客园地址:https://www.cnblogs.com/KennethYuen