Memodelkan Data dengan Menggunakan Metode Random Forest
Pada tugas STA581 ini diminta untuk membuat model klasifikasi dengan mettode Random Forest pada data Investrment Risk Level berdasarkan beberapa variabel berikut ini:
- X1 capital adequacy ratio (%) average from last 5 years
- X2 GDP per capita (USD)
- X3 Gross External Debt (% of GDP) average from last 5 years
- X4 growth of consumer price (%) average from last 5 years
- X5 growth of population (%) average from last 5 years
- X6 growth of Real GDP (%) average from last 5 years
- X7 growth of Real GDP per cap. (%) average from last 5 years
- X8 Loan-deposit ratio (%) average from last 5 years
- X9 Net External Debt (% of GDP) average from last 5 years
- X10 Nominal GDP (USD bn)
- X11 Non-performing loans (% of gross loans) average from last 5 years
- X12 percentage of gross domestic investment to GDP (%) average from last 5 years
- X13 percentage of gross domestic saving to GDP (%) average from last 5 years
- X14 unemployment rate (% labour force) average from last 5 years
Adapun workflows yang dilakukan adalah sebagai berikut:
- Introduction
- Import dan Cleanning data
- Import data ke ekosistem mlr3
- Menentukan model yang digunakan
- Menentukan cara pembagian data
- Melakukan interpretasi model
- Melakukan training dan menghitung performa model
- Kesimpulan
Adapun Packages yang digunakan dalan pengerjaan tugas ini diantaranya:
#Libraries Used
library(readxl)
library(mice)
library(tidyverse)
library(mlr3verse)
library(remotes)
library(mlr3extralearners)
library(rpart.plot)
library(ranger)
adapun sintax yang digunakan untuk menginput data Investrment Risk Level adalah sebagai berikut:
#input Data
investment_risk <- read_excel("tugas STA581.xlsx")
investment_risk <- investment_risk[,-1]
str(investment_risk)
tibble [117 x 15] (S3: tbl_df/tbl/data.frame)
$ X1 : num [1:117] 17.5 18.2 18.7 NA 14 ...
$ X2 : num [1:117] 38675 40105 76038 27883 4251 ...
$ X3 : num [1:117] 172.8 103.5 31 24.8 89.6 ...
$ X4 : num [1:117] 0.68 1.77 2.63 1.29 1.44 ...
$ X5 : num [1:117] 1.221 0.87 1.489 1.753 0.256 ...
$ X6 : num [1:117] 1.79 2.66 1.85 2.23 4.75 ...
$ X7 : num [1:117] -2.084 -0.725 -1.901 -1.135 2.332 ...
$ X8 : num [1:117] 55 103 103 103 167 ...
$ X9 : num [1:117] -26.5 -13.6 -56.2 24.8 47.3 ...
$ X10 : num [1:117] 2.86 352.91 199.93 10.11 12.65 ...
$ X11 : num [1:117] 8 8.15 8.15 NA 6.6 ...
$ X12 : num [1:117] 23.1 24.9 20.4 21.7 19.4 ...
$ X13 : num [1:117] 26.9 32.5 31 17.3 15.1 ...
$ X14 : num [1:117] 3 2.45 NA NA 18.5 ...
$ Risk Level: chr [1:117] "low" "low" "low" "low" ...
Dari output diatas dapat dilihat ada kemungkinan terdapat missing value pada data Investrment Risk Level, sehingga langkah selanjutnya yaitu mengecek missing value pada data tersebut
Adapun sintaks yang digunakan untuk mengecek missing value adalah sebagai berikut:
#Mengecek Missing data
sum(is.na(investment_risk))
[1] 55
summary(is.na(investment_risk))
X1 X2 X3 X4
Mode :logical Mode :logical Mode :logical Mode :logical
FALSE:104 FALSE:117 FALSE:117 FALSE:117
TRUE :13
X5 X6 X7 X8
Mode :logical Mode :logical Mode :logical Mode :logical
FALSE:117 FALSE:117 FALSE:117 FALSE:108
TRUE :9
X9 X10 X11 X12
Mode :logical Mode :logical Mode :logical Mode :logical
FALSE:117 FALSE:117 FALSE:96 FALSE:117
TRUE :21
X13 X14 Risk Level
Mode :logical Mode :logical Mode :logical
FALSE:117 FALSE:105 FALSE:117
TRUE :12
md.pattern(investment_risk)
X2 X3 X4 X5 X6 X7 X9 X10 X12 X13 Risk Level X8 X14 X1 X11
76 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
15 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
7 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 2
8 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 3
3 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 2
1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 2
1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 3
1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 2
2 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 4
0 0 0 0 0 0 0 0 0 0 0 9 12 13 21 55
Dari hasil output diatas dapat dilihat bahwa terdapat missing value pada data Investrment Risk Level, sehingga langkah selanjutnya adalah mengestimasi missing value. Adapun metode yang akan di gunakan yaitu metode Expectation-Maximization (EM).
Adapun sintaks yang digunakan untuk menduga missing value adalah sebagai berikut:
#Menduga missing data
impute <- mice(investment_risk[,1:14], m = 3, seed = 123)
iter imp variable
1 1 X1 X8 X11 X14
1 2 X1 X8 X11 X14
1 3 X1 X8 X11 X14
2 1 X1 X8 X11 X14
2 2 X1 X8 X11 X14
2 3 X1 X8 X11 X14
3 1 X1 X8 X11 X14
3 2 X1 X8 X11 X14
3 3 X1 X8 X11 X14
4 1 X1 X8 X11 X14
4 2 X1 X8 X11 X14
4 3 X1 X8 X11 X14
5 1 X1 X8 X11 X14
5 2 X1 X8 X11 X14
5 3 X1 X8 X11 X14
data_lengkap<- complete(impute,1)
Y<-investment_risk$`Risk Level`
Y<-as.factor(Y)
data<-cbind(data_lengkap,Y)
summary(is.na(data))
X1 X2 X3 X4
Mode :logical Mode :logical Mode :logical Mode :logical
FALSE:117 FALSE:117 FALSE:117 FALSE:117
X5 X6 X7 X8
Mode :logical Mode :logical Mode :logical Mode :logical
FALSE:117 FALSE:117 FALSE:117 FALSE:117
X9 X10 X11 X12
Mode :logical Mode :logical Mode :logical Mode :logical
FALSE:117 FALSE:117 FALSE:117 FALSE:117
X13 X14 Y
Mode :logical Mode :logical Mode :logical
FALSE:117 FALSE:117 FALSE:117
Dari hasil output diatas dapat dilihat bahwa sudah tidak ada missing value pada data Investrment Risk Level. sehingga data sudah siap untuk dilakukan pemodelan.
Adapun sintaks yang digunakan adalah sebagai berikut:
#import data ke mlr3
task_risk = TaskClassif$new(id="risk", backend = data,
target ="Y",positive = "low")
seperti yang sudah di tentukan sebelumnya bahwa medel yang akan digunakan untuk mengklasifikasikan data yaitu Random forest. Adapun sintaks yang digunakan adalah sebagai berikut
#Menentukan Model
model_rf_classif <-lrn("classif.ranger",predict_type="prob",importance="impurity")
Dalam melakukan pembagian data akan digunakan metode Cross Validation dengan fold 10. Adapun sintaks yang dgunakan adalah sebagai berikut:
#Menentukan Cara Pembagian Data
resample_cv_classif = rsmp("cv", folds = 10)
set.seed(123)
resample_cv_classif$instantiate(task = task_risk)
Adapun sintaks yang digunakan adalah:
#Melakukan interfretasi model
model_rf_classif$train(task=task_risk)
model_rf_classif$model$variable.importance
X1 X10 X11 X12 X13 X14
1.393666 5.345288 4.325685 1.698773 3.317513 3.737622
X2 X3 X4 X5 X6 X7
14.039241 2.774893 4.106053 1.443611 0.951623 1.072926
X8 X9
1.417225 5.372877
importance_classif <- data.frame(Predictors = names(model_rf_classif$model$variable.importance),
impurity = model_rf_classif$model$variable.importance
)
rownames(importance_classif) <- NULL
importance_classif %>% arrange(desc(impurity))
Dari hasil output diatas dapat dilihat bahwa variabel prediktor yang paling berpengaruh yaitu X2,X9, X10 dan X11.
pada tahap ini akan di terapkan model yang sudah di definisikan sebelumnya pada data training dan kemudian mengevaluasi kemampuan prediiksi dengan data testing. Adapun sintaks yang akan di gunakan adalah sebagai berikut:
#menerapkan model pada data Train
train_test_classif = resample(task = task_risk,
learner = model_rf_classif,
resampling = resample_cv_classif,
store_models = TRUE
)
INFO [12:15:20.398] [mlr3] Applying learner 'classif.ranger' on task 'risk' (iter 6/10)
INFO [12:15:20.454] [mlr3] Applying learner 'classif.ranger' on task 'risk' (iter 7/10)
INFO [12:15:20.510] [mlr3] Applying learner 'classif.ranger' on task 'risk' (iter 3/10)
INFO [12:15:20.570] [mlr3] Applying learner 'classif.ranger' on task 'risk' (iter 2/10)
INFO [12:15:20.625] [mlr3] Applying learner 'classif.ranger' on task 'risk' (iter 5/10)
INFO [12:15:20.684] [mlr3] Applying learner 'classif.ranger' on task 'risk' (iter 10/10)
INFO [12:15:20.738] [mlr3] Applying learner 'classif.ranger' on task 'risk' (iter 8/10)
INFO [12:15:20.798] [mlr3] Applying learner 'classif.ranger' on task 'risk' (iter 4/10)
INFO [12:15:20.867] [mlr3] Applying learner 'classif.ranger' on task 'risk' (iter 9/10)
INFO [12:15:20.932] [mlr3] Applying learner 'classif.ranger' on task 'risk' (iter 1/10)
#memprediksi dengan data testing
prediksi_test = as.data.table(train_test_classif$prediction(),)
head(prediksi_test)
#Confusion matrix
train_test_classif$prediction()$confusion
truth
response low high
low 45 7
high 8 57
#melihat akurasi model
train_test_classif$aggregate(msr("classif.acc"))
classif.acc
0.8727273
#Menampilkan Kurtva ROC
autoplot(bmr_classif,type = "roc")
autoplot(bmr_classif,measure = msr("classif.acc"))
Berdasarkan Hasil perhitungan diatas data Investrment Risk Level diklasifikasikan dengan metode Random Forest dan diperoleh tingkat keakurasian sebesar 87,27% dan diperoleh beberapa variabel yang paling berpengaruh yaitu X2,X9, X10 dan X11.