Rasgele orman: Test setinde yeni faktör seviyeleri nasıl ele alınır?


13

R'de rastgele bir orman modeli kullanarak tahminler yapmaya çalışıyorum.

Ancak bazı faktörlerin test setinde eğitim setinden farklı değerlere sahip olduğundan hata alıyorum. Örneğin, bir faktörün test setinde egzersiz setinde görünmeyen Cat_2değerler 34, 68, 76vb. Vardır. Ne yazık ki, Test seti üzerinde kontrolüm yok ... Onu olduğu gibi kullanmalıyım.

Benim tek geçici çözüm kullanarak sorunlu faktörleri tekrar sayısal değerlere dönüştürmek oldu as.numeric(). O çalışır ancak bu değerler hiçbir sayısal duygusu var kodlardır beri çok memnun değilim ...

Yeni değerleri test setinden çıkarmak için başka bir çözüm olacağını düşünüyor musunuz? Ancak 1, 2, 14, 32hem eğitimde hem de testte bulunan ve tahminler için potansiyel olarak yararlı bilgiler içeren diğer tüm faktör değerlerini (değerleri söyleyin , vb.) Kaldırmadan .


1
Testteki değerlerin eğitim setinde neden olması gerektiğini biliyorum. Sınıflandırma fikri, sınıf şartlı yoğunlukların nasıl göründüğü hakkında bir fikir edinmek için eğitim verilerini kullanmaktır. Yoğunluktan mümkün olan her değeri göremezsiniz. Ben bir değişken bir split ona ağacında kullanılır, sonra split, görülmeyen değerler kadar, görülmeyen değerler için hangi dalı takip edeceğini belirler.
Michael R.Chernick

Geçerli bir noktaya değiniyorsunuz, ancak pratik bir düzeyde sorulan spesifik aracı (R'deki RF paketi) kullanarak buna izin verilmiyor. Kesinliği içeren cevabım, bunun en iyi çözümü olmasa da, bunun bir yoludur. En azından kod çökmesini değil yapar, bu yüzden en azından çalışır, küçük çalışma değerleri için.
Bogdanovist

Buradaki soruma benzer: stats.stackexchange.com/questions/18004/… . Yeni faktör düzeyleriyle daha iyi başa çıktığı için RF yerine GBM kullanabileceğimi düşünüyorum. Ayrıca, RF'nin partide uygulanmasına da baktınız mı? Bu sorunlar (ve sorunsuz bir şekilde eksik değerlerle başa çıkamama) nedeniyle randomForest'i hiç sevmedim.
B_Miner

Yanıtlar:


2

Test seti, yeni faktör değerleri ile bu noktaların çoğuna sahipse, en iyi yaklaşımın ne olduğundan emin değilim. Sadece bir avuç nokta ise, hatalı faktör düzeylerine eksik veri olarak davranmak ve uygun gördüğünüz herhangi bir yaklaşımla onları ima etmek gibi yumuşak bir şeyden kurtulabilirsiniz. R uygulamasının eksik verileri etkilemek için birkaç yolu vardır, bu faktör düzeylerini eksik olduklarını belirtmek için NA olarak ayarlamanız yeterlidir.


8

King ve Bonoit , bu pasaj seviyeleri uyumlaştırmak için yararlı olabilir:

for(attr in colnames(training))
{
  if (is.factor(training[[attr]]))
  {
    new.levels <- setdiff(levels(training[[attr]]), levels(testing[[attr]]))
    if ( length(new.levels) == 0 )
    { print(paste(attr, '- no new levels')) }
    else
    {
      print(c(paste(attr, length(new.levels), 'of new levels, e.g.'), head(new.levels, 2)))
      levels(testing[[attr]]) <- union(levels(testing[[attr]]), levels(training[[attr]]))
    }
  }
}

Ayrıca hangi özelliklerin değiştirildiğini de yazdırır. Daha zarif yazmak için iyi bir yol bulamadım (ldply ya da başka bir şeyle). Herhangi bir ipucu takdir.


4

İşte @ King'in tepkisini yukarıda yazdığı bazı kodlar. Hata düzeltildi:

# loops through factors and standardizes the levels
for (f in 1:length(names(trainingDataSet))) {
    if (levels(testDataSet[,f]) > levels(trainingDataSet[,f])) {    
            levels(testDataSet[,f]) = levels(trainingDataSet[,f])       
    } else {
            levels(trainingDataSetSMOTEpred[,f]) = levels(testDataSet[,f])      
    }
}

hi @ifarb, çözümünüzü anlamaya çalışıyorum: trainingDataSetSMOTEpred nedir ve kodda nerede tanımlanmıştır?
Kasia Kulma

3

Test ve eğitim seti bir set olarak birleştirilmeli ve daha sonra eğitim setinin seviyelerini değiştirilmelidir. Kodlarım:

totalData <- rbind(trainData, testData)
for (f in 1:length(names(totalData))) {
  levels(trainData[, f]) <- levels(totalData[, f])
}

Bu, testteki seviye sayısının eğitimden daha fazla veya daha az olduğu her durumda çalışır.


2

R'de randomForest kullandığımda berbat bir geçici çözümüm var.

levels(testSet$Cat_2) = levels(trainingSet$Cat_2)

ya da başka bir şekilde. Temel olarak, R'ye geçerli olduğunu, sadece 0 vaka olduğunu söyler; bu yüzden hata hakkında beni rahatsız etmeyi bırakın.

Tüm kategorik özellikler için eylemi otomatik olarak gerçekleştirecek şekilde kodlamak için yeterince akıllı değilim. Nasıl olduğunu biliyorsanız bana kodu gönderin ...


Ancak, testteki seviye sayısı eğitimden fazla ise bu işe yaramaz. Sadece test veri faktörü seviyeleri <= egzersiz veri faktörü seviyeleri ise çalışır.
KarthikS

1

Bu durumda böyle bir şey düşünmüş olabilirsiniz, ancak test seti gerçek değerlere sahipse ve test setini çapraz doğrulama amaçları için kullanıyorsanız, veri çerçevesini eğitim ve test veri çerçevelerine yeniden bölüyorsanız ikisinin bu faktörler üzerinde dengelenmesi sorununuzu önleyecektir. Bu yöntem yaygın olarak tabakalı çapraz doğrulama olarak bilinir .

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.