<XG Boosting 알고리즘에 대해 설명>
XGBoost(Extreme Gradient Boosting)는 부스팅(Boosting) 알고리즘을 이용한 기계 학습 라이브러리입니다. 부스팅 알고리즘은 여러 개의 약한 모델(weak learner)을 학습하고 이들을 결합해 하나의 강한 모델(strong learner)을 만드는 알고리즘입니다.
XGBoost는 Gradient Boosting 알고리즘을 기반으로 하며, 이전 모델에서의 잔여 오차(residual error)를 다음 모델의 학습 데이터로 사용합니다. 이렇게 여러 개의 모델을 학습한 뒤, 이들을 결합해 하나의 강한 모델을 만들어 예측을 수행합니다.
XGBoost의 핵심 아이디어는 두 가지입니다. 첫째, 여러 개의 모델을 동시에 학습하여 시간을 단축시키는 것입니다. 이를 위해 병렬 처리를 지원하며, CPU와 GPU 모두에서 동작합니다. 둘째, 모델의 학습 중에 정규화(regularization)를 적용하여 과적합(overfitting)을 방지하는 것입니다. 이를 위해 L1, L2 정규화 뿐만 아니라, tree pruning과 같은 기술을 사용합니다.
L1 정규화를 사용하면, 가중치 중 일부가 0이 될 가능성이 있습니다. 이러한 특징을 이용해, 모델에서 중요하지 않은 변수를 제거하는 효과를 얻을 수 있습니다.
L2 정규화는 가중치의 크기를 모두 작게 만들어줍니다. 이러한 효과를 이용해, 모델이 입력 데이터의 작은 변화에 민감하지 않도록 하는 효과를 얻을 수 있습니다.
잔여 오차(residual error)를 이용해 새로운 모델을 학습하는 것은 Gradient Boosting 알고리즘에서 사용되는 방법입니다. 이 방법은 이전 모델에서의 잔여 오차(residual error)를 다음 모델의 학습 데이터로 사용하는 것입니다. 이렇게 여러 개의 모델을 학습한 뒤, 이들을 결합해 하나의 강한 모델을 만듭니다. 이 과정에서, 각 모델은 이전 모델에서의 잔여 오차(residual error)를 보정하는 역할을 합니다. 이렇게 하면, 이전 모델에서는 잘못 예측한 부분을 다음 모델에서 보완할 수 있습니다. 이러한 방식으로 여러 개의 모델을 결합하면, 높은 예측 성능을 얻을 수 있습니다.
XGBoost의 알고리즘은 크게 두 가지로 나뉩니다. 첫째, tree-based 알고리즘으로, 이전 모델에서의 잔여 오차를 이용해 새로운 모델을 학습합니다. 이때, Decision Tree 알고리즘을 사용합니다.
둘째, linear model-based 알고리즘으로, 선형 모델(linear model)을 이용해 예측을 수행합니다. 이 알고리즘은 tree-based 알고리즘이 과적합될 때 사용됩니다.
XGBoost의 성능은 대규모 데이터셋에서도 빠르고, 높은 예측 성능을 보입니다. 이러한 이유로, XGBoost는 기계 학습에서 가장 인기 있는 라이브러리 중 하나입니다.
# 필요한 라이브러리를 불러옵니다.
install.packages("xgboost")
install.packages("caret")
library(xgboost)
library(caret)
# wine quality 데이터셋을 불러옵니다.
https://archive.ics.uci.edu/ml/datasets/wine+quality
이곳에서 wine quality 데이터를 다운받아서 작업폴더에 넣은 후 csv파일을 읽어옵니다.
UCI Machine Learning Repository: Wine Quality Data Set
Wine Quality Data Set Download: Data Folder, Data Set Description Abstract: Two datasets are included, related to red and white vinho verde wine samples, from the north of Portugal. The goal is to model wine quality based on physicochemical tests (see [Cor
archive.ics.uci.edu
wine <- read.csv("winedata.csv")
# 데이터셋을 학습용과 테스트용으로 분리합니다.
set.seed(123)
train_index <- createDataPartition(wine$quality, p = 0.7, list = FALSE)
train <- wine[train_index, ]
test <- wine[-train_index, ]
# 학습용 데이터셋에서 설명 변수와 반응 변수를 분리합니다.
train_x <- train[, -12]
train_y <- train$quality
# 테스트용 데이터셋에서 설명 변수와 반응 변수를 분리합니다.
test_x <- test[, -12]
test_y <- test$quality
# XGBoost 모델을 학습합니다.
model <- xgboost(data = as.matrix(train_x), label = train_y, nrounds = 100, verbose = FALSE)
파라미터에 대해 설명해드리겠습니다.
data: 모델 학습에 사용될 설명 변수(독립 변수)를 포함한 학습용 데이터셋입니다. 여기서 as.matrix() 함수를 사용해 데이터셋을 행렬 형태로 변환합니다.
label: 모델 학습에 사용될 반응 변수(종속 변수)를 나타내는 변수입니다. 즉, 이 값이 모델이 예측해야 할 값입니다.
nrounds: 모델이 학습을 진행할 반복 횟수입니다. XGBoost는 부스팅(Boosting) 알고리즘을 이용하기 때문에, 여러 개의 약한 모델을 학습하고 이를 결합해 하나의 강한 모델을 만듭니다. 이 파라미터는 이러한 약한 모델의 개수를 결정합니다. 즉, nrounds 값이 클수록 모델이 더 많은 약한 모델들을 학습하게 됩니다.
verbose: 모델 학습 중에 진행 상황을 출력할지 여부를 결정하는 파라미터입니다. FALSE로 설정하면 출력을 하지 않습니다.
위 파라미터 외에도 XGBoost에는 다양한 파라미터가 존재합니다. 이들 파라미터는 모델의 성능을 향상시키기 위해 조절할 수 있으며, 사용되는 데이터셋과 문제에 따라 적절한 파라미터를 선택해야 합니다.
# 학습된 모델을 이용해 테스트용 데이터셋을 예측합니다.
predictions <- predict(model, as.matrix(test_x))
# 예측 결과와 실제 결과를 비교합니다.
error <- mean((predictions - test_y)^2)
print(paste("Mean Squared Error:", error))
[1] "Mean Squared Error: 0.371325475847748"
위 코드는 caret 패키지를 이용해 wine quality 데이터셋을 학습용과 테스트용으로 분리한 후, XGBoost 모델을 학습하고 테스트용 데이터셋을 예측한 뒤 예측 결과와 실제 결과를 비교하여 평균 제곱 오차(Mean Squared Error)를 계산합니다. 예측 결과와 실제 결과가 가까울수록 평균 제곱 오차가 작아지므로, 모델의 성능이 좋다고 판단할 수 있습니다.
제가 분석한 분석결과는 MSE(평균제곱오차) 값이 0.37로 %환산시 약 0.63 (63%)의 예측정확도를 보인다 할 수 있겠습니다.
<예측정확도 확인을 위한 타당성 분석>
# 정확도를 계산합니다.
accuracy <- confusionMatrix(predictions, test_data$quality)$overall["Accuracy"]
cat("Accuracy:", round(accuracy, 3), "\n")
# 정밀도, 재현율, f1 점수를 계산합니다.
precision <- confusionMatrix(predictions, test_data$quality)$byClass["Precision"]
recall <- confusionMatrix(predictions, test_data$quality)$byClass["Recall"]
f1_score <- confusionMatrix(predictions, test_data$quality)$byClass["F1"]
cat("Precision:", round(precision, 3), "\n")
cat("Recall:", round(recall, 3), "\n")
cat("F1 score:", round(f1_score, 3), "\n")
# ROC-AUC 값을 계산합니다.
roc_auc <- roc(test_data$quality, predictions)$auc
cat("ROC-AUC:", round(roc_auc, 3), "\n")
> cat("Accuracy:", round(accuracy, 3), "\n")
Accuracy: 0.71
> cat("Precision:", round(precision, 3), "\n")
Precision: 0.898
>cat("Recall:", round(recall, 3), "\n")
Recall: 0.516
>cat("F1 score:", round(f1_score, 3), "\n")
F1 score: 0.655
위 코드에서는 caret 패키지를 이용해 정확도, 정밀도, 재현율, f1 점수를 계산하고, pROC 패키지를 이용해 ROC-AUC 값을 계산합니다.
먼저, confusionMatrix() 함수를 이용해 정확도, 정밀도, 재현율, f1 점수를 계산합니다. 이 함수는 실제 값과 예측 값의 교차표를 생성한 뒤, 이를 이용해 다양한 평가 지표를 계산합니다.
이후, roc() 함수를 이용해 ROC 커브를 생성한 뒤, auc() 함수를 이용해 ROC-AUC 값을 계산합니다.
<와인데이터셋 설명>
fixed acidity: 와인의 산도
volatile acidity: 와인의 휘발성 산도
citric acid: 레몬산 등의 구연산 함량
residual sugar: 잔여 설탕 양
chlorides: 염화물 함량
free sulfur dioxide: 아황산 가스의 양
total sulfur dioxide: 총 아황산 가스의 양
density: 와인의 밀도
pH: 와인의 산성도
sulphates: 황산염 함량
alcohol: 와인의 알코올 함량
quality: 와인의 품질 (0 ~ 10 사이의 값)
이 데이터셋은 와인 제조사들이 자신들의 제품에 대해 품질 검사를 했을 때 얻은 데이터를 바탕으로 만들어졌습니다. 각각의 변수들은 와인의 특성을 나타내며, 이를 통해 와인의 품질을 예측하는 모델을 만들 수 있습니다.
'데이터분석-R코드' 카테고리의 다른 글
[R] wine데이터 품질 예측 랜덤포레스트 알고리즘 (0) | 2023.03.12 |
---|---|
[R] R에서 최강의 패키지 "tidyverse"파헤치기 (0) | 2023.03.12 |