Tôi đang sử dụng SVM để dự đoán bệnh tiểu đường. Tôi đang sử dụng bộ dữ liệu BRFSS cho mục đích này. Tập dữ liệu có kích thước và bị lệch. Tỷ lệ phần trăm của s trong biến mục tiêu là trong khi s tạo thành còn lại .Y
N
Tôi chỉ sử dụng 15
các 136
biến độc lập từ bộ dữ liệu. Một trong những lý do để giảm tập dữ liệu là có nhiều mẫu đào tạo hơn khi các hàng chứa NA
s bị bỏ qua.
Các 15
biến này được chọn sau khi chạy các phương thức thống kê như cây ngẫu nhiên, hồi quy logistic và tìm ra biến nào có ý nghĩa từ các mô hình kết quả. Ví dụ, sau khi chạy hồi quy logistic, chúng tôi đã sử dụng p-value
để đặt hàng các biến quan trọng nhất.
Là phương pháp của tôi để làm lựa chọn biến chính xác? Bất kỳ đề xuất để được chào đón rất nhiều.
Sau đây là R
thực hiện của tôi .
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);
Tôi đã chạy với (training = và test = ) vì nó nhanh hơn trong máy tính xách tay của tôi. Ma trận nhầm lẫn cho dữ liệu thử nghiệm ( mẫu) tôi nhận được là khá tệ.
true
pred N Y
N 262 38
Y 0 0
Tôi cần cải thiện dự đoán của tôi cho Y
lớp học. Trong thực tế, tôi cần phải chính xác nhất có thể Y
ngay cả khi tôi thực hiện kém với N
. Bất kỳ đề xuất để cải thiện tính chính xác của phân loại sẽ được đánh giá rất cao.
Y
cho bất kỳ đầu vào. Điều này có nghĩa là nó sẽ đúng thời gian.