SVM ที่มีขนาดกลุ่มไม่เท่ากันในข้อมูลการฝึกอบรม


12

ฉันกำลังพยายามสร้าง SVM จากข้อมูลการฝึกอบรมซึ่งมีกลุ่มหนึ่งแสดงมากกว่ากลุ่มอื่น อย่างไรก็ตามกลุ่มจะถูกนำเสนออย่างเท่าเทียมกันในข้อมูลการทดสอบในที่สุด ดังนั้นฉันต้องการใช้class.weightsพารามิเตอร์ของe1071ส่วนต่อประสาน R libsvmเพื่อความสมดุลระหว่างอิทธิพลของทั้งสองกลุ่มในข้อมูลการฝึกอบรม

เนื่องจากฉันไม่แน่ใจว่าจะระบุน้ำหนักเหล่านี้ได้อย่างไรฉันจึงทำการทดสอบเล็กน้อย:

  1. สร้างข้อมูลที่มีค่าว่างบางส่วน (คุณสมบัติแบบสุ่มอัตราส่วน 2: 1 ระหว่างป้ายกำกับกลุ่ม)
  2. พอดี svm ด้วยclass.weightsชุดพารามิเตอร์
  3. ทำนายชุดข้อมูลว่างใหม่จำนวนหนึ่งและดูสัดส่วนของคลาส
  4. ทำซ้ำกระบวนการทั้งหมดหลายครั้งสำหรับชุดการฝึกอบรมแบบ 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 ที่พื้นฐานแล้วจะค่อนข้างสมบูรณ์)


ฉันไม่มีประสบการณ์กับ libsvm แต่ด้วย LiblineaR น้ำหนักของชั้นเรียนมีความสำคัญ เมื่อตั้งอย่างถูกต้องคุณจะได้ผลลัพธ์ที่ดีที่สุดหากคลาสของคุณไม่สมดุลอย่างมาก ฉันอยากจะแนะนำ: รับชุดข้อมูลจริงด้วยคลาสที่ไม่สมดุลและลองใช้ค่า class.weights ที่แตกต่างกัน (ใน LiblineaR Wi) LiblineaR เป็นคำสั่งที่มีขนาดเร็วกว่าสำหรับเคอร์เนลบรรทัดและมีวิธีลงโทษด้วยเช่นกัน จากประสบการณ์ของผมครั้งแรกที่คุณพบว่าน้ำหนักระดับที่ดีและเพิ่มประสิทธิภาพแล้วซี
เบญจมบพิตรฯ

คำตอบ:


7

ฉันคิดว่ามันอาจขึ้นอยู่กับค่าของ C และจำนวนรูปแบบที่คุณมี SVM พยายามค้นหาการเลือกมาร์จิ้นขั้นสูงสุดดังนั้นหากคุณมีข้อมูลที่กระจัดกระจายเป็นไปได้ว่า SVM อาจหาวิธีการแก้ปัญหาที่ยากจะมาร์จิ้นโดยไม่มีตัวคูณ Lagrange ใด ๆ มาถึงขอบเขตบน (ในกรณีนี้ คลาสนั้นไม่เกี่ยวข้องอย่างไร้สาระเนื่องจาก slack-valiables มีขนาดเล็กหรือเป็นศูนย์ลองเพิ่มจำนวนรูปแบบการฝึกอบรมและดูว่ามันมีผลกระทบหรือไม่ (เพราะนั่นทำให้มีโอกาสน้อยกว่าที่วิธีแก้ปัญหาระยะขอบยากจะหาได้ในกล่อง จำกัด ) .

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


มันสมเหตุสมผลแล้ว เมื่อฉันลดจำนวนฟีเจอร์และเพิ่มจำนวนการสังเกตในการจำลองนี้ค่าเอาต์พุตจะขยับเข้าใกล้ 0.5 อย่างไรก็ตามมันไม่เคยไปถึงที่นั่น - แม้จะมี 900 แถวและ 1 คอลัมน์เท่านั้น
John Colby

แน่นอนเกี่ยวกับข้อมูลจริงฉันมักจะใช้caretแพคเกจหรือtune()ฟังก์ชั่นในตัวสำหรับการปรับพารามิเตอร์โมเดลดังนั้นฉันจึงชอบแนวคิดที่สองของคุณสำหรับวิธีการจัดการกับสิ่งนี้ในทางปฏิบัติโดยการปรับชุดรูปแบบการสุ่มใหม่เพื่อสนับสนุนชนชั้นน้อย ชื่นชมมาก
John Colby

ดีใจที่คุณแนะนำมีประโยชน์ มีบทความเกี่ยวกับการตั้งค่าอัตราส่วนที่เหมาะสมซึ่งอาจเป็นประโยชน์theoval.cmp.uea.ac.uk/publications/pdf/ijcnn2001.pdfอย่างไรก็ตามการแก้ไขเชิงทฤษฎีที่ดีที่สุดอาจไม่เหมาะสมที่สุดในทางปฏิบัติดังนั้นผลลัพธ์ที่ดีที่สุดอาจ จริง ๆ แล้วสามารถรับได้โดยการปรับพารามิเตอร์ C สองตัวโดยไม่บังคับอัตราส่วนเฉพาะ แต่ให้น้ำหนักรูปแบบตามระดับเมื่อทำการประเมินเกณฑ์การเลือกแบบจำลองแบบลาหนึ่ง - ออก
Dikran Marsupial

2
ฉันยังเพิ่มวันนี้ฉันมักจะใช้เคอร์เนลริดจ์ถดถอยมากกว่า SVM เพราะคุณไม่มีปัญหาแบบง่าย ๆ เหล่านี้เนื่องจากความไม่ต่อเนื่องในอนุพันธ์ของฟังก์ชันการสูญเสีย บ่อยครั้งถ้าคุณปรับ L2 SVM ให้ถูกต้องคุณจะได้ค่า C ที่น้อยมากและข้อมูลทั้งหมดเป็น SV ที่จุดนี้คุณมีโมเดล KRR อยู่แล้ว ยิ่งฉันใช้มันมากเท่าไรก็ยิ่งมีประโยชน์น้อยลงที่ฉันได้พบ SVMs ในทางปฏิบัติแม้ว่าข้อมูลเชิงลึกทางทฤษฎีที่พวกเขานำมามีความสำคัญ
Dikran Marsupial

0

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


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