SVM giriş değişkenleri için R'de genetik algoritma değişken seçimi nasıl yapılır?


9

Bazı verileri sınıflandırmak için bir SVM oluşturmak için R kernlab paketini kullanıyorum .

SVM, iyi bir doğruluk 'tahminleri' sağlaması açısından iyi çalışıyor, ancak giriş değişkenleri listem istediğimden daha büyük ve farklı değişkenlerin göreceli önemi konusunda emin değilim.

En iyi eğitimli / en uygun SVM üreten girdi değişkenlerinin alt kümesini seçmek için bir genetik algoritma uygulamak istiyorum.

Bu GA uygulamasını (ve muhtemelen kısa bir psuedo örneği) denerken hangi R paketinin kullanılacağını seçerken yardım istiyorum.

Orada R GA / P paketlerinin çoğuna baktım ( RGP , genalg , alt seçim , GALGO ), ancak kavramsal olarak fitness fonksiyonunun bir parçası olarak ksvm fonksiyonumu nasıl geçireceğimi görmek ve popülasyon havuzu olarak değişken dizi ...?

Doğru yönde herhangi bir yardım, düşünce veya dürtüler minnetle alındı.

Teşekkürler

daha sonra bir EDIT'de bunu ekleyen kodu çözen kod

# Prediction function to be used for backtesting
pred1pd = function(t) {
print(t)
##add section to select the best variable set from those available using GA
  # evaluation function - selects the best indicators based on miminsied training error
mi.evaluate <- function(string=c()) {
    tmp <- data[(t-lookback):t,-1]
    x <- string
    tmp <- tmp[,x==1]
    tmp <- cbind(data[(t-lookback):t,1],tmp)
    colnames(tmp)[1] <- "targets"
    trainedmodel = ksvm(targets ~ ., data = tmp, type = ktype, kernel="rbfdot", kpar=list(sigma=0.1), C = C, prob.model = FALSE, cross = crossvalid)
    result <- error(trainedmodel)
    print(result)
    }

## monitor tge GA process
monitor <- function(obj) {
minEval = min(obj$evaluations);
plot(obj, type="hist");
}

## pass out the GA results; size is set to be the number of potential indicators
gaResults <- rbga.bin(size=39, mutationChance=0.10, zeroToOneRatio=10, evalFunc=mi.evaluate, verbose=TRUE, monitorFunc=monitor, popSize=50, iters=3, elitism=10)

## now need to pull out the best chromosome and rebuild the data frame based on these results so that we can train the model

bestChro <- gaResults$population[1,]
newData <- data[,-1]
newData <- newData[,bestChro==1]
newData <- cbind(data[,1],newData)
colnames(newData)[1] <- "targets"
print(colnames(newData))

# Train model using new data set
model = trainSVM(newData[(t-lookback):t, ], ktype, C, crossvalid)
# Prediction
pred = as.numeric(as.vector(predict(model, newData[t+1, -1], type="response")))
# Print for user inspection
print(pred)
}

Yanıtlar:


7

Benim tavsiyem bunu yapmamak. SVM'nin aşırı oturmayı önleyen teorik avantajları sadece lagrange çarpanlarının (modelin parametreleri) belirlenmesinde geçerlidir. Özellik seçimini yapmaya başlar başlamaz, model seçimini veya özellik seçimini kapsayan çok az teori olduğundan ve özellikle bir özellik kullanarak gerçekten zor arama yaparsanız, özellik seçim ölçütüne çok uyma olasılığınız olduğu için bu avantajlar esasen kaybolur. GA. Özellik seçimi önemliyse, LASSO, LARS veya Elastik ağ gibi bir özellik kullanacağım, burada özellik seçimi, özellik seçiminin daha kısıtlı olduğu düzenleme ile ortaya çıkar, bu nedenle daha az etkili serbestlik derecesi ve daha az fazla bağlantı vardır.

SVM'nin önemli bir avantajı, özellik alanının boyutluluğundan bağımsız olan bir genelleme sınırının yaklaşık olarak uygulanmasıdır; bu, özellik seçiminin belki de performansı arttırması beklenmiyor ve seçim basamağındaki eksiklik (örneğin seçim ölçütüne aşırı uyma) işleri daha da kötüleştirebilir!


5
+1 Genetik algoritmalarla seçim yaptığınızda tatlı bir köpek yavrusu ölür.

@mbq LOL! (görünüşe göre gerçekten istediğimden en az altı karakter daha yazmak zorunda kaldım.)
Dikran Marsupial

1
@mbq puppies AND kittens, eğer sonuçlarımın geçmesi gereken bir şey varsa ...
tfb

@mbq Şu anda yazdığım bir kağıt için GA'larla bazı özellik seçimi yapmayı planlıyorum (çalışmasını beklemiyorum, ancak bazı veri kümelerinin ayrıntılı arama için çok fazla özelliği var). Üzgünüm Fido!
Dikran Marsupial

@DikranMarsupial Eh, sizi sadece bazı ahşap aletlerimle ön filtrelemeyi denemeye davet edebilirim (;

2

Sonunda R'deki 'genalg' paketini kullandım. Bu, kazanan kromozomun verilerimdeki değişkenleri temsil etmek için ikili bir formattan dönüştürülmesi anlamına geliyor, ancak GA çalıştıktan sonra bu nispeten önemsiz. Daha fazla ayrıntı isterseniz bana bildirin.


Kodu yayınlamak ister misiniz?
B_Miner

@B_Miner gecikme için üzgünüm, SO'da olduğumdan beri bir süre. Ayrıca R'deki bu sorunla mücadele ettiğimden beri bir süredir eski dosyalarıma bir göz attım ve aşağıda çözülen kod olduğunu düşünüyorum - umarım yardımcı olur:added above
tfb

2
(Feragatname: IMHO genetik algoritmaları istatistiksel modeller için daha kötü optimize ediciler arasındadır. Performans tahminindeki farklılıkları çok kötü bir şekilde kullanmaktadırlar). Yani: en azından son modelinizi gerçekten bağımsız test verileriyle kontrol edin!
sbeleites SX
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.