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

 目录

一、算法概念

二、算法原理

三、XGBoost分类任务实现对比

(一)数据加载

1、python代码实现

2、Sentosa_DSML社区版

(二)样本分区

1、python代码实现

2、Sentosa_DSML社区版

(三)模型训练

1、python代码实现

2、Sentosa_DSML社区版

(四)模型评估

1、python代码实现

2、Sentosa_DSML社区版

(五)模型可视化

1、python代码实现

2、Sentosa_DSML社区版

四、XGBoost分类任务实现对比

(一)数据加载和样本分区

1、python代码实现

2、Sentosa_DSML社区版

(二)模型训练

1、python代码实现

2、Sentosa_DSML社区版

(三)模型评估

1、python代码实现

2、Sentosa_DSML社区版

(四)模型可视化

1、python代码实现

2、Sentosa_DSML社区版

五、总结


一、算法概念

        XGBoost(eXtreme Gradient Boosting)又叫极度梯度提升树,是一种基于决策树的集成机器学习算法,使用梯度上升框架,适用于分类和回归问题。

        XGBoost实现的是一种通用的Tree Boosting算法,此算法的一个代表为梯度提升决策树(Gradient Boosting Decision Tree, GBDT),其原理是首先使用训练集和样本真值训练一棵树(指CART回归树,是一个二叉树,根据基尼指数选取根节点和每个叶子节点所生成的一个树),然后使用这棵树预测训练集,得到每个样本的预测值,由于预测值与真值存在偏差,所以二者相减可以得到“残差”。接下来训练第二棵树,此时不再使用真值,而是使用残差作为标准答案。两棵树训练完成后,可以再次得到每个样本的残差,然后进一步训练第三棵树,以此类推。树的总棵数可以人为指定,也可以监控某些指标(例如验证集上的误差)来停止训练。

        在预测新样本时,每棵树都会有一个输出值,将这些输出值相加,即得到样本最终的预测值。

        相较于GBDT算法,xgboost的改进之处在于以下几点:

               a.引进了正则项,具有预剪枝、防止模型过拟合的作用;

               b.使用泰勒二次展开项对目标函数近似求解,速度更快,效率更高,同时支持自定义目标函数,只要函数可二阶求导;

              c.能自动处理缺失值,xgb处理缺失值的方法是将缺失值单独作为一类处理,在节点分裂时根据提升度大小决定归类于左叶子节点 或者右叶子节点;

             d.支持并行化计算,xgb会对特征变量做预排序,并将结果保存为block模块储存在硬盘中,树分裂时调用多线程对多个特征变量做运算,极大的提高了计算速度。另外,不同于GBDT在分裂时使用贪心算法逐个计算信息增益或信息熵,xgb会计算特征变量分位点,并给出特征值对应的分裂权重,使用近似贪心算法在特征分裂时能减少计算量,提升效率。

二、算法原理

        首先明确算法的目标:希望建立K个回归树,使得树群的预测值尽量接近真实值(准确率)而且有尽量大的泛化能力,从数学角度看这是一个泛函最优化,XGBOOST的目标函数为:

        其中i表示第i个样本,表示第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_DSML社区版。以轻量化一键安装、平台免费使用、视频教学和社区论坛服务为主要特点,能够与其他数据科学家和机器学习爱好者交流心得,分享经验和解决问题。文章最后附上官网链接,感兴趣工具的可以直接下载使用

Sentosa_DSML社区版官网

  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kenneth風车

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值