一、算法概念
决策树的集成机器学习算法,使用梯度上升框架,适用于分类和回归问题。
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 参数类似,但不完全一样,大意就是一个叶子节点样本太少了,也终止同样是过拟合;
三、XGBoost分类任务实现对比
主要根据模型搭建的流程,对比传统代码方式和利用Sentosa_DSML社区版完成机器学习算法时的区别。
(一)数据加载
1、python代码实现
import pandas as pd
#读取样本数据
data = pd.read_csv('./TestData/iris.csv')
2、Sentosa_DSML社区版
(二)样本分区
1、python代码实现
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))
2、Sentosa_DSML社区版
连接类型和样本分区算子,划分训练集和测试集数据。
首先,连接样本分区算子可以选择数据训练集和测试集划分比例。
右键预览可以看到数据划分结果。
其次,连接类型算子将Species列的模型类型设为Label标签列。
(三)模型训练
1、python代码实现
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 # 迭代次数
)
2、Sentosa_DSML社区版
样本分区完成后,连接XGBoost分类算子,双击在右侧进行模型属性配置。
(四)模型评估
1、python代码实现
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)
2、Sentosa_DSML社区版
利用评估算子对模型进行评估
训练集评估结果
测试集评估结果
(五)模型可视化
1、python代码实现
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()
2、Sentosa_DSML社区版
四、XGBoost分类任务实现对比
(一)数据加载和样本分区
数据加载和样本分区同上
1、python代码实现
# 读取数据
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))
2、Sentosa_DSML社区版
(二)模型训练
1、python代码实现
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)
2、Sentosa_DSML社区版
样本分区完成后,连接XGBoost回归算子,进行模型属性配置并执行,得到XGBoost回归模型。
(三)模型评估
1、python代码实现
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}%")
2、Sentosa_DSML社区版
利用评估算子对模型进行评估
训练集评估结果
测试集评估结果
(四)模型可视化
1、python代码实现
#可视化特征重要性
plot_importance(model)
plt.title('Feature Importance')
plt.show()
2、Sentosa_DSML社区版
右键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/
共同学习,写下你的评论
评论加载中...
作者其他优质文章