xgboost机器学习算法通俗理解

发布时间:2023年12月17日

本算法是GBDT的一种


?

可以通过两个生活中的例子来了解xgboost其思想:

XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升决策树(Gradient Boosting Decision Tree,GBDT)的机器学习模型。它通过迭代地训练多个弱学习器(决策树),并将它们组合成一个强大的集成模型来进行预测。以下是 XGBoost 的简要概述:

Boosting算法:XGBoost 使用了 Boosting 算法的思想。Boosting 是一种迭代的集成学习方法,通过训练一系列的弱学习器,每个弱学习器都试图纠正前一个学习器的错误,最终将它们组合成一个强学习器。

决策树作为基学习器:在 XGBoost 中,决策树被选择作为基学习器。决策树是一种树状结构,通过一系列的决策规则将输入数据划分为不同的类别或进行回归预测。

目标函数和损失函数XGBoost 通过定义目标函数和损失函数来优化模型。目标函数是要最小化的目标,而损失函数则衡量模型预测值与真实值之间的差异。

梯度提升XGBoost 使用梯度提升的方法来训练模型。在每一轮迭代中,它计算损失函数的梯度,并使用梯度的信息来调整当前模型的预测值,以使损失函数最小化。

正则化为了控制模型的复杂性和防止过拟合,XGBoost 引入了正则化项。正则化项通过限制模型的复杂度或对模型参数进行惩罚来避免过拟合。

现在,让我们通过一个生活中的例子来解释 XGBoost 的原理。

生活中的例子:猜猜我在想什么

想象一下,你和朋友正在玩一个猜谜游戏。你的朋友想一个数字,而你需要通过一系列的问题来猜出这个数字。这里有一些类比的概念:

问题:你可以提出一系列的问题,每个问题都是关于数字的某个方面,比如是奇数还是偶数、大于还是小于某个值等等。这些问题相当于决策树中的决策规则。

回答:你的朋友会根据问题的回答,告诉你是否猜对了。这些回答相当于真实值。

猜测:通过一系列的问题和回答,你可以逐步缩小数字的范围,最终猜出正确的数字。这相当于 XGBoost 模型通过迭代训练决策树,逐步提高预测的准确性。

集成:你可以通过多次提出问题和回答的过程,获得不同的猜测结果。然后,你可以将这些猜测结果进行组合,得到一个更准确的最终猜测结果。这相当于 XGBoost 将多个决策树组合成一个强大的集成模型。

通过这个例子,你可以理解 XGBoost 模型的原理:通过迭代训练多个决策树,每个决策树都试图纠正之前决策树的错误,最终将它们组合起来,以获得更准确的预测结果。

案例2:
这个例子我觉得更好

当然,我可以再给你举一个生活中的例子来说明 XGBoost 的原理。

生活中的例子:准备一道美味的咖啡

想象一下,你正在准备一杯美味的咖啡。在这个过程中,你需要不断调整各种因素,以确保咖啡的口味最好。这里有一些类比的概念:

咖啡因素:准备咖啡时,有许多因素可以调整,比如咖啡豆的种类、研磨程度、水的温度和浸泡时间等等。这些因素可以看作是模型的特征。

口味目标:你的目标是制作出一个口味浓郁、香气四溢的咖啡。这个目标可以看作是模型的损失函数,你的任务是最小化制作的咖啡与理想口味之间的差距。

试错过程:在制作咖啡的过程中,你可能会尝试不同的咖啡豆、调整研磨程度、尝试不同的水温和浸泡时间等等。每一次尝试都会得到一个咖啡样品,你会品尝它并根据口感调整下一次的尝试。这就类似于 XGBoost 中每轮迭代的过程。

集成结果:通过多次尝试和调整,你可能会得到许多不同的咖啡样品。然后,你可以将这些样品的特点进行总结,综合考虑它们的优点和缺点,最终得出一个制作咖啡的方法,以获得最好的口味。这类似于 XGBoost 将多个决策树的预测结果进行组合,得出一个更准确的预测。

正则化:在调整咖啡制作过程时,你可能会注意到一些因素对口味的影响较小,而其他因素可能更重要。你可能会专注于那些对口味影响较大的因素,以避免过多的调整。这就类似于 XGBoost 中的正则化,它有助于控制模型的复杂性,防止过拟合。

通过这个例子,你可以更深入地理解 XGBoost 的原理:通过迭代训练多个决策树,每个决策树都试图纠正前面决策树的错误,最终将它们集成在一起,以获得更准确的预测结果。就像你在制作咖啡时,通过多次尝试和调整,最终得到了最好口味的咖啡一样,XGBoost 通过集成多个决策树的预测结果,得出了更准确的预测。
一个简单的代码实例:

import xgboost as xgb
from sklearn.datasets import fetch_openml
import pandas as pd
# 设置显示的最大列数为None,表示不限制列数
pd.options.display.max_columns = None

from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 加载波士顿房价数据集
boston = fetch_openml(name='boston')
X, y = boston.data, boston.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 将X_train转换为DataFrame
df_X_train = pd.DataFrame(X_train)
# 处理分类的那一列
df_X_train['CHAS'] = df_X_train['CHAS'].astype('category')
df_X_train['RAD'] = df_X_train['RAD'].astype('category')

df_X_test = pd.DataFrame(X_test)
df_X_test['CHAS'] = df_X_test['CHAS'].astype('category')
df_X_test['RAD'] = df_X_test['RAD'].astype('category')

# 打印DataFrame
# print(df_X_train.head(2))

# 将数据转换为 DMatrix 格式
dtrain = xgb.DMatrix(df_X_train, label=y_train,enable_categorical=True)
dtest = xgb.DMatrix(df_X_test, label=y_test,enable_categorical=True)

# 设置参数
params = {
    'objective': 'reg:squarederror',  # 指定回归问题
    'eval_metric': 'rmse',  # 评估指标为均方根误差
    'max_depth': 3,  # 决策树的最大深度
    'learning_rate': 0.1,  # 学习率
    'subsample': 0.8,  # 每棵树使用的样本比例
    'colsample_bytree': 0.8  # 每棵树使用的特征比例
}

# 训练模型
num_rounds = 100  # 迭代次数
model = xgb.train(params, dtrain, num_rounds)

# 在测试集上进行预测
y_pred = model.predict(dtest)

y2_pred = model.predict(dtrain)
# 计算均方根误差
rmse_test = mean_squared_error(y_test, y_pred, squared=False)

# 计算训练的误差
rmse_train = mean_squared_error(y_train, y2_pred, squared=False)
print("rmse_test:", rmse_test)
print("rmse_train:", rmse_train)

文章来源:https://blog.csdn.net/DJJ5210/article/details/135045018
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。