ฉันกำลังพยายามสร้าง SVM จากข้อมูลการฝึกอบรมซึ่งมีกลุ่มหนึ่งแสดงมากกว่ากลุ่มอื่น อย่างไรก็ตามกลุ่มจะถูกนำเสนออย่างเท่าเทียมกันในข้อมูลการทดสอบในที่สุด ดังนั้นฉันต้องการใช้class.weights
พารามิเตอร์ของe1071
ส่วนต่อประสาน R libsvm
เพื่อความสมดุลระหว่างอิทธิพลของทั้งสองกลุ่มในข้อมูลการฝึกอบรม
เนื่องจากฉันไม่แน่ใจว่าจะระบุน้ำหนักเหล่านี้ได้อย่างไรฉันจึงทำการทดสอบเล็กน้อย:
- สร้างข้อมูลที่มีค่าว่างบางส่วน (คุณสมบัติแบบสุ่มอัตราส่วน 2: 1 ระหว่างป้ายกำกับกลุ่ม)
- พอดี svm ด้วย
class.weights
ชุดพารามิเตอร์ - ทำนายชุดข้อมูลว่างใหม่จำนวนหนึ่งและดูสัดส่วนของคลาส
- ทำซ้ำกระบวนการทั้งหมดหลายครั้งสำหรับชุดการฝึกอบรมแบบ null ที่แตกต่างกัน
นี่คือรหัส R ที่ฉันใช้:
nullSVM <- function(n.var, n.obs) {
# Simulate null training data
vars = matrix(rnorm(n.var*n.obs), nrow=n.obs)
labels = rep(c('a', 'a', 'b'), length.out=n.obs)
data = data.frame(group=labels, vars)
# Fit SVM
fit = svm(group ~ ., data=data, class.weights=c(a=0.5, b=1))
# Calculate the average fraction of 'a' we would predict from null test data
mean(replicate(50, table(predict(fit, data.frame(matrix(rnorm(n.var*n.obs), nrow=n.obs))))[1])) / n.obs
}
library(e1071)
set.seed(12345)
mean(replicate(50, nullSVM(50, 300)))
จากสิ่งทั้งหมดนี้ฉันคาดหวังผลลัพธ์ที่ออกมา ~ 0.5 แต่นั่นไม่ใช่สิ่งที่ฉันได้รับ:
> mean(replicate(50, nullSVM(50, 300)))
[1] 0.6429987
class.weights
พารามิเตอร์ทำงานเรียงลำดับของการเป็นน้ำหนักผมลดลงa
ต่ำกว่ามันเป็นตัวแทนในการจำลองนี้ (และถ้าผมละเว้นclass.weights
มันกลับใกล้กับ 1) ... แต่ฉันไม่เข้าใจว่าทำไมเพียงแค่ใช้น้ำหนัก 1: 2 ( สำหรับข้อมูลการฝึกอบรมที่เป็น 2: 1) ไม่ได้รับฉันไปจนถึง 50%
หากฉันเข้าใจผิดเกี่ยวกับ SVM บางคนสามารถอธิบายประเด็นนี้ได้หรือไม่ (หรือส่งผู้อ้างอิงบางส่วน?)
หากฉันทำผิดคนสามารถบอกวิธีที่ถูกต้องในการใช้class.weights
พารามิเตอร์ได้หรือไม่?
มันอาจจะเป็นข้อผิดพลาดหรือไม่? (ฉันคิดว่าไม่ได้เนื่องจากฉันเข้าใจซอฟต์แวร์นี้และ libsvm ที่พื้นฐานแล้วจะค่อนข้างสมบูรณ์)