randomForest dan bug pentingnya variabel?

10

Saya tidak mendapatkan perbedaan antara rfobject$importancedan importance(rfobject)di kolom MeanDecreaseAccuracy.

Contoh:

> data("iris")
> fit <- randomForest(Species~., data=iris, importance=TRUE)
> fit$importance
                  setosa  versicolor   virginica MeanDecreaseAccuracy MeanDecreaseGini
Sepal.Length 0.027078501 0.019418330 0.040497602           0.02898837         9.173648
Sepal.Width  0.008553449 0.001962036 0.006951771           0.00575489         2.472105
Petal.Length 0.313303381 0.291818815 0.280981959           0.29216790        41.284869
Petal.Width  0.349686983 0.318527008 0.270975757           0.31054451        46.323415
> importance(fit)
               setosa versicolor virginica MeanDecreaseAccuracy MeanDecreaseGini
Sepal.Length 1.277324   1.632586  1.758101            1.2233029         9.173648
Sepal.Width  1.007943   0.252736  1.014141            0.6293145         2.472105
Petal.Length 3.685513   4.434083  4.133621            2.5139980        41.284869
Petal.Width  3.896375   4.421567  4.385642            2.5371353        46.323415
> 

Saya mendapatkan nilai MeanDecreaseAccuracy yang berbeda tetapi memiliki urutan yang sama untuk variabel penting (untuk fit$importancemaupun untuk importance(fit)):

  1. Petal. Lebar

  2. Petal. Panjangnya

  3. Sepal. Panjang

  4. Sepal. Lebar

Tetapi dalam dataset lain saya terkadang mendapatkan pesanan berbeda. Adakah yang bisa menjelaskan apa yang terjadi di sini? Apakah ini bug?


Edit (sebagai tanggapan terhadap Martin O'Leary )

Oke terima kasih! Saya memperhatikan sesuatu yang lain.

Melihat rfcv()fungsi saya perhatikan garis:

impvar <- (1:p)[order(all.rf$importance[, 1], decreasing = TRUE)]

dengan baris ini kita memilih kolom pertama all.rf$importanceyang memberi kita urutan langkah-langkah khusus kelas (untuk faktor pertama ) yang dihitung sebagai rata-rata penurunan hanya dalam akurasi. Urutan ini tidak selalu sama dengan penurunan rata-rata dalam akurasi semua kelas ( MeanDecreaseAccuracy). Bukankah lebih baik memilih baik MeanDecreaseAccuracyatau MeanDecreaseGinikolom, atau lebih baik menggunakan importance()-fungsi untuk nilai skala? Jadi kita akan memiliki jumlah prediktor yang dikurangi secara berurutan yang diurutkan berdasarkan tingkat kepentingan variabel (di semua kelas) dan tidak hanya diurutkan berdasarkan tingkat kepentingan untuk kelas pertama.

Giuseppe
sumber

Jawaban:

13

Tidak, ini bukan bug. Nilai yang diberikan dalam fit$importancetidak berskala, sedangkan nilai yang diberikan oleh importance(fit)dinyatakan dalam standar deviasi (seperti yang diberikan oleh fit$importanceSD). Ini biasanya merupakan ukuran yang lebih bermakna. Jika Anda menginginkan nilai "mentah", Anda dapat menggunakannya importance(fit, scale=FALSE).

Secara umum, itu ide yang sangat buruk untuk bergantung pada detail internal objek yang cocok, ketika ada fungsi ekstraktor yang disediakan. Tidak ada jaminan untuk konten fit$importance- mereka dapat berubah secara drastis dari versi ke versi tanpa pemberitahuan. Anda harus selalu menggunakan fungsi extractor ketika disediakan.


Sunting: Ya, baris itu rfcv()memang terlihat seperti bug, atau setidaknya perilaku yang tidak diinginkan. Ini sebenarnya contoh yang cukup bagus mengapa Anda tidak harus bergantung pada isi hal-hal seperti fit$importance. Jika cocok untuk hutan regresi, kolom pertama fit$importanceadalah %IncMSE, setara dengan importance(fit, type=1). Namun, ini tidak berlaku pada kasus klasifikasi, di mana Anda memiliki kolom tambahan untuk setiap tingkat faktor.

Martin O'Leary
sumber