Saya menggunakan SVM untuk memprediksi diabetes. Saya menggunakan set data BRFSS untuk tujuan ini. Kumpulan data memiliki dimensi dan miring. Persentase s dalam variabel target adalah sedangkan s merupakan sisa 89 \% .Y
N
Saya hanya menggunakan 15
dari 136
variabel independen dari set data. Salah satu alasan untuk mengurangi kumpulan data adalah untuk memiliki lebih banyak sampel pelatihan saat baris yang mengandung NA
s dihilangkan.
15
Variabel - variabel ini dipilih setelah menjalankan metode statistik seperti pohon acak, regresi logistik dan mencari tahu variabel mana yang signifikan dari model yang dihasilkan. Sebagai contoh, setelah menjalankan regresi logistik kami menggunakan p-value
untuk memesan variabel yang paling signifikan.
Apakah metode saya melakukan pemilihan variabel sudah benar? Setiap saran sangat disambut.
Berikut ini adalah R
implementasi saya .
library(e1071) # Support Vector Machines
#--------------------------------------------------------------------
# read brfss file (huge 135 MB file)
#--------------------------------------------------------------------
y <- read.csv("http://www.hofroe.net/stat579/brfss%2009/brfss-2009-clean.csv")
indicator <- c("DIABETE2", "GENHLTH", "PERSDOC2", "SEX", "FLUSHOT3", "PNEUVAC3",
"X_RFHYPE5", "X_RFCHOL", "RACE2", "X_SMOKER3", "X_AGE_G", "X_BMI4CAT",
"X_INCOMG", "X_RFDRHV3", "X_RFDRHV3", "X_STATE");
target <- "DIABETE2";
diabetes <- y[, indicator];
#--------------------------------------------------------------------
# recode DIABETE2
#--------------------------------------------------------------------
x <- diabetes$DIABETE2;
x[x > 1] <- 'N';
x[x != 'N'] <- 'Y';
diabetes$DIABETE2 <- x;
rm(x);
#--------------------------------------------------------------------
# remove NA
#--------------------------------------------------------------------
x <- na.omit(diabetes);
diabetes <- x;
rm(x);
#--------------------------------------------------------------------
# reproducible research
#--------------------------------------------------------------------
set.seed(1612);
nsamples <- 1000;
sample.diabetes <- diabetes[sample(nrow(diabetes), nsamples), ];
#--------------------------------------------------------------------
# split the dataset into training and test
#--------------------------------------------------------------------
ratio <- 0.7;
train.samples <- ratio*nsamples;
train.rows <- c(sample(nrow(sample.diabetes), trunc(train.samples)));
train.set <- sample.diabetes[train.rows, ];
test.set <- sample.diabetes[-train.rows, ];
train.result <- train.set[ , which(names(train.set) == target)];
test.result <- test.set[ , which(names(test.set) == target)];
#--------------------------------------------------------------------
# SVM
#--------------------------------------------------------------------
formula <- as.formula(factor(DIABETE2) ~ . );
svm.tune <- tune.svm(formula, data = train.set,
gamma = 10^(-3:0), cost = 10^(-1:1));
svm.model <- svm(formula, data = train.set,
kernel = "linear",
gamma = svm.tune$best.parameters$gamma,
cost = svm.tune$best.parameters$cost);
#--------------------------------------------------------------------
# Confusion matrix
#--------------------------------------------------------------------
train.pred <- predict(svm.model, train.set);
test.pred <- predict(svm.model, test.set);
svm.table <- table(pred = test.pred, true = test.result);
print(svm.table);
Saya berlari dengan (pelatihan = dan menguji = ) sampel karena lebih cepat di laptop saya. Matriks kebingungan untuk data uji ( sampel) yang saya dapatkan cukup buruk.
true
pred N Y
N 262 38
Y 0 0
Saya perlu meningkatkan prediksi saya untuk Y
kelas. Bahkan, saya harus seakurat mungkin dengan Y
bahkan jika saya berkinerja buruk dengan N
. Setiap saran untuk meningkatkan akurasi klasifikasi akan sangat dihargai.
Y
input apa pun. Ini berarti itu akan benar dari waktu.kernlab
alih-alihe1071
- ia melakukan normalisasi secara otomatis dan memiliki beberapa heuristik yang memudahkan untuk mem-bootstrap model pertama.Jawaban:
Saya punya 4 saran:
Berikut ini beberapa contoh kode untuk caret:
Model LDA ini mengalahkan SVM Anda, dan saya bahkan tidak memperbaiki faktor Anda. Saya yakin jika Anda menghitung ulang Seks, Perokok, dll. Sebagai faktor, Anda akan mendapatkan hasil yang lebih baik.
sumber
task 1 failed - "could not find function "predictionFunction""
. Saya tahu ini bukan forum tetapi jika Anda memiliki komentar tolong beri tahu saya.update.packages.
Setelah selesai, tutup R dan buka kembali sesi normal (non-admin). Jalankan kode Anda kecuali untuk bagian "SVM" dan "Matriks kebingungan". Kemudian jalankan kode saya. Jika Anda masih mendapatkan kesalahan, silakan posting baris yang mengembalikan kesalahan, bersama dengan kesalahan yang sebenarnya.install.packages('caret')
lagi.train
fungsi tersebut, sepertinb
(naif bayes),glm
(regresi logistik),svmLinear
dansvmRadial
. Svm akan membutuhkan waktu lama untuk masuk.Jika Anda menggunakan kernel linear, maka dimungkinkan bahwa pemilihan fitur adalah ide yang buruk, dan regularisasi dapat mencegah pemasangan yang lebih efektif daripada pemilihan fitur. Perhatikan bahwa batas kinerja yang mengimplementasikan SVM tidak tergantung pada dimensi ruang fitur, yang merupakan salah satu nilai jual SVM.
sumber
Saya mengalami masalah ini baru-baru ini dan menemukan beberapa hal yang membantu. Pertama, coba model Naive Bayes (paket klaR) yang terkadang memberi Anda hasil yang lebih baik ketika kelas minoritas dalam masalah klasifikasi kecil. Juga, jika Anda memilih untuk tetap menggunakan SVM, Anda mungkin ingin mencoba oversampling kelas minoritas. Pada dasarnya Anda akan ingin memasukkan lebih banyak contoh kelas minoritas atau secara sintetis membuat kasus untuk kelas minoritas
Makalah ini: http: //www.it.iitb.ac.in/~kamlesh/Page/Reports/highlySkewed.pdf
Adakah beberapa diskusi dan contoh teknik ini diimplementasikan di Weka, tetapi memungkiri mereka sendiri di R juga dimungkinkan.
sumber
Selain apa yang telah disebutkan, Anda memperbaiki model terbaik Anda untuk menggunakan kernel linear. Anda harus memprediksi menggunakan model terbaik yang disetel, termasuk kernel yang sama yang digunakan / ditemukan pada tahap tuning Anda (yang saya asumsikan adalah RBF karena Anda menyetel gamma).
sumber