Meningkatkan klasifikasi diabetes SVM

10

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 \% .432607×136Y11%N89%

Saya hanya menggunakan 15dari 136variabel independen dari set data. Salah satu alasan untuk mengurangi kumpulan data adalah untuk memiliki lebih banyak sampel pelatihan saat baris yang mengandung NAs dihilangkan.

15Variabel - 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-valueuntuk memesan variabel yang paling signifikan.

Apakah metode saya melakukan pemilihan variabel sudah benar? Setiap saran sangat disambut.

Berikut ini adalah Rimplementasi 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 1000 (pelatihan = 700 dan menguji = 300 ) sampel karena lebih cepat di laptop saya. Matriks kebingungan untuk data uji ( 300 sampel) yang saya dapatkan cukup buruk.

    true
pred   N   Y
   N 262  38
   Y   0   0

Saya perlu meningkatkan prediksi saya untuk Ykelas. Bahkan, saya harus seakurat mungkin dengan Ybahkan jika saya berkinerja buruk dengan N. Setiap saran untuk meningkatkan akurasi klasifikasi akan sangat dihargai.

Anand
sumber
Saya kira SVM Anda tidak berfungsi sama sekali, tetapi tidak tahu kenapa! mungkin juga lebih baik untuk menormalkan data Anda ...
user4581
Ya itu pada dasarnya memprediksi Yinput apa pun. Ini berarti itu akan benar dari waktu.  90%
Anand
Normalisasi data adalah hal terbaik untuk memulai. Mulailah dengan itu. Anda juga dapat mencoba mencari juga kernel non-linear yang dapat menunjukkan hasil yang lebih baik. (Ini tergantung dari previsi perbatasan Anda, mungkin normalisasi sudah cukup)
404Dreamer_ML
Anda juga dapat mencoba kernlabalih-alih e1071- ia melakukan normalisasi secara otomatis dan memiliki beberapa heuristik yang memudahkan untuk mem-bootstrap model pertama.

Jawaban:

9

Saya punya 4 saran:

  1. Bagaimana Anda memilih variabel untuk dimasukkan dalam model Anda? Mungkin Anda kehilangan beberapa indikator utama dari dataset yang lebih besar.
  2. Hampir semua indikator yang Anda gunakan (seperti jenis kelamin, perokok, dll.) Harus diperlakukan sebagai faktor. Memperlakukan variabel ini sebagai numerik salah, dan mungkin berkontribusi terhadap kesalahan dalam model Anda.
  3. Mengapa Anda menggunakan SVM? Apakah Anda mencoba metode yang lebih sederhana, seperti analisis diskriminan linier atau bahkan regresi linier? Mungkin pendekatan sederhana pada dataset yang lebih besar akan menghasilkan hasil yang lebih baik.
  4. Coba paket caret . Ini akan membantu Anda memvalidasi silang keakuratan model, itu diparalelkan yang akan membuat Anda bekerja lebih cepat, dan membuatnya mudah untuk mengeksplorasi berbagai jenis model.

Berikut ini beberapa contoh kode untuk caret:

library(caret)

#Parallize
library(doSMP)
w <- startWorkers()
registerDoSMP(w)

#Build model
X <- train.set[,-1]
Y <- factor(train.set[,1],levels=c('N','Y'))
model <- train(X,Y,method='lda')

#Evaluate model on test set
print(model)
predY <- predict(model,test.set[,-1])
confusionMatrix(predY,test.set[,1])
stopWorkers(w)

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.

Zach
sumber
Saya mendapatkan kesalahan berikut task 1 failed - "could not find function "predictionFunction"". Saya tahu ini bukan forum tetapi jika Anda memiliki komentar tolong beri tahu saya.
Anand
1
@Anand: Buka sesi R baru sebagai admin (atau jalankan sudo R di mac / linux). Jalankan 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.
Zach
1
@Anand: Pastikan juga Anda menjalankan versi terbaru R (2.14), dan menggunakan versi caret terbaru. Anda dapat memperbarui tanda sisipan dengan menjalankan install.packages('caret')lagi.
Zach
@Anand: Hebat! Anda dapat memasukkan metode yang berbeda untuk trainfungsi tersebut, seperti nb(naif bayes), glm(regresi logistik), svmLineardan svmRadial. Svm akan membutuhkan waktu lama untuk masuk.
Zach
3

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.

Dikran Marsupial
sumber
2

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.

Dan
sumber
Terima kasih atas komentarnya. Biarkan saya mencoba saran Anda.
Anand
1

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).

benbo
sumber