Diyabetin SVM sınıflandırmasını iyileştirmek


10

Diyabet tahmininde SVM kullanıyorum. Bu amaçla BRFSS veri setini kullanıyorum . Veri kümesi boyutlarına sahiptir ve eğridir. Hedef değişkendeki s yüzdesi , s ise geri kalan .432607×136Y11%N89%

Sadece kullanıyorum 15dışına 136veri kümesinden bağımsız değişkenler. Veri kümesini azaltmanın nedenlerinden biri, NAs içeren satırlar atlandığında daha fazla eğitim örneğine sahip olmaktı.

Bu 15değişkenler rastgele ağaçlar, lojistik regresyon gibi istatistiksel yöntemler uygulandıktan ve sonuçta ortaya çıkan modellerden hangi değişkenlerin anlamlı olduğunu bulduktan sonra seçilmiştir. Örneğin, lojistik regresyonu çalıştırdıktan sonra p-valueen önemli değişkenleri sıraladık.

Değişken seçimi yapma yöntemim doğru mu? Herhangi bir öneri büyük ölçüde açığız.

Aşağıdakiler benim Ruygulamam.

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

Birlikte ran (eğitim = ve test = daha hızlı benim laptop olduğundan) numuneler. Aldığım test verileri ( örnek) için karışıklık matrisi oldukça kötü.1000700300300

    true
pred   N   Y
   N 262  38
   Y   0   0

YSınıf için tahminimi geliştirmem gerekiyor . Aslında, Ykötü performans göstersem bile olabildiğince doğru olmalıyım N. Sınıflandırmanın doğruluğunu artırmak için herhangi bir öneri büyük takdir edilecektir.


Sanırım SVM'niz hiç çalışmıyor, ama nedenini bilmiyorum! Ayrıca verilerinizi normalleştirmek için daha iyi olabilir ...
user4581 15

Evet, temelde Yherhangi bir girişi tahmin eder . Bu , zamanın doğru olacağı anlamına gelir .  90%
Anand

Verileri normalleştirmek başlamak için en iyi şeydir. Bununla başlayın. Ayrıca aramayı deneyebilirsiniz ayrıca doğrusal olmayan çekirdek daha iyi bir sonuç göstermelidir. (Sınır sınırınıza bağlıdır, normalleştirilmesi yeterli olabilir)
404Dreamer_ML

Bunun kernlabyerine deneyebilirsiniz e1071- otomatik olarak normalleşir ve ilk modeli önyüklemeyi kolaylaştıran bazı sezgisel taramalara sahiptir.

Yanıtlar:


9

4 öneri var:

  1. Modelinize dahil edilecek değişkenleri nasıl seçiyorsunuz? Belki daha büyük veri kümesindeki bazı önemli göstergeleri kaçırıyorsunuzdur.
  2. Kullandığınız göstergelerin neredeyse tamamı (seks, sigara içen vb.) Faktör olarak ele alınmalıdır. Bu değişkenleri sayısal olarak ele almak yanlıştır ve muhtemelen modelinizdeki hataya katkıda bulunur.
  3. Neden bir SVM kullanıyorsunuz? Doğrusal diskriminant analizi ve hatta lineer regresyon gibi daha basit yöntemleri denediniz mi? Belki daha büyük bir veri kümesine basit bir yaklaşım daha iyi sonuç verecektir.
  4. Düzeltme paketini deneyin . Model doğruluğunu çapraz doğrulamanıza yardımcı olacak, daha hızlı çalışmanıza izin verecek şekilde paralelleştirilmiştir ve farklı model türlerini keşfetmeyi kolaylaştırır.

İşte düzeltme kodu için bazı örnek kod:

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)

Bu LDA modeli SVM'nizi geçiyor ve faktörlerinizi bile düzeltmedim. Eminim Sex, Smoker, vs.'yi faktör olarak yeniden kodlarsanız, daha iyi sonuçlar alırsınız.


Aşağıdaki hatayı alıyorum task 1 failed - "could not find function "predictionFunction"". Bunun bir forum olmadığını biliyorum ama yorumlarınız varsa lütfen bize bildirin.
Anand

1
@Anand: Yönetici olarak yeni bir R oturumu açın (veya mac / linux'da sudo R'yi çalıştırın). Çalıştır update.packages.Bu işlem tamamlandığında, R'yi kapatın ve normal (yönetici olmayan) bir oturumu yeniden açın. Kodunuzu "SVM" ve "Confusion matrix" bölümleri dışında çalıştırın. Sonra kodumu çalıştırın. Hala bir hata alıyorsanız, lütfen hatayı döndüren satırı ve tam hatayı gönderin.
Zach

1
@Anand: Ayrıca, en son R sürümünü (2.14) çalıştırdığınızdan ve en son düzeltme sürümünü kullandığınızdan emin olun. Düzeltmeyi install.packages('caret')tekrar çalıştırarak güncelleyebilirsiniz .
Zach

@Anand: Harika! trainİşlev için nb(saf bayes), glm(lojistik regresyon) svmLinearve gibi farklı yöntemlere düşebilirsiniz svmRadial. SVM'lerin sığması uzun zaman alacaktır.
Zach

3

Doğrusal bir çekirdek kullanıyorsanız, özellik seçiminin kötü bir fikir olması ve düzenlemenin, özellik seçiminin yapabileceğinden daha etkili bir şekilde takılmasını önleyebilir. SVM'nin yaklaşık olarak uyguladığı performans sınırlarının, SVM'nin satış noktalarından biri olan özellik alanının boyutundan bağımsız olduğunu unutmayın.


2

Son zamanlarda bu sorunu yaşadım ve yardımcı olacak birkaç şey buldum. İlk olarak, bir sınıflandırma problemindeki azınlık sınıfı küçük olduğunda size daha iyi sonuçlar veren bir Naive Bayes modeli (klaR paketi) deneyin. Ayrıca, bir SVM'ye bağlı kalmayı seçerseniz, azınlık sınıfını aşırı örneklemeyi denemek isteyebilirsiniz. Esas olarak, azınlık sınıfına daha fazla örnek eklemek veya azınlık sınıfı için sentetik olarak vakalar oluşturmak isteyeceksiniz

Bu yazı: http: //www.it.iitb.ac.in/~kamlesh/Page/Reports/highlySkewed.pdf

Weka'da uygulanan bu tekniklerin bazı tartışmaları ve örnekleri vardır, ancak bunları R'de kendinize alıştırmak da mümkündür.


Yararlı yorumlar için teşekkürler. Önerilerinizi deneyeyim.
Anand

1

Daha önce bahsedilenlere ek olarak, doğrusal bir çekirdek kullanmak için en iyi modelinizi sabitlersiniz. Ayarlama aşamasında kullanılan / bulunan aynı çekirdek de dahil olmak üzere ayarlanan en iyi modeli kullanmayı tahmin etmelisiniz (ki bu sizin gama ayarladığınızdan beri RBF olduğunu varsayıyorum).

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.