R randomForests'ta sınıflandırma eşiği nasıl değiştirilir?


10

Tüm Türler Dağıtım Modellemesi literatürü, olasılıkları (örneğin, RandomForests) çıkaran bir model kullanarak bir türün varlığını / yokluğunu tahmin ederken, bir türün varlığını veya yokluğunu gerçekte sınıflandırabilme eşik olasılığının seçilmesinin önemli olduğunu ve her zaman 0,5 varsayılanına bağlı değildir. Bu konuda yardıma ihtiyacım var! İşte benim kod:

library(randomForest)
library(PresenceAbsence)

#build model
RFfit <- randomForest(Y ~ x1 + x2 + x3 + x4 + x5, data=mydata, mytry = 2, ntrees=500)

#eventually I will apply this to (predict for) new data but for first I predict back    to training data to compare observed vs. predicted
RFpred <- predict(RFfit, mydata, type = "prob")

#put the observed vs. predicted in the same dataframe
ObsPred <- data.frame(cbind(mydata), Predicted=RFpred)

#create auc.roc plot
auc.roc.plot(ObsPred, threshold = 10, xlab="1-Specificity (false positives)",
  ylab="Sensitivity (true positives)", main="ROC plot", color=TRUE,
  find.auc=TRUE, opt.thresholds=TRUE, opt.methods=9) 

Bundan, varlığı tahmin edilen olasılıklardan sınıflandırmak için kullanmak istediğim eşiğin, 0,5'in varsayılan değeri değil 0,7 olduğunu belirledim. Bu bilgilerle ne yapacağımı tam olarak anlamıyorum. Çıktılarımın bir haritasını oluştururken bu eşiği mi kullanmalıyım? Kolayca sürekli olasılıklarla eşlenmiş bir çıktı oluşturabilirim, sonra değerleri şimdiki 0,7'den büyük olanları ve <0,7 olanları yeniden sınıflandırabilirim.

Veya cut-off parametresini kullanarak bu bilgileri alıp randomForests modelimi yeniden çalıştırmak istiyor muyum? Cut-off parametresi tam olarak ne yapıyor? Ortaya çıkan oyu değiştiriyor mu? (şu anda "çoğunluk" olduğunu söylüyor). Bu kesme parametresini nasıl kullanırım? Belgeleri anlamıyorum! Teşekkürler!


2
Bunun buraya ait olabileceğini söyleyebilirim: (1) RF'den olasılık tahminleri, (2) modele bir maliyet fonksiyonu uygulayıp uygulayamayacağınız veya modele inşa etmek zorunda kalıp kalmadığınız ve (3) maliyet fonksiyonlarının nasıl uygulanacağı RF'de sadece programlama ile ilgili olmayan tekrar eden sorunlar vardır.
charles

Yanıtlar:


7

# eşiği veya eşik değerini 0.7 olarak ayarlar

cutoff=0.7

# 0.7 kesme değerinden düşük tüm değerler 0 olarak sınıflandırılacaktır (bu durumda bulunur)

RFpred[RFpred<cutoff]=0

# 0.7 kesme değerinden büyük tüm değerler 1 olarak sınıflandırılacaktır (bu durumda yok)

 RFpred[RFpred>=cutoff]=1

1
Cevabınızı biraz genişletebilir misiniz? En azından kodunuza açıklama eklemek yararlı olacaktır.
Patrick Coulombe

2
FWIW, bence bu yeterli.
Sycorax, Reinstate Monica'ya

Bu cevap mükemmel bir ses. Katılıyorum.
Seanosapien

7

Üzgünüm, cevap alamadınız. Bu sayının kapsamı için Max Kuhn'un kitabını tavsiye ederim. Bu oldukça geniş bir konudur. Sadece biraz bit ekleyin:

  1. ROC eğrileri popülerdir, ancak yalnızca Yanlış Negatif ve Yanlış Pozitif sonuçlar arasındaki ödünleşimi anlamaya çalışıyorsanız mantıklı olun. CostFN = CostFP ise mantıklı olduklarından emin değilim. C-istatistiği ve diğer türetilmiş önlemlerin hala kullanımı vardır. Doğruluğu en üst düzeye çıkarmak istiyorsanız - modelinizi bunun için ayarlamanız yeterlidir (caret paketi bunu kolaylaştırır), bir ROC eğrisi yapmayın.
  2. Herkes RF modellerinden elde edilen olasılıkları kullanır. Sanırım bunu yapmak için biraz düşünülmeli - bunlar olasılıklı modeller değil, bunu yapmak için tasarlanmamışlar. Genellikle işe yarıyor. Gerçekten olasılıklarla ilgileniyor olsaydım, en azından yeni veriler üzerinde RF olasılıklarının onaylama grafiğini üretirdim
  3. En basit yol "mevcut halihazırda 0.7'den büyük ve <0.7 eksik olanları yeniden sınıflandırmak" kullanmaktır.
  4. Maliyet (FN) maliyete (FP) eşit değilse, RF'yi duyarlı hale getirmeniz gerekir. R bunu kolaylaştırmaz. RandomForest paketindeki ağırlıklandırma işlevi çalışmıyor. En iyi seçenek, istediğiniz maliyet fonksiyonunu elde etmek için örnekleme, örnek altı çoğunluk durumu ile oynamaktır. Ancak örnek oranı ve maliyet arasındaki ilişki doğrudan değildir. Yani (3)

Sınıf ağırlıkları ile ilgili güncelleme Andy Liaw:
randomForest paketindeki "mevcut" classwt "seçeneği başlangıçtan beri var ve resmi Fortran kodunun (sürüm 4 ve üstü) sınıf ağırlıklarını nasıl uyguladığından farklı. düğümleri bölerken Gini indeksi hesaplamasındaki ağırlıklar, tam olarak sınıf ağırlıkları verildiğinde tek bir CART ağacının nasıl yapıldığını anlatan Prof. Breiman, Fortran kodunun daha yeni sürümünde uygulanan yeni sınıf ağırlıklandırma şemasını, Gini endeksindeki ağırlıklar son derece dengesiz verilerde pek yardımcı görünmüyordu (1: 100 veya daha kötüsü diyelim) Eğer ağırlıklı Gini kullanmak durumunuza yardımcı oluyorsa, elbette bunu yapabilirsiniz. bize beklediğimiz sonucu vermedi. "


(4) nolu alt ağırlık tartışmasının neden çalışmadığından bahsedebilir misiniz?
Sycorax, Reinstate Monica'ya

2
Anladığım kadarıyla Fortran kodunda ( stat.berkeley.edu/~breiman/RandomForests/cc_software.htm ) uygun bir şekilde uygulanmıştı, ancak R paketinde değil. Bu tartışılmaktadır: ( stat.ethz.ch/pipermail/r-help/2011-Eylül/289769.html ) ve sadece Gini bölünmesi değil, ağaç yapısının tüm aşamalarında ağırlık kullanmaya ihtiyaç duyulan merkezler. Yani mevcut R uygulaması - sadece split'te ağırlık kullanan çok iyi çalışmıyor
charles
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.