XGBoost
XGBoost (viết tắt
của eXtreme Gradient Boosting) là một công cụ tăng cường đo hiệu quả đặc biệt.
Trong thực tế thì XGBoost được ứng dụng nhiều trong các bài toán phân loại và hồi
quy. Đặc biệt nó được sử dụng rất nhiều trong các cuộc thi Kaggle và các bài
chiến thắng thường sử dụng nó. Trong bài hướng dẫn này sẽ hướng dẫn bạn lấy tập
dữ liệu mới và nhờ XGBoost để đưa ra dự đoán.
Sau khi đọc bài
viết này bạn có thể học được
-
XGBoost là gì
-
Cách chuẩn bị dữ liệu
-
Cách đào tạo và điều chỉnh mô hình bằng XGBoost
-
Cách hình dung và khám phá mô hình của bạn
Bạn cần chuẩn bị
trước khi bắt đầu
1.
XGBoost là gì
XGBoost được triển
khai từ thuật toán của cây quyết định
Trải qua một chu
kỳ liên tục xây dựng các mô hình mới và kết hợp nó thành một mô hình tổng thể.
Thực hiện bắt đầu một chu trình bằng cách lấy mỗi mô hình hiện có và tính toán
các sai số cho mỗi quan sát trong tập dữ liệu. Sau đó xây dựng một mô hình mới
để dự đoán những lỗi này. Để đưa ra dự đoán, thêm các dự đoán từ tất cả các mô
hình trước đó. Chúng tôi có thể dử dụng những dự đoán này để tính toán các lỗi
mới, xây dựng mô hình tiếp theo vào nhóm.
2.
Thiết lập môi trường
Trước khi bắt đầu
bạn cần thiết lập môi trường của mình, gọi tên các thư viện mà chúng ta sẽ sử dụng:
library(xgboost) # thư viện dùng để dùng xgboost
library(tidyverse)
# thư viện dùng để xử lý dữ liệu
Bài nghiên cứu dự
đoán những đợt bùng dịch nào ở động vật khiến cho con người nhiễm bệnh
# read data frame
diseaseInfo <- read_csv("../input/Outbreak_240817.csv")
Trước khi bắt đầu
vào thực hiện công việc, thì cần xáo trộn tập dữ liệu. Chia tập dữ liệu thành
các tập như tập huấn luyện, tập thử nghiệm. Lựa chọn dữ liệu ngẫu nhiên.
# set a random seed & shuffle data frame
set.seed(1234)
diseaseInfo <- diseaseInfo[sample(1:nrow(diseaseInfo)), ]
Chuẩn bị dữ liệu
và chọn các biến đầu vào
Một trở ngại khi
bắt đầu với gói xgboost trong R là bạn không thể sử dụng nếu dữ liệu là dữ liệu
bảng. Hàm xgboost cốt lõi yêu cầu dữ liệu phải ở dạng ma trận.
Sử dụng hàm
Dmatrix để chuyển dạng dữ liệu sang dạng ma trận một cách hiệu quả.
Kiểm tra dữ liệu
hiện tại
head(diseaseInfo)
Dữ liệu có ở dạng
character, number,.. một số cột có những giá trị bị missing
Như bạn có thể
thấy dữ liệu của chúng ta cần được làm sạch trước khi chuyển sang dạng ma trận.
Để chuẩn bị tốt dữ liệu chúng ta cần hoàn thành:
-
Xóa thông tin về biến phụ thuộc khỏi dữ liệu đào
tạo
-
Giảm lượng thông tin dư thừa
-
Chuyển đổi dữ liệu character sang dạng dữ liệu số
với kỹ thuật onehotcoding
-
Chia tập dữ liệu thành tập con thử nghiệm và đào
tạo
-
Chuyển đổi khung dữ liệu đã được làm sạch bằng
Dmatrix
Trong tập dữ liệu
này thông tin về bệnh tật của con người nằm trong bốn cột
humansGenderDesc,
humansAge, humansAffected, humansDeaths. Chúng ta có thể loại bỏ cùng một lúc
các biến này bằng cách loại bỏ các cột bắt đầu bằng “human”.
# bỏ các biến bắt đầu bằng “human”
diseaseInfo_hunmansRemoved
<- diseaseInfo %>%
select(-starts_with(“human”)
Mặc dù đã loại bỏ
các biến phụ thuộc, nhưng chúng ta vẫn cần dán nhãn cho mô hình để thực hiện dự
đoán
# get a boolean vector of training labels
diseaseLabels <- diseaseInfo %>%
select(humansAffected)
%>% # get the column with the # of humans affected
is.na()
%>% # is it NA?
magrittr::not()
# switch TRUE and FALSE (using function from the magrittr package)
# check out the first few lines
head(diseaseLabels) # of our target variable
head(diseaseInfo$humansAffected) # of the original column
Giảm lượng thông
tin dư thừa
Vì dữ liệu ban đầu
có nhiều biến không có ý nghĩa chúng ta cần loại bỏ biến, loại bỏ các biến dữ
liệu không phải là số
# select just the numeric columns
diseaseInfo_numeric <- diseaseInfo_humansRemoved %>%
select(-Id) %>% # the case id shouldn't
contain useful information
select(-c(longitude,
latitude)) %>% # location data is also in country data
select_if(is.numeric)
# select remaining numeric columns
# make sure that our dataframe is all numeric
str(diseaseInfo_numeric)
Sử dụng kỹ thuật
one hot coding
# one-hot matrix for just the first few rows of the "country"
column
model.matrix(~country-1,head(diseaseInfo))
Chúng ta có thể
nghĩ rằng động vật trong nhà có nhiều nguy cơ mắc bệnh hơn động vật hoang dã,
chúng ta có thể thêm một biến mô tả nơi sống của động vật
diseaseInfo_numeric$is_domestic <-
str_detect(diseaseInfo$speciesDescription, "domestic")
Chúng ta cũng có
thể cho rằng khả năng mắc bệnh giữa các loài động vật là khác nhau. Vì luôn là
từ cuối cùng trong phần mô tả lòa nên chúng ta có thể lấy từ cuối cùng của mỗi
hàng và sử dụng từ đó để tạo ra một ma trận gồm các loài khác nhau
speciesList <- diseaseInfo$speciesDescription %>%
str_replace("[[:punct:]]", "")
%>% # remove punctuation (some rows have parentheses)
str_extract("[a-z]*$")
# extract the least word in each row
# convert our list into a dataframe...
speciesList <- tibble(species = speciesList)
# and convert to a matrix using 1 hot encoding
options(na.action='na.pass') # don't drop NA values!
species <- model.matrix(~species-1,speciesList)
Bây giờ chúng ta
cần gộp thông tin của các cột này vào với dữ liệu ban đầu
diseaseInfo_numeric <- cbind(diseaseInfo_numeric, region, species)
diseaseInfo_matrix <- data.matrix(diseaseInfo_numeric)
Chia tập dữ liệu
thành tập con thử nghiệm và đào tạo. Bây giờ đến một bước quan trọng là chia dữ
liệu. Điều này để xem mô hình của chúng ta có thực sự đủ mạnh để mở rộng cho những
quan sát mà chúng ta chưng thấy hay không. Nếu không thể thì đó không phải là một
mô hình hữu ích. Đối với dự án này sử dụng 70% dữ liệu để đào tạo và 30% dữ liệu
để thử nghiệm
# get the numb 70/30 training test split
numberOfTrainingSamples <- round(length(diseaseLabels) * .7)
# training data
train_data <- diseaseInfo_matrix[1:numberOfTrainingSamples,]
train_labels <- diseaseLabels[1:numberOfTrainingSamples]
# testing data
test_data <- diseaseInfo_matrix[-(1:numberOfTrainingSamples),]
test_labels <- diseaseLabels[-(1:numberOfTrainingSamples)]
Chuyển đổi dữ liệu
đã được làm sạch thành Dmatrix
# put our testing & training data into two seperates Dmatrixs objects
dtrain <- xgb.DMatrix(data = train_data, label= train_labels)
dtest <- xgb.DMatrix(data = test_data, label= test_labels)
Tóm lại để dữ liệu
có thể đưa vào hàm xgboost chúng ta cần
-
Xóa thông tin về biến mục tiêu ra khỏi dữ liệu
đào tạo
-
Giảm tải lượng thông tin dư thừa
-
Chuyển đổi thông tin phân loại (quốc gia,..)
sang định dạng số
-
Chia tập dữ liệu thành các tập con thử nghiệm và
đào tạo
-
Chuyển đổi khung dữ liệu đã được làm sạch thành
khung Dmatrix
-
Đào tạo mô hình đưa ra kết quả
Đào tạo mô hình
Sau khi có dữ liệu
đào tạo và dữ liệu thử nghiệm chúng ta bắt tay vào đào tạo mo hình và làm việc
trên các thông số tinh chỉnh
Để đào tạo dữ liệu
thì cần phải có các tham số
Dữ liệu: Dữ liệu
đầu vào
Số vòng huấn luyện:
Số lần cải thiện mô hình
Hàm mục tiêu:
(phân loại thì là binary logistic, không thì mặc định là hàm hồi quy tuyến
tính.
Nếu dữ liệu mất
cân bằng, chúng ta thêm tham số, nếu mô hình sau nhiều vòng mà vẫn không cải
thiện thì ngừng
negative_cases <- sum(train_labels == FALSE)
postive_cases <- sum(train_labels == TRUE)
model <- xgboost(data = dtrain, # the data
max.depth = 3, #
the maximum depth of each decision tree
nround
= 2, # max
number of boosting iterations
early_stopping_rounds
= 3, # nếu không cải thiện thì ngừng
objective = "binary:logistic",
scale_pos_weight = negative_cases/postive_cases,
gamma = 1)
Sau khi kết thúc
thì ta có thể ứng dụng với dữ liệu thử nghiệm
pred <- predict(model, dtest)
# get & print the classification error
err <- mean(as.numeric(pred > 0.5) !=
test_labels)
print(paste("test-error=", err))
Bây giờ chúng ta
đã có mô hình cơ bản, chúng ta có thể điều chỉnh các tham số theo mong muốn của
mình
Nhận xét
Đăng nhận xét