Cải thiện phân loại SVM của bệnh tiểu đường


10

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 .432607×136Y11%N89%

Tôi chỉ sử dụng 15các 136biế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 NAs bị bỏ qua.

Các 15biế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à Rthự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ệ.1000700300300

    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 Ylớp học. Trong thực tế, tôi cần phải chính xác nhất có thể Yngay 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.


Tôi đoán SVM của bạn hoàn toàn không hoạt động, nhưng không biết tại sao! cũng có thể tốt hơn để bình thường hóa dữ liệu của bạn ...
user4581

Có nó về cơ bản dự đoán Ycho bất kỳ đầu vào. Điều này có nghĩa là nó sẽ đúng thời gian.  90%
Anand

Bình thường hóa dữ liệu là điều tốt nhất để bắt đầu. Bắt đầu bằng cách đó. Bạn cũng có thể cố gắng tìm kiếm kernel phi tuyến tính có thể hiển thị kết quả tốt hơn. (Nó phụ thuộc vào ưu thế biên giới của bạn, có thể bình thường hóa là đủ)
404Dreamer_ML

Bạn cũng có thể thử kernlabthay vì e1071- nó tự động chuẩn hóa và có một số phương pháp phỏng đoán giúp dễ dàng khởi động mô hình đầu tiên.

Câu trả lời:


9

Tôi có 4 gợi ý:

  1. Làm thế nào bạn chọn các biến để đưa vào mô hình của bạn? Có thể bạn đang thiếu một số chỉ số chính từ bộ dữ liệu lớn hơn.
  2. Hầu như tất cả các chỉ số bạn đang sử dụng (như tình dục, người hút thuốc, v.v.) nên được coi là yếu tố. Việc coi các biến này là số là sai và có thể góp phần gây ra lỗi trong mô hình của bạn.
  3. Tại sao bạn sử dụng một SVM? Bạn đã thử bất kỳ phương pháp đơn giản hơn, chẳng hạn như phân tích phân biệt tuyến tính hoặc thậm chí hồi quy tuyến tính? Có thể một cách tiếp cận đơn giản trên một tập dữ liệu lớn hơn sẽ mang lại kết quả tốt hơn.
  4. Hãy thử gói caret . Nó sẽ giúp bạn xác thực chéo độ chính xác của mô hình, nó được song song hóa cho phép bạn làm việc nhanh hơn và giúp bạn dễ dàng khám phá các loại mô hình khác nhau.

Dưới đây là một số mã ví dụ cho caret:

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)

Mô hình LDA này đánh bại SVM của bạn và tôi thậm chí không sửa các yếu tố của bạn. Tôi chắc chắn nếu bạn mã hóa lại Sex, Smoker, v.v. làm yếu tố, bạn sẽ nhận được kết quả tốt hơn.


Tôi nhận được lỗi sau task 1 failed - "could not find function "predictionFunction"". Tôi biết đây không phải là một diễn đàn nhưng nếu bạn có bất kỳ ý kiến ​​nào xin vui lòng cho tôi biết.
Anand

1
@Anand: Mở phiên R mới với tư cách quản trị viên (hoặc chạy sudo R trên mac / linux). Chạy update.packages.Khi kết thúc, đóng R và mở lại một phiên bình thường (không phải quản trị viên). Chạy mã của bạn ngoại trừ phần "SVM" và "Ma trận nhầm lẫn". Sau đó chạy mã của tôi. Nếu bạn vẫn gặp lỗi, vui lòng gửi dòng trả về lỗi, cùng với lỗi chính xác.
Zach

1
@Anand: Ngoài ra, hãy đảm bảo bạn đang chạy phiên bản R mới nhất (2.14) và sử dụng phiên bản mới nhất của dấu mũ. Bạn có thể cập nhật dấu mũ bằng cách chạy install.packages('caret')lại.
Zach

@Anand: Tuyệt vời! Bạn có thể thả vào các phương thức khác nhau cho trainhàm, chẳng hạn như nb(vịnh ngây thơ), glm(hồi quy logistic) svmLinearsvmRadial. Các Svm sẽ mất một thời gian dài để phù hợp.
Zach

3

Nếu bạn đang sử dụng hạt nhân tuyến tính, thì có thể lựa chọn tính năng là một ý tưởng tồi và việc chính quy hóa có thể ngăn chặn sự phù hợp quá mức hiệu quả hơn so với lựa chọn tính năng có thể. Lưu ý rằng giới hạn hiệu suất mà SVM xấp xỉ thực hiện không phụ thuộc vào kích thước của không gian tính năng, là một trong những điểm bán hàng của SVM.


2

Gần đây tôi đã gặp vấn đề này và tìm thấy một vài điều có ích. Trước tiên, hãy thử mô hình Naive Bayes (gói klaR) đôi khi mang lại cho bạn kết quả tốt hơn khi lớp thiểu số trong một vấn đề phân loại nhỏ. Ngoài ra, nếu bạn chọn gắn bó với một SVM, bạn có thể muốn thử chồng chéo lớp thiểu số. Về cơ bản, bạn sẽ muốn bao gồm nhiều ví dụ về lớp thiểu số hoặc các trường hợp tạo tổng hợp cho lớp thiểu số

Bài viết này: http: //www.it.iitb.ac.in/~kam Meat / Page / Báo cáo / highSkewed.pdf

Có một số thảo luận và ví dụ về các kỹ thuật này được triển khai trong Weka, nhưng việc tự mình thực hiện chúng trong R cũng có thể.


Cảm ơn các ý kiến ​​hữu ích. Hãy để tôi thử đề xuất của bạn.
Anand

1

Ngoài những gì đã được đề cập, bạn đang sửa mô hình tốt nhất của mình để sử dụng kernel tuyến tính. Bạn nên dự đoán bằng cách sử dụng mô hình tốt nhất đã được điều chỉnh, bao gồm cùng một hạt nhân đã được sử dụng / tìm thấy trong giai đoạn điều chỉnh của bạn (mà tôi giả sử là RBF vì bạn đang điều chỉnh gamma).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.