Chuyển đến nội dung chính

Mô hình XGBOOST trong Rstudio


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

 Nguồn: https://www.kaggle.com/rtatman/machine-learning-with-xgboost-in-r
Tài liệu đọc thêm: https://xgboost.readthedocs.io/en/latest/R-package/xgboostPresentation.html




Nhận xét

Bài đăng phổ biến từ blog này