Pendahuluan

Sebelumnya, pada https://rpubs.com/bagusco/bagging, kita telah membahas mengenai Bagging sebagai salah satu pendekatan pohon klasifikasi ensemble untuk memperoleh model dengan kemampuan prediksi yang lebih baik. Pada dokumen ini akan didiskusikan pengembangan dari pendekatan tersebut yaitu Random Forest.

Secara umum Random Forest merupakan pengembangan dari Bagging, yaitu secara berkali-kali melakukan bootstrap terhadap data training dan menyusun pohon klasifikasi berdasarkan data hasil resampling tersebut, dan kemudian proses prediksi dilakukan dengan mengagregasi hasil prediksi dari banyak pohon yang umumnya menggunakan pendekatan majority vote.

Perbedaan antara Random Forest dan Bagging terletak pada proses penentuan splitting pada pembentukan pohon klasifikasi. JIka pada algoritma asalnya, untuk menentukan splitting terbaik dilakukan dengan memeriksa semua variabel prediktor, pohon-pohon pada random forest dibentuk dengan proses splitting yang memilih cara terbaik dari sebagian kecil variabel prediktor. SUbset variabel yang diperiksa diperoleh secara acak dari set variabel prediktor yang ada. Karena itu, bentuk pohon yang diperoleh pada algoritma ini dapat sangat berbeda dari satu pohon ke pohon yang lain. Proses ini diharapkan mampu memperkecil korelasi antar pohon sehingga efektifitas proses ensemble menjadi lebih baik.

Algoritma dasar dari random forest adalah sebagai berikut:
1.  Given a training data set
2.  Select number of trees to build (n_trees)
3.  for i = 1 to n_trees do
4.  |  Generate a bootstrap sample of the original data
5.  |  Grow a classification tree to the bootstrapped data
6.  |  for each split do
7.  |  | Select m_try variables at random from all p variables
8.  |  | Pick the best variable/split-point among the m_try
9.  |  | Split the node into two child nodes
10. |  end
11. | Use typical tree model stopping criteria to determine when a 
    | tree is complete (but do not prune)
12. end
13. Output ensemble of trees 

Implementasinya di R

Salah satu fungsi yang dapat digunakan untuk menjalankan algoritma Random Forest di R adalah randomForest() yang tersedia pada package randomForest.

Berikut ini ilustrasi penerapannya pada data winequality-red.csv yang memuat informasi karakteristik 1599 anggur merah di Portugas, beserta dengan hasil penilaian kualitasnya menurut pakar wine. Data diperoleh dari UCI Machine Learning Repository, pada laman https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/.

Nilai kualitas yang semula berada pada selang 0-10 dikelompokkan terlbeih dahulu menjadi dua kelas yaitu yang nilainya kurang dari atau sama dengan 6 masuk dalam kelas 0 (kurang), selainnya dimasukkan pada kelas 1 (baik).

Pada program di bawah ini, replikasi bootstrap yang dilakukan adalah 500 kali, yang berarti ada 500 kali pengambilan sampel ulang dari data dan 500 kali pembuatan pohon klasifikasi dari setiap sampel tersebut. Pohon yang dibuat sedemikian rupa dengan setting mtry=3 yang berarti bahwa pada proses splitting pemebntukan pohon klasifikasinya, hanya 3 variabel secara acak yang dicek/dibandingkan untuk menentukan splitting terbaik.

Algoritma dijalankan dan model yang diperoleh disimpan pada objek dengan nama model_rf .

#membaca data
data <- read.csv('D:/winequality-red.csv', sep=";",header = TRUE)

data$quality <- ifelse(data$quality <= 6, 0, 1)

#model random forest
library(randomForest)
## randomForest 4.6-14
## Type rfNews() to see new features/changes/bug fixes.
model_rf <- randomForest(as.factor(quality) ~ .,
                         data=data,
                         ntree = 1000, mtry=3)
model_rf
## 
## Call:
##  randomForest(formula = as.factor(quality) ~ ., data = data, ntree = 1000,      mtry = 3) 
##                Type of random forest: classification
##                      Number of trees: 1000
## No. of variables tried at each split: 3
## 
##         OOB estimate of  error rate: 8.19%
## Confusion matrix:
##      0   1 class.error
## 0 1346  36   0.0260492
## 1   95 122   0.4377880

Terlihat dari hasil di atas bahwa berdasarkan amatan OOB (out-of-bag), tingkat kesalahan klasifikasi yang diperoleh adalah sekitar 8.2% atau akurasi sebesar 91.8%.

Seperti yang dijelaskan pada video Ensemble Tree - Random Forest (https://youtu.be/02Nro0cTjqw), akurasi ini cenderung lebih tinggi jika kita melihat hasil pengerjaan yang sama menggunakan Bagging yang terdapat pada dokumen https://rpubs.com/bagusco/bagging

Melakukan Prediksi

Jika model sudah didapatkan, maka melakukan prediksi dapat dilakukan dengan mudah menggunakan fungsi predict() terhadap amatan yang tersimpan pada suatu dataframe.

Berikut ini ilustrasi proses prediksi kualitas anggur merah dengan karakteristik sebagai berikut:

1 - fixed acidity = 8.1

2 - volatile acidity = 0.45

3 - citric acid = 0.10

4 - residual sugar = 2.1

5 - chlorides = 0.080

6 - free sulfur dioxide = 14

7 - total sulfur dioxide = 43

8 - density = 0.9981

9 - pH = 4.50

10 - sulphates = 0.64

11 - alcohol = 10.3

Hasil prediksi menunjukkan bahwa kualitas anggur tersebut tergolong kurang (kategori 0).

anggurbaru <- data.frame(
  fixed.acidity = 8.1,
  volatile.acidity = 0.45,
  citric.acid = 0.10,
  residual.sugar = 2.1,
  chlorides = 0.080,
  free.sulfur.dioxide = 14,
  total.sulfur.dioxide = 43,
  density = 0.9981,
  pH = 4.50,
  sulphates = 0.64,
  alcohol = 10.3)
prediksi <- predict(model_rf, newdata=anggurbaru)
prediksi
## 1 
## 0 
## Levels: 0 1