Soru Rastgele orman regresyon modeli için ntree ve mtry değerlerinin belirlenmesi


R paketi kullanıyorum randomForest Bazı biyolojik veriler üzerinde bir gerileme yapmak. Eğitim veri boyutum 38772 X 201.

Sadece merak ettim --- ağaç sayısı için iyi bir değer ne olurdu ntree ve seviye başına değişken sayısı mtry? Bu parametre değerlerini bulmak için yaklaşık bir formül var mı?

Giriş verilerimdeki her satır, amino asit dizisini temsil eden 200 karakterdir ve ben, proteinler arasındaki mesafeleri tahmin etmek için bu diziyi kullanmak için bir regresyon modeli oluşturmak istiyorum.


32
2017-12-19 16:09


Menşei


Bu daha çok bir işe benziyor stats.stackexchange.com - MattLBeck
Katılıyorum, iyi bir soru olsa da, buraya ait değil. Ayrıca, belki daha okunabilir hale getirmeye çalışın. - PascalVKooten
Büyük veri kümelerinden rastgele ormanlar inşa etme gerçeğinde, ntrees genellikle çalışma zamanı ve hassasiyet arasında bir uzlaşmadır. - blmoore


Cevaplar:


Mtry için varsayılan değer oldukça hassastır, bu yüzden gerçekten bununla uğraşmaya gerek yoktur. Bir fonksiyon var tuneRF Bu parametreyi optimize etmek için. Ancak, bunun yanlılığa neden olabileceğinin farkında olun.

Önyükleme çoğaltmalarının sayısı için herhangi bir optimizasyon yoktur. Sıklıkla başlıyorum ntree=501 ve daha sonra rasgele orman nesnesini çiziniz. Bu size, OOB hatasına bağlı olarak hata yakınsama gösterecektir. Hatayı stabilize etmek için yeterli sayıda ağaç istiyorsun, ama o kadar da fazla değil ki, aşırıya kaçmasına neden olan birliği koruyorsun.

Burada uyarı: değişken etkileşimler hatadan daha yavaş bir hızda stabilize olur, dolayısıyla çok sayıda bağımsız değişkeniniz varsa daha fazla kopyaya ihtiyacınız olur. Ntree'yi tek bir sayı olarak tutacağım, böylece bağlar kırılabilir.

Sorunun boyutları için başlıyorum ntree=1501. Bağımsız değişkenlerinizin sayısını azaltmak için yayınlanan değişken seçim yaklaşımlarından birine bakmanızı da tavsiye ederim.


32
2017-12-19 16:29



Umarım bunu daha okunaklı hale getirmek için bunu biraz temizledim umarım. - joran
@Jeffrey Evans'ın son cevabı ile ilgili olarak, rfcv (burada da açıklanmıştır stats.stackexchange.com/questions/112556/...). En az önemli bağımsız değişkenleri kaldırmak için yararlı buldum. - Nemesi


Kısa cevap hayır.

randomForest Tabii ki fonksiyon her ikisi için de varsayılan değerlere sahiptir ntree ve mtry. İçin varsayılan mtry genellikle (ama her zaman değil) mantıklıdır, genellikle insanlar artmak isteyecektir ntree 500 varsayılan olarak oldukça biraz.

İçin "doğru" değer ntree genellikle bir endişe değil, çünkü modelden tahminler belli sayıda ağaçtan sonra çok fazla değişmeyecek kadar az farkla ortaya çıkıyor.

Gibi şeyler ile tinkering çok zaman harcamak (okumak: atık) mtry (ve sampsize ve maxnodes ve nodesize vb), muhtemelen bazı yararları için, ama benim deneyimim çok değil. Bununla birlikte, her veri kümesi farklı olacaktır. Bazen bazen hiç farketmez, büyük bir fark görebilirsin.

şapka paketin çok genel bir işlevi var train Bu, parametre değerleri üzerinde basit bir şebeke araması yapmanızı sağlar. mtry çok çeşitli modeller için. Tek dikkatim, oldukça büyük veri kümeleriyle bunu yapmak için oldukça hızlı bir şekilde zaman harcayabileceğidir, bu yüzden buna dikkat edin.

Ayrıca, bir şekilde bunu unutmuşum ranfomForest paketin kendisi vardır tuneRF "optimal" değerini aramak için özel olarak mtry.


16
2017-12-19 16:24



FYI, RF parametrelerinin optimizasyonu ile ilgili Adele Cutler ile konuştum ve "tuneRF" ve "tren" kullanımının adım adım prosedürlerin önyargıya yol açtığını belirtti. Ayrıca, postamda belirtildiği gibi, topluluğu bağdaştırmak suretiyle RF'ye aşırı yüklenmek mümkündür. Yani, hata yakınsama, değişken etkileşim ve fazlalıktan kaçınmak arasında önyükleme çoğaltmalarının sayısında bir denge vardır. - Jeffrey Evans


Bu makale yardımcı olabilir mi? Rastgele Ormanlarda Ağaç Sayısını Sınırlamak 

