Sto usando SVM per prevedere il diabete. Sto usando il set di dati BRFSS per questo scopo. Il set di dati ha le dimensioni di ed è inclinato. La percentuale di s nella variabile target è mentre s costituisce il restante .11 % 89 %YN
Sto usando solo 15di 136variabili indipendenti dal set di dati. Uno dei motivi per ridurre il set di dati è stato quello di avere più campioni di addestramento quando le righe contenenti NAs sono state omesse.
Queste 15variabili sono state selezionate dopo aver eseguito metodi statistici come alberi casuali, regressione logistica e scoprire quali variabili sono significative dai modelli risultanti. Ad esempio, dopo aver eseguito la regressione logistica, abbiamo usato p-valueper ordinare le variabili più significative.
Il mio metodo di selezione delle variabili è corretto? Qualsiasi suggerimento è molto gradito.
Quella che segue è la mia Rimplementazione.
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);
Ho corso con (training = e test = ) campioni poiché è più veloce nel mio laptop. La matrice di confusione per i dati del test ( campioni) che ottengo è piuttosto negativa.700 300 300
true
pred N Y
N 262 38
Y 0 0
Devo migliorare la mia previsione per la Yclasse. In effetti, devo essere il più preciso possibile Yanche se mi esibisco male N. Qualsiasi suggerimento per migliorare l'accuratezza della classificazione sarebbe molto apprezzato.
Yqualsiasi input. Ciò significa che sarà corretto delle volte.