好久没更了,实在是太忙了,年底了也没见病人减少嘛。🫠
今天讲讲机器学习的XGBoost
,嘿嘿。🤩
XGBoost
是boosting
算法的其中一种。😘
Boosting
算法的思想是将许多弱分类器集成在一起形成一个强分类器。🤓
XGBoost
是一种提升树模型,所以是将许多树模型集成在一起,形成一个很强的分类器,叫CART
回归树模型。🌲
算法思想就是不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。☹️
当训练完成得到k
棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数。☝️
最后只需要将每棵树对应的分数加起来就是该样本的预测值。😘
rm(list = ls())
library(xgboost)
library(tidyverse)
library(data.table)
library(Matrix)
load("./Arthritis.rda")
df <- data.table(Arthritis, keep.rownames = F)
head(df)
str(df)
对于第一个变量,我们通过四舍五入实际年龄来创建年龄组。🧐
每10年为一组。️😘
head(df[, AgeDiscret := as.factor(round(Age / 10, 0))])
以30岁
为界限,进行任意拆分。🥳
head(df[, AgeCat := as.factor(ifelse(Age > 30, "Old", "Young"))])
df[, ID := NULL]
levels(df[, Treatment])
接着我们把分类数据转换为哑变量。😘
目的是将分类变量的每个值转换为二进制特征,也就是0和1
,也可以理解为稀疏矩阵。🧐
sparse_matrix <- sparse.model.matrix(Improved ~ ., data = df)[, -1]
head(sparse_matrix)
接着是数字向量,也就是我们后面用到的label
。😏
output_vector <- df[, Improved] == "Marked"
每行都显示模型对数据的解释程度,越低越好。👍
bst <- xgboost(data = sparse_matrix,
label = output_vector,
max_depth = 4,
eta = 1,
nthread = 2,
nrounds = 10,
objective = "binary:logistic")
每个变量的重要性可以通过Gain
,Cover
,frequency
来评估:👇
1️⃣ Frequency
。某个特征被用于在所有树中拆分数据的次数。
2️⃣ Cover
。首先得到某个特征被用于在所有树中拆分数据的次数,然后要利用经过这些拆分点的训练数据数量赋予权重。
3️⃣ Gain
。使用某个特征进行拆分时,获得的平均训练损失减少量。
importance <- xgb.importance(feature_names = colnames(sparse_matrix), model = bst)
head(importance)
可视化一下吧。😘
有点丑,以后我们再讲怎么美化。😜
xgb.plot.importance(importance_matrix = importance)
ggplot
版可视化。😜
xgb.ggplot.importance(importance_matrix = importance,
n_clusters = c(1:10)
)
最后祝大家早日不卷!~