Özet. Bu yazının amacı basit bir prosedür önermektir.   a priori sırayla birleştirmek için minimum sayıda sınıflandırıcı belirler.   ile elde edilene benzer bir tahmin doğruluk seviyesi elde etmek   daha büyük toplulukların birleşimi. Prosedür McNemar'a dayanıyor   parametrik olmayan önemlilik testi. Asgari bir şey bilmek   En iyi tahmin doğruluğunu veren klasifikatör grubunun büyüklüğü,   Özellikle büyük veri tabanları için zaman ve hafıza maliyetleri için kazanç   ve gerçek zamanlı uygulamalar. Burada bu prosedürü dört katına uyguladık.   C4.5 karar ağacına sahip sınıflandırıcı sistemler (Breiman’ın Bagging, Ho’s   Rastgele alt uzaylar, bunların kombinasyonları "Bagfs" ve Breiman’ın   Rasgele ormanlar) ve beş büyük referans veri tabanı. Farketmeye değer   Önerilen prosedürün diğer üste kolayca genişletilebileceği   Bir karar ağacından da öğrenme algoritmaları. Deney sonuçları   Ağaç sayısının önemli ölçüde sınırlandırılmasının mümkün olduğunu gösterdi. Biz   ayrıca elde etmek için gerekli minimum ağaç sayısını gösterdi   En iyi tahmin doğruluğu bir sınıflandırıcı kombinasyonundan farklılık gösterebilir   başka bir yöntem

Asla 200'den fazla ağaç kullanmazlar.

enter image description here


4
2018-03-01 10:27





Ben ntree ve mtry ile oynayarak doğruluk kontrol etmek için aşağıdaki kodu kullanın (parametreleri değiştirin):

results_df <- data.frame(matrix(ncol = 8))
colnames(results_df)[1]="No. of trees"
colnames(results_df)[2]="No. of variables"
colnames(results_df)[3]="Dev_AUC"
colnames(results_df)[4]="Dev_Hit_rate"
colnames(results_df)[5]="Dev_Coverage_rate"
colnames(results_df)[6]="Val_AUC"
colnames(results_df)[7]="Val_Hit_rate"
colnames(results_df)[8]="Val_Coverage_rate"


trees = c(50,100,150,250)
variables = c(8,10,15,20)

for(i in 1:length(trees))
{
  ntree = trees[i]
  for(j in 1:length(variables))
  {
    mtry = variables[j]
    rf<-randomForest(x,y,ntree=ntree,mtry=mtry)
    pred<-as.data.frame(predict(rf,type="class"))
    class_rf<-cbind(dev$Target,pred)

    colnames(class_rf)[1]<-"actual_values"
    colnames(class_rf)[2]<-"predicted_values"
    dev_hit_rate = nrow(subset(class_rf, actual_values ==1&predicted_values==1))/nrow(subset(class_rf, predicted_values ==1))
    dev_coverage_rate = nrow(subset(class_rf, actual_values ==1&predicted_values==1))/nrow(subset(class_rf, actual_values ==1))

    pred_prob<-as.data.frame(predict(rf,type="prob"))
    prob_rf<-cbind(dev$Target,pred_prob)
    colnames(prob_rf)[1]<-"target"
    colnames(prob_rf)[2]<-"prob_0"
    colnames(prob_rf)[3]<-"prob_1"
    pred<-prediction(prob_rf$prob_1,prob_rf$target)
    auc <- performance(pred,"auc")
    dev_auc<-as.numeric(auc@y.values)

    pred<-as.data.frame(predict(rf,val,type="class"))
    class_rf<-cbind(val$Target,pred)

    colnames(class_rf)[1]<-"actual_values"
    colnames(class_rf)[2]<-"predicted_values"
    val_hit_rate = nrow(subset(class_rf, actual_values ==1&predicted_values==1))/nrow(subset(class_rf, predicted_values ==1))
    val_coverage_rate = nrow(subset(class_rf, actual_values ==1&predicted_values==1))/nrow(subset(class_rf, actual_values ==1))

    pred_prob<-as.data.frame(predict(rf,val,type="prob"))
    prob_rf<-cbind(val$Target,pred_prob)
    colnames(prob_rf)[1]<-"target"
    colnames(prob_rf)[2]<-"prob_0"
    colnames(prob_rf)[3]<-"prob_1"
    pred<-prediction(prob_rf$prob_1,prob_rf$target)
    auc <- performance(pred,"auc")
    val_auc<-as.numeric(auc@y.values)
    results_df = rbind(results_df,c(ntree,mtry,dev_auc,dev_hit_rate,dev_coverage_rate,val_auc,val_hit_rate,val_coverage_rate))
  }
}   

1
2018-04-27 14:48





Kullandığım güzel bir numara, başlangıçta ilk önce tahmin edicilerin karekökünü alarak başlamak ve "mtry" için bu değeri takmaktır. Genellikle rastgele ormandaki tunerf işlevinin alacağı aynı değerdedir.


0
2017-07-07 16:09