J'utilise uniquement 15
des 136
variables indépendantes de l'ensemble de données. L'une des raisons de la réduction de l'ensemble de données était d'avoir plus d'échantillons d'apprentissage lorsque les lignes contenant NA
s sont omises.
Ces 15
variables ont été sélectionnées après l'exécution de méthodes statistiques telles que les arbres aléatoires, la régression logistique et la découverte des variables significatives à partir des modèles résultants. Par exemple, après avoir effectué une régression logistique, nous avons utilisé p-value
pour classer les variables les plus significatives.
Ma méthode de sélection des variables est-elle correcte? Toutes les suggestions sont les bienvenues.
Ce qui suit est ma R
mise en œuvre.
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);
true
pred N Y
N 262 38
Y 0 0
J'ai besoin d'améliorer mes prévisions pour la Y
classe. En fait, je dois être aussi précis que possible avec Y
même si je donne de mauvais résultats avec N
. Toute suggestion visant à améliorer la précision de la classification serait grandement appréciée.
Y
kernlab
au lieu dee1071
- il effectue automatiquement la normalisation et possède des heuristiques facilitant l'amorçage du premier modèle.Réponses:
J'ai 4 suggestions:
Voici un exemple de code pour le signe d'insertion:
Ce modèle LDA bat votre SVM, et je n'ai même pas corrigé vos facteurs. Je suis sûr que si vous recodez le sexe, le fumeur, etc. comme facteurs, vous obtiendrez de meilleurs résultats.
la source
task 1 failed - "could not find function "predictionFunction""
. Je sais que ce n'est pas un forum mais si vous avez des commentaires, faites-le moi savoir.update.packages.
Lorsque cela est terminé, fermez R et rouvrez une session normale (non administrateur). Exécutez votre code à l'exception des sections "SVM" et "Confusion matrix". Ensuite, exécutez mon code. Si vous obtenez toujours une erreur, veuillez publier la ligne qui a renvoyé une erreur, ainsi que l'erreur exacte.install.packages('caret')
nouveau.train
fonction, telles quenb
(bayes naïves),glm
(régression logistique)svmLinear
etsvmRadial
. Le svm prendra beaucoup de temps pour s'adapter.Si vous utilisez un noyau linéaire, il est possible que la sélection de fonctionnalités soit une mauvaise idée et que la régularisation puisse empêcher un sur-ajustement plus efficace que la sélection de fonctionnalités. Notez que les limites de performances qu'implémente approximativement le SVM sont indépendantes de la dimension de l'espace des fonctionnalités, qui était l'un des arguments de vente du SVM.
la source
J'ai eu ce problème récemment et j'ai trouvé quelques choses qui aident. Tout d'abord, essayez un modèle Naive Bayes (package klaR) qui vous donne parfois de meilleurs résultats lorsque la classe minoritaire dans un problème de classification est minuscule. De plus, si vous choisissez de vous en tenir à un SVM, vous voudrez peut-être essayer de suréchantillonner la classe minoritaire. Essentiellement, vous voudrez inclure plus d'exemples de la classe minoritaire ou créer synthétiquement des cas pour la classe minoritaire
Ce document: http: //www.it.iitb.ac.in/~kamlesh/Page/Reports/highlySkewed.pdf
A une discussion et des exemples de ces techniques implémentées dans Weka, mais les implémenter vous-même dans R est également possible.
la source
En plus de ce qui a déjà été mentionné, vous fixez votre meilleur modèle pour utiliser un noyau linéaire. Vous devez prédire en utilisant le meilleur modèle qui a été réglé, y compris le même noyau qui a été utilisé / trouvé dans votre étape de réglage (qui, je suppose, est RBF puisque vous ajustez le gamma).
la source