Ich benutze SVM, um Diabetes vorherzusagen. Ich verwende den BRFSS- Datensatz für diesen Zweck. Der Datensatz hat die Abmessungen und ist verzerrt. Der Prozentsatz von s in der Zielvariablen beträgt während die s die verbleibenden .11 % 89 %YN
Ich verwende nur 15aus 136unabhängigen Variablen aus dem Datensatz. Einer der Gründe für die Reduzierung des Datensatzes bestand darin, mehr Trainingsmuster zu haben, wenn Zeilen mit NAs weggelassen wurden.
Diese 15Variablen wurden ausgewählt, nachdem statistische Methoden wie Zufallsbäume, logistische Regression ausgeführt und herausgefunden wurden, welche Variablen aus den resultierenden Modellen signifikant sind. Nach dem Ausführen der logistischen Regression haben wir beispielsweise p-valuedie wichtigsten Variablen sortiert.
Ist meine Methode zur Variablenauswahl korrekt? Anregungen zu ist sehr willkommen.
Das Folgende ist meine RImplementierung.
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);
Ich lief mit (Training = und Test = ) Proben, da es in meinem Laptop schneller ist. Die Verwirrungsmatrix für die Testdaten ( Proben), die ich bekomme, ist ziemlich schlecht.700 300 300
true
pred N Y
N 262 38
Y 0 0
Ich muss meine Vorhersage für die YKlasse verbessern . Tatsächlich muss ich so genau wie möglich sein, Yauch wenn ich schlecht abschneide N. Vorschläge zur Verbesserung der Genauigkeit der Klassifizierung sind sehr willkommen.
Yjede Eingabe voraus . Dies bedeutet, dass es in der korrekt ist .