การปรับปรุงการจำแนกประเภท SVM ของโรคเบาหวาน


10

ฉันใช้ SVM เพื่อทำนายโรคเบาหวาน ฉันใช้ชุดข้อมูลBRFSSเพื่อจุดประสงค์นี้ ชุดข้อมูลมีขนาดและเบ้ ร้อยละของในตัวแปรเป้าหมายคือขณะที่s เป็นการส่วนที่เหลืออีก\%432607×136Y89 %11%N89%

ฉันกำลังใช้เพียง15ออกจาก136ตัวแปรอิสระจากชุดข้อมูล หนึ่งในเหตุผลในการลดชุดข้อมูลคือต้องมีตัวอย่างการฝึกอบรมเพิ่มเติมเมื่อNAละเว้นแถวที่มีs

15ตัวแปรเหล่านี้ถูกเลือกหลังจากใช้วิธีการทางสถิติเช่นต้นไม้สุ่มการถดถอยโลจิสติกส์และการค้นหาว่าตัวแปรใดมีความสำคัญจากตัวแบบผลลัพธ์ ตัวอย่างเช่นหลังจากรันการถดถอยโลจิสติกเราใช้p-valueในการสั่งซื้อตัวแปรที่สำคัญที่สุด

วิธีการเลือกตัวแปรของฉันถูกต้องหรือไม่ ข้อเสนอแนะใด ๆ ที่จะยินดีอย่างมาก

ต่อไปนี้คือRการดำเนินการของฉัน

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);

ฉันวิ่งด้วยตัวอย่าง (การฝึกอบรม =และทดสอบ = ) เนื่องจากแล็ปท็อปของฉันเร็วขึ้น เมทริกซ์ความสับสนสำหรับข้อมูลการทดสอบ (ตัวอย่าง) ที่ฉันได้รับนั้นค่อนข้างแย่700 300 3001000700300300

    true
pred   N   Y
   N 262  38
   Y   0   0

ฉันต้องปรับปรุงการทำนายผลสำหรับYชั้นเรียน ที่จริงแล้วฉันต้องแม่นยำที่สุดเท่าที่จะทำได้Yแม้ว่าฉันจะทำงานได้ไม่ดีNก็ตาม คำแนะนำใด ๆ เพื่อปรับปรุงความถูกต้องของการจำแนกประเภทจะได้รับการชื่นชมอย่างมาก


ฉันเดาว่า SVM ของคุณไม่ทำงานเลย แต่ไม่รู้ว่าทำไม! นอกจากนี้ยังอาจเป็นการดีที่จะทำให้ข้อมูลของคุณเป็นมาตรฐาน ...
4581

ใช่มันเป็นพื้นฐานYสำหรับการป้อนข้อมูลใด ๆ ซึ่งหมายความว่าจะถูกต้องของเวลา  90%
อานันท์

การทำให้ข้อมูลเป็นมาตรฐานเป็นสิ่งที่ดีที่สุดในการเริ่มต้น เริ่มต้นด้วยสิ่งนั้น คุณสามารถลองค้นหาด้วยเคอร์เนลที่ไม่ใช่แบบเส้นตรงอาจแสดงผลลัพธ์ที่ดีกว่า (ขึ้นอยู่กับตำแหน่งหน้าที่ชายแดนของคุณอาจจะทำให้ปกติน่าจะเพียงพอ)
404Dreamer_ML

คุณอาจลองkernlabแทนที่e1071- มันจะทำการทำให้เป็นมาตรฐานโดยอัตโนมัติและมีฮิวริสติกบางอย่างที่ทำให้การบูตโมเดลแรกง่ายขึ้น

คำตอบ:


9

ฉันมี 4 ข้อเสนอแนะ:

  1. คุณเลือกตัวแปรที่จะรวมไว้ในแบบจำลองของคุณอย่างไร บางทีคุณอาจขาดบางตัวชี้วัดสำคัญจากชุดข้อมูลขนาดใหญ่
  2. ตัวบ่งชี้เกือบทั้งหมดที่คุณใช้ (เช่นเพศผู้สูบบุหรี่เป็นต้น) ควรได้รับการพิจารณาว่าเป็นปัจจัย การปฏิบัติต่อตัวแปรเหล่านี้ในฐานะที่เป็นตัวเลขนั้นผิดและอาจเป็นสาเหตุของข้อผิดพลาดในแบบจำลองของคุณ
  3. ทำไมคุณถึงใช้ SVM คุณลองใช้วิธีที่ง่ายกว่าเช่นการวิเคราะห์จำแนกเชิงเส้นหรือการถดถอยเชิงเส้นหรือไม่? บางทีวิธีง่ายๆในชุดข้อมูลขนาดใหญ่อาจให้ผลลัพธ์ที่ดีกว่า
  4. ลองใช้ชุดอักขระคาเร็ต มันจะช่วยให้คุณตรวจสอบความถูกต้องของโมเดลได้แบบขนานซึ่งจะช่วยให้คุณทำงานได้เร็วขึ้นและทำให้ง่ายต่อการสำรวจรุ่นต่างๆ

