Bagaimana cara melakukan pemilihan variabel-algoritma genetika dalam R untuk variabel-variabel input SVM?

9

Saya menggunakan paket kernlab di R untuk membangun SVM untuk mengklasifikasikan beberapa data.

SVM bekerja dengan baik karena memberikan 'prediksi' keakuratan yang layak, namun daftar variabel input saya lebih besar daripada yang saya inginkan dan saya tidak yakin akan pentingnya relatif dari variabel yang berbeda.

Saya ingin menerapkan algoritma genetika untuk memilih sub-set variabel input yang menghasilkan SVM yang paling terlatih / paling cocok.

Saya butuh bantuan dengan memilih paket R mana yang akan digunakan ketika mencoba implementasi GA ini (dan mungkin contoh singkat psuedo).

Saya telah melihat sebagian besar paket R GA / P di luar sana ( RGP , genalg , subselect , GALGO ), tetapi saya berjuang secara konseptual untuk melihat bagaimana saya akan melewati fungsi ksvm saya sebagai bagian dari fungsi kebugaran dan memasukkan saya array variabel sebagai kumpulan populasi ...?

Segala bantuan, pikiran, atau dorongan ke arah yang benar diterima dengan penuh rasa syukur.

Terima kasih

kode yang menyelesaikan ini ditambahkan di bawah dalam EDIT nanti

# 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)
}
tfb
sumber

Jawaban:

7

Saran saya adalah jangan melakukan ini. Keuntungan teoretis dari SVM yang menghindari over-fitting hanya berlaku untuk penentuan pengganda lagrange (parameter model). Segera setelah Anda mulai melakukan pemilihan fitur, keunggulan-keunggulan itu pada dasarnya hilang, karena ada sedikit teori yang mencakup pemilihan model atau pemilihan fitur, dan Anda sangat mungkin menyesuaikan kriteria pemilihan fitur, terutama jika Anda mencari dengan sangat keras menggunakan GA Jika pemilihan fitur penting, saya akan menggunakan sesuatu seperti LASSO, LARS atau Elastic net, di mana pemilihan fitur muncul melalui reguarisasi, di mana pemilihan fitur lebih dibatasi, sehingga ada derajat kebebasan efektif yang lebih sedikit, dan kurang pas.

Perhatikan keuntungan utama dari SVM adalah bahwa merupakan implementasi perkiraan dari batas generalisasi yang tidak tergantung pada dimensi ruang fitur, yang menunjukkan bahwa pemilihan fitur mungkin tidak semestinya diharapkan untuk meningkatkan kinerja, dan jika ada defisiensi dalam proses seleksi (mis. terlalu pas kriteria seleksi) itu mungkin membuat segalanya lebih buruk!

Dikran Marsupial
sumber
5
+1 Anak anjing manis mati setiap kali Anda melakukan pemilihan fitur dengan algoritma genetika.
@mbq LOL! (Rupanya saya perlu mengetik setidaknya enam karakter lebih dari yang saya inginkan.)
Dikran Marsupial
1
@mbq anak anjing DAN anak kucing akan muncul, jika hasil saya adalah sesuatu untuk pergi ...
tfb
@ MBB Saya berencana untuk melakukan beberapa pemilihan fitur dengan GAS untuk makalah yang saya tulis saat ini (tidak mengharapkannya berfungsi, tetapi beberapa dataset memiliki terlalu banyak fitur untuk pencarian lengkap). Maaf fido!
Dikran Marsupial
@DikranMarsupial Ya, saya hanya bisa mengundang Anda untuk mencoba pra-filtering mereka dengan beberapa alat kayu saya (;
2

Pada akhirnya saya akhirnya menggunakan paket 'genalg' pada R. Ini berarti mengubah kromosom pemenang dari format biner untuk mewakili variabel dalam data saya, tetapi ini relatif sepele setelah GA dijalankan. Beri tahu saya jika Anda menginginkan detail lebih lanjut.

tfb
sumber
Maukah Anda memposting kode?
B_Miner
@ B_Miner maaf atas keterlambatannya, sudah cukup lama sejak saya menggunakan SO. Ini juga agak lama sejak saya berjuang dengan masalah ini di R. Saya sudah melihat-lihat file lama saya dan saya pikir di bawah ini adalah kode yang menyelesaikannya - semoga membantu:added above
tfb
2
(Penafian: Algoritma genetika IMHO adalah salah satu pengoptimal yang lebih jahat untuk model statistik. Mereka mengeksploitasi varians dalam estimasi kinerja dengan cara yang sangat buruk). Jadi: setidaknya periksa model akhir Anda dengan data uji yang benar-benar independen!
cbeleites tidak senang dengan SX