library(dplyr) #數(shù)據(jù)處理使用
library(data.table) #數(shù)據(jù)讀取使用
library(xgboost) #模型使用
library(Matrix) #模型數(shù)據(jù)處理使用
library(caret) # 調(diào)參和計(jì)算模型評(píng)價(jià)參數(shù)使用
library(pROC) #繪圖使用
library(ggplot2) #繪圖使用
library(ggpubr) #繪圖使用
library(ggprism) #繪圖使用
# 讀取數(shù)據(jù)
data <- fread("./XGBoost.txt",data.table = F) # 替換為你的數(shù)據(jù)文件名或路徑

數(shù)據(jù)長(zhǎng)這個(gè)樣子,一共35727行,214列。每一行代表一個(gè)樣本,第一列是樣本標(biāo)簽malignantnormal,后面213列是213個(gè)特征。我們想根據(jù)213個(gè)特征,使用RF訓(xùn)練出一個(gè)能夠?qū)颖具M(jìn)行精準(zhǔn)分類的模型。

構(gòu)建XGBoost模型

# 將分類轉(zhuǎn)換成0和1
data <- data %>% mutate(type = ifelse(type == "normal",1,0))
# 分割數(shù)據(jù)為訓(xùn)練集和測(cè)試集
set.seed(123) # 設(shè)置隨機(jī)種子,保證結(jié)果可復(fù)現(xiàn)
split <- sample.split(data$type, SplitRatio = 0.8) # 將數(shù)據(jù)按照指定比例分割
train_data <- subset(data, split == TRUE) # 訓(xùn)練集
test_data <- subset(data, split == FALSE) # 測(cè)試集

# 定義訓(xùn)練集特征和目標(biāo)變量
X_train <- train_data[, -1]
y_train <- train_data[, 1]

# 將特征和目標(biāo)變量轉(zhuǎn)換為DMatrix格式
dtrain <- xgb.DMatrix(data = as.matrix(X_train), label = y_train)
# 設(shè)置XGBoost參數(shù)
params <- list(objective = "binary:logistic", eval_metric = "logloss", eta = 0.1, max_depth = 3)
# 設(shè)置迭代輪數(shù)(樹的數(shù)量)
nrounds <- 100
# 訓(xùn)練XGBoost模型
xgb_model <- xgboost(params = params, data = dtrain, nrounds = nrounds)

# 在訓(xùn)練集上進(jìn)行預(yù)測(cè)
train_predictions <- predict(xgb_model, newdata = dtrain)
train_predictions <- ifelse(train_predictions > 0.5,1,0)

# 計(jì)算準(zhǔn)確率
accuracy <- mean(train_predictions == y_train)
print(paste("訓(xùn)練集準(zhǔn)確率:", accuracy))

# 在測(cè)試集上進(jìn)行預(yù)測(cè)
X_test <- test_data[, -1]
y_test <- as.factor(test_data[, 1])

dtest <- xgb.DMatrix(data = as.matrix(X_test))
test_predictions <- predict(xgb_model, newdata = dtest)
test_predictions <- ifelse(test_predictions > 0.5,1,0)

# 計(jì)算準(zhǔn)確率
accuracy <- mean(test_predictions == y_test)
print(paste("測(cè)試集準(zhǔn)確率:", accuracy))

從accuracy來(lái)看,初始模型在訓(xùn)練集和測(cè)試集中表現(xiàn)的都挺好的。

使用caret包進(jìn)行調(diào)參

caret包中,XGBoost模型有七個(gè)參數(shù)可以進(jìn)行調(diào)節(jié)。

##參數(shù)調(diào)整
# 將數(shù)據(jù)集轉(zhuǎn)換為trainControl對(duì)象
ctrl <- trainControl(
method = "cv", # 交叉驗(yàn)證
number = 5, # 5折交叉驗(yàn)證
verboseIter = FALSE)

# 設(shè)置參數(shù)網(wǎng)格
param_grid <- expand.grid(
nrounds = c(100, 200), # 迭代輪數(shù)(nrounds)
max_depth = c(3, 6), # 最大樹深度(max_depth)
eta = c(0.1), # 學(xué)習(xí)率(eta)
gamma = c(0, 0.1), # 樹分裂所需的最小損失減少值
colsample_bytree = c(0.8), # 特征子采樣比例(colsample_bytree)
min_child_weight = c(1, 3), # 葉子節(jié)點(diǎn)的最小權(quán)重和(min_child_weight)
subsample = c(0.8)) # 和樣本子采樣比例(subsample)

# 使用train()函數(shù)進(jìn)行參數(shù)調(diào)優(yōu)
xgb_model <- train(
x = X_train,
y = y_train,
method = "xgbTree",
trControl = ctrl,
tuneGrid = param_grid)

# 輸出最佳參數(shù)配置
print(xgb_model$bestTune)

使用最佳參數(shù)訓(xùn)練模型

# 設(shè)置最佳XGBoost參數(shù)
params <- list(objective = "binary:logistic", eval_metric = "logloss",
eta = 0.1, max_depth = 3, gamma = 0.1,
colsample_bytree = 0.8,
min_child_weight = 1,
subsample = 0.8)

# 訓(xùn)練模型
xgb_model_final <- xgb.train(params = params, data = dtrain, nrounds = 200)

# 在訓(xùn)練集上進(jìn)行預(yù)測(cè)
train_predictions <- predict(xgb_model_final, newdata = dtrain)
train_predictions <- ifelse(train_predictions > 0.5,1,0)
# 計(jì)算準(zhǔn)確率
accuracy <- mean(train_predictions == y_train)
print(paste("訓(xùn)練集準(zhǔn)確率:", accuracy))

# 在測(cè)試集上進(jìn)行預(yù)測(cè)
X_test <- test_data[, -1]
y_test <- as.factor(test_data[, 1])
dtest <- xgb.DMatrix(data = as.matrix(X_test))
test_predictions <- predict(xgb_model_final, newdata = dtest)
test_predictions <- ifelse(test_predictions > 0.5,1,0)

# 計(jì)算準(zhǔn)確率
accuracy <- mean(test_predictions == y_test)
print(paste("測(cè)試集準(zhǔn)確率:", accuracy))

調(diào)參之后的模型比初始模型表現(xiàn)提升了一些。

本文章轉(zhuǎn)載微信公眾號(hào)@Bio小菜鳥

上一篇:

R語(yǔ)言實(shí)現(xiàn)隨機(jī)森林(RF)以及繪制ROC曲線和混淆矩陣

下一篇:

【Elasticsearch】使用阿里云 infererence API 及 semantic text 進(jìn)行向量搜索
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)