Random Forest

Compiled by: Suprapto van Plaosan

Algoritma Random Forest

  • Random forest adalah suatu algoritma yang digunakan untuk klasifikasi data dalam jumlah yang besar
  • Random forest merupakan kombinasi dari masing – masing pohon (tree) dari model Decision Tree yang baik, dan kemudian dikombinasikan ke dalam satu model.
  • Penggunaan tree yang semakin banyak akan mempengaruhi akurasi yang akan didapatkan menjadi lebih baik. Penentuan klasifikasi dengan random forest diambil berdasarkan hasil voting dari tree yang terbentuk.
  • Rangkaian yang tersusun dari tree dengan masing-masing pohon berisi kumpulan variabel acak. Untuk vektor acak dinyatakan dengan X = ($ X_1 $, ..., $ X_p $), X mewakili input yang bernilai nyata dan variabel acak Y mewakili respons bernilai riil.
  • $ P_XY $(X, Y) diasumsikan sebagai distribusi gabungan yang belum diketahui. Tujuannya untuk menemukan f(X) dalam memprediksi Y. Fungsi prediksi ditentukan oleh loss function, yaitu L (Y, f(X)). yang dinyatakan dengan persamaan:

    $E_XY$(L(Y,f(X)))

Persamaan diatas menunjukkan hubungan distribusi X dan Y L(Y, f (X)) adalah hubungan seberapa dekat f(X) dengan Y, L adalah squared error loss

L(Y, f(X))= $ (Y-f(X))^2$ untuk regresi dan zero one loss untuk klasifikasi yang dinyatakan sebagai:

