走进XGBoost:一个强大而又低调的机器学习算法

2023-08-2407:59:18人工智能与大数据Comments943 views字数 4127阅读模式
看见Boost,很多小伙伴肯定想到了GBM(Gradient Boosting Machine),是的,XGBoost和GBM都属于梯度提升的实现算法,而XGBoost全称为 eXtreme Gradient Boosting,是梯度提升的一种特别有效的实现。为什么说特别有效?因为各种实践分析证明,XGBoost是一个非常非常强大的分类和回归工具,特别是,它在各种论坛比赛中被证明非常强大,获胜的提交作品通常会包含它。今天,大海哥将会带你了解这个算法,将会让你知道,文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/54585.html

XGBoost是什么?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/54585.html

你应该如何准备你的数据?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/54585.html

如何使用 XGBoost 训练和调整模型?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/54585.html

以及怎样可视化和探索您的模型?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/54585.html

首先我们要开始介绍,XGBoost是什么?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/54585.html

XGBoost 是梯度提升决策树算法的实现,那么什么是梯度提升决策树算法,我们通过下面这张图来介绍。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/54585.html

走进XGBoost:一个强大而又低调的机器学习算法
首先我们反复构建新模型并将它们组合成集成模型的循环。然后通过采用现有模型并计算数据集中每个观察值的误差来开始循环。然后我们建立一个新模型来预测这些错误。并将这个错误预测模型的预测添加到“模型集合”中。不断迭代,每个误差都有对应的模型可以预测,然后添加了所有先前模型的预测。我们可以使用这些预测来计算新的误差,构建下一个模型,并将其添加到集成中。最后我们的模型就可以实现超低误差。其实这就是从0到1的过程,不断积累,厚积薄发!大海哥还找了一个比赛的结果图如下图,最后XGBoost的表现非常恐怖,仅仅训练24次,AUC就达到了0.9662。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/54585.html
走进XGBoost:一个强大而又低调的机器学习算法
介绍完原理,开始分析吧!我们来看看分析需要使用那些R包文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/54585.html

library(xgboost)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/54585.html

library(tidyverse)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/54585.html

#主要就是这两个,是不是很方便,然后我们导入分析数据diseaseInfo <- read_csv("Outbreak_240817.csv")#然后开始处理一下数据集#划分一下训练集和测试集set.seed(1234)diseaseInfo <- diseaseInfo[sample(1:nrow(diseaseInfo)), ]#看看数据head(diseaseInfo)
走进XGBoost:一个强大而又低调的机器学习算法
#这个数据集为过去两年动物疾病爆发的时间、地点和内容,包括非洲猪瘟、口蹄疫和禽流感。病例数、死亡人数等也包括在内。本次分析我们想看看这些因素对人类是否有影响。# xgboost包要求数据有一定的格式,所以数据在开始分析之前需要做一下数据清理#首先删除一下人类相关的几列数据,大家也可以修改为自己想剔除的列,这里是为了教大家如何批量删除,同时刚好也删掉目标变量#删掉human开头的列diseaseInfo_humansRemoved <- diseaseInfo %>%    select(-starts_with("human"))#还可以剔除掉一些冗余数据,同时删掉所有的非数字变量,部分分类变量转化为数值变量diseaseInfo_numeric <- diseaseInfo_humansRemoved %>%    select(-Id) %>%    select(-c(longitude, latitude)) %>%     select_if(is.numeric) #把目标变量处理一下diseaseLabels <- diseaseInfo %>%    select(humansAffected) %>% # 看看人类是否受影响这一列    is.na() %>% # is it NA?    magrittr::not() # 转换为TRUE和FALSEhead(diseaseLabels) #转换后的列
走进XGBoost:一个强大而又低调的机器学习算法
head(diseaseInfo$humansAffected)#转换前的列文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/54585.html
走进XGBoost:一个强大而又低调的机器学习算法
# 看看数据的格式str(diseaseInfo_numeric)
走进XGBoost:一个强大而又低调的机器学习算法
# 检查一下国家特征文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/54585.html

head(diseaseInfo$country)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/54585.html

