软件工程

【机器学习(一)】分类和回归任务-XGBoost算法-Sentosa_DSML社区版

本文主要是介绍【机器学习(一)】分类和回归任务-XGBoost算法-Sentosa_DSML社区版,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、算法概念

决策树的集成机器学习算法,使用梯度上升框架,适用于分类和回归问题。

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/

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

这篇关于【机器学习(一)】分类和回归任务-XGBoost算法-Sentosa_DSML社区版的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!