นี่คือตัวอย่างโค้ดสำหรับคาเร็ต:

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)

โมเดล LDA นี้ชนะ SVM ของคุณและฉันไม่ได้แก้ไขปัจจัยของคุณ ฉันแน่ใจว่าถ้าคุณบันทึกเพศ, ผู้สูบบุหรี่ ฯลฯ เป็นปัจจัยคุณจะได้รับผลลัพธ์ที่ดีขึ้น


task 1 failed - "could not find function "predictionFunction""ฉันได้รับข้อผิดพลาดดังต่อไปนี้ ฉันรู้ว่านี่ไม่ใช่ฟอรัม แต่ถ้าคุณมีความคิดเห็นใด ๆ โปรดแจ้งให้เราทราบ
อานันท์

1
@Anand: เปิดเซสชัน R ใหม่ในฐานะผู้ดูแลระบบ (หรือเรียกใช้ sudo R บน mac / linux) เรียกใช้update.packages.เมื่อเสร็จแล้วให้ปิด R และเปิดเซสชันปกติ (ไม่ใช่ผู้ดูแลระบบ) อีกครั้ง เรียกใช้รหัสของคุณยกเว้นส่วน "SVM" และ "Confusion matrix" จากนั้นเรียกใช้รหัสของฉัน หากคุณยังคงได้รับข้อผิดพลาดโปรดโพสต์บรรทัดที่ส่งคืนข้อผิดพลาดพร้อมกับข้อผิดพลาดที่แน่นอน
Zach

1
@Anand: ตรวจสอบให้แน่ใจว่าคุณใช้เวอร์ชันล่าสุดของ R (2.14) และใช้ caret เวอร์ชันล่าสุด คุณสามารถอัปเดตคาเร็ตด้วยการทำงานinstall.packages('caret')อีกครั้ง
Zach

@Anand: เยี่ยมมาก! คุณสามารถวางในวิธีการที่แตกต่างกันสำหรับtrainฟังก์ชั่นเช่นnb(Bayes ไร้เดียงสา) glm(ถดถอยโลจิสติ) และsvmLinear svmRadialsvm จะใช้เวลานานพอสมควร
Zach

3

หากคุณกำลังใช้เคอร์เนลเชิงเส้นอาจเป็นไปได้ว่าการเลือกคุณลักษณะเป็นแนวคิดที่ไม่ดีและการทำให้เป็นมาตรฐานนั้นสามารถป้องกันการปรับขนาดได้อย่างมีประสิทธิภาพมากกว่าการเลือกคุณสมบัติ โปรดทราบว่าขอบเขตการปฏิบัติงานที่ SVM ดำเนินการโดยประมาณมีความเป็นอิสระจากมิติของพื้นที่คุณลักษณะซึ่งเป็นหนึ่งในจุดขายของ SVM


2

ฉันมีปัญหานี้เมื่อเร็ว ๆ นี้และพบสองสิ่งที่ช่วย ขั้นแรกให้ลองใช้โมเดล Naive Bayes (แพคเกจ klaR) ซึ่งบางครั้งจะให้ผลลัพธ์ที่ดีกว่าเมื่อระดับของชนกลุ่มน้อยในปัญหาการจำแนกมีขนาดเล็ก นอกจากนี้หากคุณเลือกที่จะยึดติดอยู่กับ SVM คุณอาจต้องการลองสุ่มตัวอย่างระดับชั้นน้อย โดยพื้นฐานแล้วคุณจะต้องรวมตัวอย่างเพิ่มเติมของคลาสของชนกลุ่มน้อยหรือสร้างเคสสำหรับคลาสของชนกลุ่มน้อย

กระดาษนี้: http: //www.it.iitb.ac.in/~kamlesh/Page/Reports/highlySkewed.pdf

มีการอภิปรายและตัวอย่างของเทคนิคเหล่านี้ที่นำมาใช้ใน Weka แต่การปลูกฝังพวกเขาเองใน R ก็เป็นไปได้เช่นกัน


ขอบคุณสำหรับความคิดเห็นที่เป็นประโยชน์ ให้ฉันลองทำตามคำแนะนำของคุณ
อานันท์

1

นอกเหนือจากที่กล่าวมาแล้วคุณกำลังแก้ไขโมเดลที่ดีที่สุดของคุณเพื่อใช้เคอร์เนลเชิงเส้น คุณควรทำนายโดยใช้แบบจำลองที่ดีที่สุดที่ได้รับการปรับรวมถึงเคอร์เนลเดียวกับที่ใช้ / พบในขั้นตอนการปรับแต่งของคุณ (ซึ่งฉันถือว่าเป็น RBF เนื่องจากคุณกำลังปรับแกมม่า)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.