走进XGBoost:一个强大而又低调的机器学习算法
#我们需要把国家划分为几类,可以用one-hot编码处理一下model.matrix(~country-1,head(diseaseInfo))
走进XGBoost:一个强大而又低调的机器学习算法
#保留这个国家特征转化而来的的稀疏矩阵region <- model.matrix(~country-1,diseaseInfo)#有时,我们可能还需要进行一些文本处理。例如我们有一个speciesDescription特征,包含哪种特定动物患病以及是否是家养动物的信息,我们看一下
走进XGBoost:一个强大而又低调的机器学习算法
#这里主要有domestic和wild两个关键字,分别为家养和野生,那我们可以把他们转化为对应的两类diseaseInfo_numeric$is_domestic <- str_detect(diseaseInfo$speciesDescription, "domestic")#还可以根据物种描述绘制一个物种矩阵speciesList <- diseaseInfo$speciesDescription %>%    str_replace("[[:punct:]]", "") %>% str_extract("[a-z]*$") # extract the least word in each row# 列表转换为矩阵speciesList <- tibble(species = speciesList)# 继续用one-hot编码转换一下options(na.action='na.pass') # 忽略NA值species <- model.matrix(~species-1,speciesList)#现在相当于我们有了三个数据diseaseInfo_numeric、region 和species,其实可以把他们捆绑起来diseaseInfo_numeric <- cbind(diseaseInfo_numeric, region, species)diseaseInfo_matrix <- data.matrix(diseaseInfo_numeric)#然后就可以开始划分测试数据和训练数据啦numberOfTrainingSamples <- round(length(diseaseLabels) * .7)# 训练集train_data <- diseaseInfo_matrix[1:numberOfTrainingSamples,]train_labels <- diseaseLabels[1:numberOfTrainingSamples]# 测试集test_data <- diseaseInfo_matrix[-(1:numberOfTrainingSamples),]test_labels <- diseaseLabels[-(1:numberOfTrainingSamples)]#然后转换为dmatrix,这是XGBoost的专属格式,也可以不转换,但是转换后训练更快哦!dtrain <- xgb.DMatrix(data = train_data, label= train_labels)dtest <- xgb.DMatrix(data = test_data, label= test_labels)#现在我们已经清理了测试和训练集并准备就绪,是时候开始训练我们的模型了。#那么人类相关的变量有好几个,预测哪一个呢,这里建议二分类是最好的。model <- xgboost(data = dtrain, # 数据                    nround = 2, #最大提升迭代次数                 objective = "binary:logistic")# binary:logistic代表二分类变量
走进XGBoost:一个强大而又低调的机器学习算法
#可以看到模型的输出,在第一轮和第二轮中,模型在训练数据上都有一定的误差。但是在减少,说明有进步!继续!#先看看预测怎么样pred <- predict(model, dtest)# 获取预测误差err <- mean(as.numeric(pred > 0.5) != test_labels)print(paste("test-error=", err))
走进XGBoost:一个强大而又低调的机器学习算法
#开始迭代!model_tuned <- xgboost(data = dtrain, # 数据                           max.depth = 3, #决策树最大深度                 nround = 2, #最大提升迭代次数                 objective = "binary:logistic") # 函数类型pred <- predict(model_tuned, dtest)# 获取误差err <- mean(as.numeric(pred > 0.5) != test_labels)print(paste("test-error=", err))
走进XGBoost:一个强大而又低调的机器学习算法
#好像没有提升,为什么?答案就是部分变量的尺度不同,而我们没有设置对应的权重,这里我们重新设置一下参数negative_cases <- sum(train_labels == FALSE)postive_cases <- sum(train_labels == TRUE)# 开始训练model_tuned <- xgboost(data = dtrain, max.depth = 3, #决策树最大深度                 nround = 10, #最大提升迭代次数#如果我们在这么多轮中没有看到改进,就停止early_stopping_rounds = 3, objective = "binary:logistic",scale_pos_weight = negative_cases/postive_cases) # 控制不平衡的类,设置权重# 为我们保留的测试数据生成预测pred <- predict(model_tuned, dtest)# 输出误差err <- mean(as.numeric(pred > 0.5) != test_labels)print(paste("test-error=", err))
走进XGBoost:一个强大而又低调的机器学习算法
#提升显著哦!#最后看一下哪些变量对于模型的贡献最大importance_matrix <- xgb.importance(names(diseaseInfo_matrix), model = model)xgb.plot.importance(importance_matrix)
走进XGBoost:一个强大而又低调的机器学习算法
基本上,这个图告诉我们,当我们查看整体中的每棵树时,每个特征的信息量有多大。因此,增益较大的特征对我们的模型非常重要,而增益较小的特征则没有多大帮助。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/54585.html
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/54585.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ai/54585.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定