L(Y,f(X))= I(Y($\ne$ f(X)) = $\begin{cases} \mbox {0 if Y = f(x)} \\ \mbox {1 otherwise} \end{cases} $

Ternyata fungsi $E_XY$(L(Y,f(X))) untuk meminimalkan squared error loss dan kesalahan kuadrat yang dinyatakan dengan:

f(x) = E(Y|X=x)

atau dikenal sebagai fungsi regresi. Dalam klasifikasi, jika himpunan nilai-nilai yang tepat dari Y dilambangkan dengan $y$, maka akan meminimalkan nilai $E_XY$(L(Y,f(X))) untuk zero-one loss dan di dapatkan:

atau dikenal sebagai aturan Bayes.

Rangkaian yang menyusun f disebut base learners h1 (x), ..., hJ (x) dan base learners digabungkan untuk memberikan ensemble predictor f (x). Dalam regresi, rata-rata base learners dinyatakan:

f(x) = $\frac{1}{J}$ $ \sum^{1}_{j=1} {h_j(x)}$

Sedangkan dalam klasifikasi, f(x) merupakan class/kelas yang paling sering diprediksi (voting):

Dalam Random Forests base learners “j” ditandai sebagai hj (X, Θj), di mana Θj adalah kumpulan variabel acak dan Θj adalah independen untuk j = 1, 2,3 ..., J. Untuk memahami algoritma Random Forest, penting untuk memiliki pengetahuan mendasar tentang jenis pohon yang digunakan sebagai base learner.

Random Forest Classifier & Regressor

Pendahuluan

  • Pohon-pohon yang digunakan dalam Random Forest didasarkan pada pohon partisi rekursif biner dalam monograf. Pohon-pohon ini mempartisi ruang prediktor menggunakan urutan partisi biner ("splits") pada variabel individual.
  • Root node dari pohon terdiri dari seluruh ruang prediktor.
  • Node yang tidak terpecah disebut terminal nodes dan membentuk partisi akhir dari ruang prediktor. Setiap nonterminal node terbagi menjadi dua node turunan, satu di sebelah kiri dan satu di sebelah kanan, sesuai dengan nilai salah satu variabel prediktor.
  • Untuk variabel prediktor kontinu, pemisahan ditentukan oleh titik-split. Poin yang prediktornya lebih kecil dari titik perpecahan ke kiri, sisanya ke kanan yang diilustrasikan oleh gambar berikut:

Pembagian yang digunakan pohon untuk mempartisi sebuah node menjadi dua turunannya dipilih dengan mempertimbangkan setiap kemungkinan pemisahan pada setiap variabel prediktor dan memilih yang "terbaik" sesuai dengan beberapa kriteria. Dalam regresi, jika nilai respons pada node adalah y1, ..., yn, kriteria pemisahan yang khas adalah rata-rata kuadrat pada node yang dinyatakan sebagai:

Q = $ \frac{1}{n} $ $ \sum^{n}_{i=1} {(y_i - \bar y)^2}$

dimana

$ \bar{y}$ = $ \frac{1}{n} $ $ \sum^{n}_{i=1} {1 y_i}$

merupakan nilai prediksi pada simpul (rata-rata nilai respons). Dalam konteks klasifikasi di mana kelas K dilambangkan 1,. . . , K, kriteria pemisahan yang umum adalah indeks Gini yang dinyatakan:

Q = $ \sum^{K}_{k\ne k'} {\hat Pk \hat Pk'}$

Dimana

$ \hat{Pk}$

merupakan pengamatan kelas 'k' dalam simpul yang dinyatakan:

$ \hat{Pk}$ = $ \frac{1}{n} $ $ \sum^{n}_{i=1} {y_i = k}$

Kriteria pemisahan di ukur berdasarkan ‘goodness of fit’ (regresi) atau kemurnian (klasifikasi) untuk sebuah node, dengan nilai yang besar mewakili ‘poor fit’ (regresi) atau node tidak murni (klasifikasi). Pemisahan menciptakan dua node turunan, satu di sebelah kiri dan satu di sebelah kanan. hal ini menunjukkan kriteria pemisahan untuk dua turunan sebagai QL dan QR dan ukuran sampel mereka dengan nL dan nR, pemisahan dipilih untuk meminimalkan Qsplit = nLQL + nRQR.

Untuk variabel prediktor kontinu, pemisahan terbaik memerlukan pengurutan nilai-nilai prediktor dan mempertimbangkan pemisahan antara setiap pasangan yang berbeda dari nilai berturut-turut. Nilai-nilai QL, QR dan Qsplit dihitung untuk masing-masing titik perpecahan yang mungkin, biasanya menggunakan algoritma. Untuk variabel prediktor kategori, QL, QR dan Qsplit dihitung untuk memilih subset kategori setiap turunan node.

Setelah pemisahan telah dipilih, data dipartisi ke dalam dua node turunan dan masing-masing node diperlakukan dengan cara yang sama seperti simpul asli. Prosedur berlanjut secara rekursif sampai kriteria berhenti terpenuhi. Sebagai contoh, prosedur dapat berhenti ketika semua node yang tidak terhubung mengandung lebih sedikit dari beberapa kasus tertentu. Ketika kriteria terpenuhi dan berhenti, simpul yang tidak terhubung disebut “terminal node”. Nilai prediksi diperoleh untuk semua pengamatan di terminal node dengan rata-rata respons untuk masalah regresi atau menghitung kelas yang paling sering untuk masalah klasifikasi.

image.png

Random Forest Classifier

Random Forest bagus untuk klasifikasi. Dapat digunakan untuk membuat prediksi kategori dengan beberapa nilai yang mungkin dan dapat dikalibrasi untuk probabilitas output. Satu hal yang perlu diwaspadai adalah overfitting. Random Forest rawan terjadi overfitting, terutama ketika bekerja dengan dataset yang relatif kecil. Perlu di curigai jika model data dapat membuat prediksi yang "terlalu bagus" pada set uji menggunakan Random Forest. Salah satu cara overfitting adalah menggunakan fitur yang benar-benar relevan dalam model data yang digunakan.

Random Forest Regressor

Random Forest dapat digunakan sebagai regresi dengan memperluas 'tree' sepenuhnya sehingga setiap daun memiliki tepat satu nilai. Breiman menyarankan untuk membuat regresi random forest dengan cara memperluas pohon secara acak. Kemudian sebuah prediksi secara sederhana mengembalikan variabel respon individual dari distribusi dapat dibangun jika 'forest' cukup besar. Satu peringatan bahwa perkembangan 'tree' sepenuhnya dapat menutupi atau melebihi kapasitas: jika itu terjadi, intervalnya akan sia-sia, seperti prediksi. Hal yang diharapkan adalah sama seperti akurasi dan presisi.

Parameter Random Forest

  • n_estimators : Menunjukkan banyaknya pohon dalam hutan
  • criterion : Untuk mengukur kualitas split. Kriteria yang didukung adalah "gini" untuk ketidakmurnian dan "entropi" untuk perolehan informasi.
  • max_depth : dalam bentuk bilangan bulat atau tidak ada. Menunjukkan edalaman maksimum pohon. Jika tidak ada, maka node diperluas sampai semua daun murni atau sampai semua daun mengandung kurang dari sampel min_samples_split.
  • min_samples_split : Jumlah sampel minimum yang diperlukan untuk membelah simpul internal. Jika int, maka min_samples_split dipertimbangkan sebagai angka minimum. Jika float, maka min_samples_split adalah sebagian kecil dan ceil (min_samples_split * n_samples) adalah jumlah sampel minimum untuk setiap pemisahan.
  • min_samples_leaf : Jumlah minimum sampel yang diperlukan berada pada simpul daun. Titik perpecahan pada kedalaman apa pun hanya akan dipertimbangkan jika min_samples_leaf masing-masing di cabang kiri dan kanan.
  • Jika int, maka pertimbangkan min_samples_leaf sebagai angka minimum.
  • Jika float, maka min_samples_leaf merupakan pecahan dan ceil (min_samples_leaf * n_samples) adalah jumlah sampel minimum untuk setiap node.
  • min_weight_fraction_leaf : Pecahan minimum dari jumlah total semua sampel input yang diperlukan dan berada pada simpul daun. Sampel memiliki berat yang sama ketika sample_weight tidak disediakan.
  • max_features : Jumlah fitur yang perlu dipertimbangkan saat mencari pemisahan terbaik
  • Jika int, maka pertimbangkan max_features di setiap pemisahan.
  • Jika float, maka max_features adalah sebagian kecil dan fitur int (max_features * n_features) perlu dipertimbangkan pada setiap pemisahan.
  • Jika "otomatis", maka max_features = sqrt (n_features).
  • Jika "sqrt", maka max_features = sqrt (n_features) (sama seperti "auto").
  • Jika “log2”, maka max_features = log2 (n_features).
  • Jika Tidak Ada, maka max_features = n_features.
  • max_leaf_nodes : Tumbuhnya pohon max_leaf_nodes. Node terbaik didefinisikan sebagai pengurangan relatif dalam pengotor. Jika tidak ada maka jumlah node daun tidak terbatas.
  • min_impurity_decrease : Node akan terpecah jika pembagian ini menginduksi pengotor yang lebih besar atau sama dengan nilai ini.
  • Persamaan penurunan pengotor tertimbang adalah sebagai berikut:
  • N_t / N (impurity - N_t_R / N_t right_impurity
  • N_t / N (impurity - N_t_L / N_t left_impurity), di mana N adalah jumlah total sampel, N_t adalah jumlah sampel pada simpul saat ini, N_t_L adalah jumlah sampel pada anak kiri, dan N_t_R adalah jumlah sampel pada anak kanan.
  • min_impurity_split : Ambang batas untuk penghentian awal pertumbuhan pohon. Suatu simpul akan terpecah jika kemurniannya berada di atas ambang batas, jika tidak maka ia adalah daun.Gunakan min_impurity_decrease
  • bootstrap : seluruh dataset digunakan untuk membangun setiap pohon.
  • oob_score : menggunakan sampel out-of-bag untuk memperkirakan akurasi generalisasi.
  • n_jobs : Jumlah pekerjaan yang harus dijalankan secara paralel untuk kecocokan dan prediksi.

Atribut Random Forest

  • estimators_ : koleksi sub-estimator yang dipasang
  • classes_ : Label kelas (masalah output tunggal), atau daftar susunan label kelas (multi-output-problem).
  • nclasses : Jumlah kelas (masalah output tunggal), atau daftar yang berisi jumlah kelas untuk setiap output (multi-output-problem).
  • nfeatures : Jumlah fitur saat dilakukan fitting.
  • noutputs : Jumlah output saat dilakukan fitting.
  • array of shape : Mengembalikan kepentingan fitur (semakin tinggi, semakin penting fitur).
  • oobscore : Nilai dataset diperoleh dengan menggunakan perkiraan out-of-bag.
  • oob_decisionfunction : Fungsi keputusan dihitung dengan memperkiraan out-of-bag pada training set. Jika n_estimators kecil, kemungkinan titik data tidak ditinggalkan selama bootstrap. Dalam hal ini, oob_decisionfunction mungkin mengandung NaN.
  • random_state : Jika int, random_state adalah seed yang digunakan oleh generator angka acak; Jika instance RandomState, random_state adalah pembuat angka acak; Jika tidak ada, generator angka acak adalah instance keadaan acak yang digunakan oleh np.random.
  • verbose : Mengontrol verbositas saat fitting dan prediksi.
  • warm_start : Ketika disetel ke True, gunakan kembali panggilan sebelumnya untuk menyesuaikan dan tambahkan lebih banyak penaksir ke ansambel, jika tidak, paskan seluruh hutan baru.

Kelebihan

  • Menghasilkan eror yang lebih rendah.
  • Memberikan hasil yang bagus dalam klasifikasi.
  • Dapat mengatasi data training dalam jumlah sangat besar secara efisien.
  • Metode yang efektif untuk mengestimasi hilangnya data.
  • Dapat memperkiraan variabel apa yang penting dalam klasifikasi.
  • Menyediakan metode eksperimental untuk mendeteksi interaksi variabel.

Kekurangan

  • Waktu pemrosesan yang lama karena menggunakan data yang banyak dan membangun model tree yang banyak pula untuk membentuk random trees karena menggunakan single processor.
  • Interpretasi yang sulit dan membutuhkan mode penyetelan yang tepat untuk data.
  • ketika digunakan untuk regresi, mereka tidak dapat memprediksi di luar kisaran dalam data percobaan, hal ini di mungkinkan data terlalu cocok dengan kumpulan data pengganggu (noisy).

Contoh Random Forest Classifier

In [1]:
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
from sklearn.datasets import load_iris
iris=load_iris()
X= pd.DataFrame(iris.data, columns=iris.feature_names)
X.tail()
Out[1]:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
145 6.7 3.0 5.2 2.3
146 6.3 2.5 5.0 1.9
147 6.5 3.0 5.2 2.0
148 6.2 3.4 5.4 2.3
149 5.9 3.0 5.1 1.8
In [2]:
Y= iris.target
Y
Out[2]:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
In [3]:
clf = RandomForestClassifier(n_estimators=100, max_depth=2,
                             random_state=0)
clf.fit(X, Y)  






print(clf.feature_importances_)

print(clf.predict([[6.7, 3.0, 5.2, 2.3]]))
[0.10144835 0.00635724 0.46628917 0.42590525]
[2]

Contoh Random Forest Regressor

In [4]:
>>> from sklearn.ensemble import RandomForestRegressor
import pandas as pd
>>> from sklearn.datasets import load_boston
boston=load_boston()
X= pd.DataFrame(boston.data, columns=boston.feature_names)
X.tail()
Out[4]:
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT
501 0.06263 0.0 11.93 0.0 0.573 6.593 69.1 2.4786 1.0 273.0 21.0 391.99 9.67
502 0.04527 0.0 11.93 0.0 0.573 6.120 76.7 2.2875 1.0 273.0 21.0 396.90 9.08
503 0.06076 0.0 11.93 0.0 0.573 6.976 91.0 2.1675 1.0 273.0 21.0 396.90 5.64
504 0.10959 0.0 11.93 0.0 0.573 6.794 89.3 2.3889 1.0 273.0 21.0 393.45 6.48
505 0.04741 0.0 11.93 0.0 0.573 6.030 80.8 2.5050 1.0 273.0 21.0 396.90 7.88
In [5]:
Y=boston.target
Y
Out[5]:
array([24. , 21.6, 34.7, 33.4, 36.2, 28.7, 22.9, 27.1, 16.5, 18.9, 15. ,
       18.9, 21.7, 20.4, 18.2, 19.9, 23.1, 17.5, 20.2, 18.2, 13.6, 19.6,
       15.2, 14.5, 15.6, 13.9, 16.6, 14.8, 18.4, 21. , 12.7, 14.5, 13.2,
       13.1, 13.5, 18.9, 20. , 21. , 24.7, 30.8, 34.9, 26.6, 25.3, 24.7,
       21.2, 19.3, 20. , 16.6, 14.4, 19.4, 19.7, 20.5, 25. , 23.4, 18.9,
       35.4, 24.7, 31.6, 23.3, 19.6, 18.7, 16. , 22.2, 25. , 33. , 23.5,
       19.4, 22. , 17.4, 20.9, 24.2, 21.7, 22.8, 23.4, 24.1, 21.4, 20. ,
       20.8, 21.2, 20.3, 28. , 23.9, 24.8, 22.9, 23.9, 26.6, 22.5, 22.2,
       23.6, 28.7, 22.6, 22. , 22.9, 25. , 20.6, 28.4, 21.4, 38.7, 43.8,
       33.2, 27.5, 26.5, 18.6, 19.3, 20.1, 19.5, 19.5, 20.4, 19.8, 19.4,
       21.7, 22.8, 18.8, 18.7, 18.5, 18.3, 21.2, 19.2, 20.4, 19.3, 22. ,
       20.3, 20.5, 17.3, 18.8, 21.4, 15.7, 16.2, 18. , 14.3, 19.2, 19.6,
       23. , 18.4, 15.6, 18.1, 17.4, 17.1, 13.3, 17.8, 14. , 14.4, 13.4,
       15.6, 11.8, 13.8, 15.6, 14.6, 17.8, 15.4, 21.5, 19.6, 15.3, 19.4,
       17. , 15.6, 13.1, 41.3, 24.3, 23.3, 27. , 50. , 50. , 50. , 22.7,
       25. , 50. , 23.8, 23.8, 22.3, 17.4, 19.1, 23.1, 23.6, 22.6, 29.4,
       23.2, 24.6, 29.9, 37.2, 39.8, 36.2, 37.9, 32.5, 26.4, 29.6, 50. ,
       32. , 29.8, 34.9, 37. , 30.5, 36.4, 31.1, 29.1, 50. , 33.3, 30.3,
       34.6, 34.9, 32.9, 24.1, 42.3, 48.5, 50. , 22.6, 24.4, 22.5, 24.4,
       20. , 21.7, 19.3, 22.4, 28.1, 23.7, 25. , 23.3, 28.7, 21.5, 23. ,
       26.7, 21.7, 27.5, 30.1, 44.8, 50. , 37.6, 31.6, 46.7, 31.5, 24.3,
       31.7, 41.7, 48.3, 29. , 24. , 25.1, 31.5, 23.7, 23.3, 22. , 20.1,
       22.2, 23.7, 17.6, 18.5, 24.3, 20.5, 24.5, 26.2, 24.4, 24.8, 29.6,
       42.8, 21.9, 20.9, 44. , 50. , 36. , 30.1, 33.8, 43.1, 48.8, 31. ,
       36.5, 22.8, 30.7, 50. , 43.5, 20.7, 21.1, 25.2, 24.4, 35.2, 32.4,
       32. , 33.2, 33.1, 29.1, 35.1, 45.4, 35.4, 46. , 50. , 32.2, 22. ,
       20.1, 23.2, 22.3, 24.8, 28.5, 37.3, 27.9, 23.9, 21.7, 28.6, 27.1,
       20.3, 22.5, 29. , 24.8, 22. , 26.4, 33.1, 36.1, 28.4, 33.4, 28.2,
       22.8, 20.3, 16.1, 22.1, 19.4, 21.6, 23.8, 16.2, 17.8, 19.8, 23.1,
       21. , 23.8, 23.1, 20.4, 18.5, 25. , 24.6, 23. , 22.2, 19.3, 22.6,
       19.8, 17.1, 19.4, 22.2, 20.7, 21.1, 19.5, 18.5, 20.6, 19. , 18.7,
       32.7, 16.5, 23.9, 31.2, 17.5, 17.2, 23.1, 24.5, 26.6, 22.9, 24.1,
       18.6, 30.1, 18.2, 20.6, 17.8, 21.7, 22.7, 22.6, 25. , 19.9, 20.8,
       16.8, 21.9, 27.5, 21.9, 23.1, 50. , 50. , 50. , 50. , 50. , 13.8,
       13.8, 15. , 13.9, 13.3, 13.1, 10.2, 10.4, 10.9, 11.3, 12.3,  8.8,
        7.2, 10.5,  7.4, 10.2, 11.5, 15.1, 23.2,  9.7, 13.8, 12.7, 13.1,
       12.5,  8.5,  5. ,  6.3,  5.6,  7.2, 12.1,  8.3,  8.5,  5. , 11.9,
       27.9, 17.2, 27.5, 15. , 17.2, 17.9, 16.3,  7. ,  7.2,  7.5, 10.4,
        8.8,  8.4, 16.7, 14.2, 20.8, 13.4, 11.7,  8.3, 10.2, 10.9, 11. ,
        9.5, 14.5, 14.1, 16.1, 14.3, 11.7, 13.4,  9.6,  8.7,  8.4, 12.8,
       10.5, 17.1, 18.4, 15.4, 10.8, 11.8, 14.9, 12.6, 14.1, 13. , 13.4,
       15.2, 16.1, 17.8, 14.9, 14.1, 12.7, 13.5, 14.9, 20. , 16.4, 17.7,
       19.5, 20.2, 21.4, 19.9, 19. , 19.1, 19.1, 20.1, 19.9, 19.6, 23.2,
       29.8, 13.8, 13.3, 16.7, 12. , 14.6, 21.4, 23. , 23.7, 25. , 21.8,
       20.6, 21.2, 19.1, 20.6, 15.2,  7. ,  8.1, 13.6, 20.1, 21.8, 24.5,
       23.1, 19.7, 18.3, 21.2, 17.5, 16.8, 22.4, 20.6, 23.9, 22. , 11.9])
In [6]:
clf = RandomForestRegressor(n_estimators=100, max_depth=2,random_state=0)
clf.fit(X, Y)  

print(clf.feature_importances_)

print(clf.predict([[0.06263, 0.0, 11.93, 0.0, 0.573, 6.593, 69.1, 2.4786, 1.0, 273.0, 21.0, 391.99, 9.67]]))
[0.00622026 0.         0.         0.         0.00092182 0.54984174
 0.         0.00148835 0.         0.         0.         0.
 0.44152783]
[23.19852479]

Source

Cutler .A., Cutler, D.R., and Stevens, J.R. 2011. Random Forest. Chapter in Machine Larning: 1-20.

Hanselmann, M., Kirchner, M., Köthe, U., and Hove, EARD. 2009. Towards Digital Staining using Imaging Mass Spectrometry and Random Forests-Technical Report. A review: 1-20

Louppe, G. 2014. Understanding Random Forest. PH.D disertation: Faculty of Applied Sciences Department of Electrical Engineering & Computer Science.

Scikit-learn: Machine learning, diakses pada tanggal 06/11/2019 pukul 18.30

Yhat. 2013. Random Forests in Python. by The Yhat Blog, diakses pada tanggal 06/11/2019 pukul 19.15