วิธีเพิ่มความแม่นยำของตัวจําแนก


17

ฉันใช้ตัวอย่าง OpenCV letter_recog.cpp เพื่อทดลองบนต้นไม้แบบสุ่มและตัวแยกประเภทอื่น ๆ ตัวอย่างนี้มีการใช้งานของตัวแยกประเภทหกตัว - ต้นไม้แบบสุ่ม, การส่งเสริม, MLP, kNN, ไร้เดียงสา Bayes และ SVM ชุดข้อมูลการรู้จำจดหมาย UCI ที่มีอินสแตนซ์ 20,000 ตัวและมีฟีเจอร์ 16 ตัวซึ่งฉันแบ่งครึ่งสำหรับการฝึกอบรมและการทดสอบ ฉันมีประสบการณ์กับ SVM ดังนั้นฉันจึงตั้งค่าข้อผิดพลาดการรู้จำเป็น 3.3% หลังจากการทดลองสิ่งที่ฉันได้รับคือ:

การรับรู้จดหมาย UCI:

  • RTrees - 5.3%
  • เพิ่ม - 13%
  • MLP - 7.9%
  • kNN (k = 3) - 6.5%
  • เบย์ - 11.5%
  • SVM - 3.3%

พารามิเตอร์ที่ใช้:

  • RTrees - max_num_of_trees_in_the_forrest = 200, max_depth = 20, min_sample_count = 1

  • Boost - boost_type = REAL, weak_count = 200, weight_trim_rate = 0.95, max_depth = 7

  • MLP - method = BACKPROP, param = 0.001, max_iter = 300 (ค่าเริ่มต้น - การทดสอบช้าเกินไป)

  • kNN (k = 3) - k = 3

  • เบย์ - ไม่มี

  • SVM - เคอร์เนล RBF, C = 10, gamma = 0.01

หลังจากนั้นฉันใช้พารามิเตอร์เดียวกันและทดสอบกับชุดข้อมูล Digits และ MNIST โดยแยกคุณสมบัติการไล่ระดับสีก่อน (องค์ประกอบขนาดเวกเตอร์ 200):

ตัวเลข:

  • RTrees - 5.1%
  • เพิ่ม - 23.4%
  • MLP - 4.3%
  • kNN (k = 3) - 7.3%
  • Bayes - 17.7%
  • SVM - 4.2%

MNIST:

  • RTrees - 1.4%
  • Boost - หน่วยความจำไม่เพียงพอ
  • MLP - 1.0%
  • kNN (k = 3) - 1.2%
  • เบย์ - 34.33%
  • SVM - 0.6%

ฉันใหม่สำหรับตัวแยกประเภททั้งหมดยกเว้น SVM และ kNN สำหรับสองตัวนี้ฉันสามารถพูดได้ว่าผลลัพธ์ดูดี แล้วคนอื่นล่ะ? ฉันคาดหวังมากขึ้นจากต้นไม้แบบสุ่มใน MNIST kNN ให้ความแม่นยำที่ดีกว่าแนวคิดใดจะทำให้ได้สูงขึ้นได้อย่างไร Boost และ Bayes ให้ความแม่นยำต่ำมาก ในที่สุดฉันต้องการใช้ตัวแยกประเภทเหล่านี้เพื่อสร้างระบบตัวจําแนกหลายระบบ คำแนะนำใด ๆ?

คำตอบ:


9

การลดขนาด

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

หากคุณสนใจฉันได้เขียนเกี่ยวกับ PCA, LDA และเทคนิคอื่น ๆ ที่นี่: http://sebastianraschka.com/index.html#machine_learningและใน GitHub repo ของฉันที่นี่: https://github.com/rasbt/pattern_classification

การตรวจสอบข้าม

นอกจากนี้คุณอาจต้องการดูเทคนิคการตรวจสอบข้ามเพื่อประเมินประสิทธิภาพของตัวจําแนกของคุณในลักษณะที่เป็นวัตถุประสงค์มากขึ้น


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

อะไรคือสัดส่วนสัมพัทธ์ของชุดข้อมูลการฝึกอบรมและการทดสอบ btw? มีบางอย่างในบรรทัด 70:30, 60:40 หรือ 50:50

ชุดข้อมูลแรก - การจดจำตัวอักษร UCI ตั้งไว้ที่ 50:50 (10,000: 10,000) ตัวเลขประมาณ 51:49 (1893: 1796) และ MNIST ประมาณ 86:14 (60000: 10,000)
มิกะ

ฉันทดลองกับ PCA แล้วยังไม่ได้ผลลัพธ์ที่ดีกับฟอร์เรสต์แบบสุ่ม แต่การเพิ่มและตอนนี้ Bayes ให้ผลลัพธ์คล้ายกับตัวแยกประเภทอื่น ๆ ฉันพบการสนทนาเกี่ยวกับการสุ่มฟอร์เรสต์ที่นี่: stats.stackexchange.com/questions/66543/ ......เป็นไปได้จริง ๆ แล้วฉันไม่ได้ overfitting แต่ไม่พบข้อผิดพลาดการคาดการณ์ out-of-bag (OOB) ที่กล่าวถึงที่นั่น กำลังดำเนินการทดสอบกับต้นไม้จำนวนมากเพื่อดูว่าความแม่นยำจะดีขึ้นหรือไม่
มิกะ

ตกลงเสียงที่คุณกำลังคืบหน้าเล็กน้อย :) คำถามเล็กน้อย แต่คุณทำให้มาตรฐานของคุณ (คะแนน z) เพื่อให้พวกเขาเป็นศูนย์กลางรอบค่าเฉลี่ยด้วยส่วนเบี่ยงเบนมาตรฐาน = 1?

5

ฉันคาดหวังมากขึ้นจากต้นไม้แบบสุ่ม :

  • ด้วยฟอเรสต์แบบสุ่มซึ่งโดยทั่วไปจะใช้สำหรับคุณสมบัติ N จะใช้คุณสมบัติ sqrt (N) สำหรับการสร้างแผนผังการตัดสินใจแต่ละครั้ง เนื่องจากในกรณีของคุณN = 20 คุณสามารถลองตั้งค่า max_depth (จำนวนคุณลักษณะย่อยเพื่อสร้างแผนผังการตัดสินใจแต่ละรายการ) เป็น 5

  • แทนที่จะเป็นต้นไม้ตัดสินใจต้นไม้เชิงเส้นได้รับการเสนอและประเมินผลเป็นตัวประมาณฐานในป่าสุ่มโดยเฉพาะการถดถอยโลจิสติกพหุนามและ Bayes ไร้เดียงสา สิ่งนี้อาจปรับปรุงความแม่นยำของคุณ

ใน MNIST kNN ให้ความแม่นยำที่ดีกว่าความคิดใด ๆ ที่จะทำให้สูงขึ้นได้อย่างไร

  • ลองด้วยค่าที่สูงขึ้นของ K (พูด 5 หรือ 7) ค่าที่สูงกว่าของ K จะให้หลักฐานสนับสนุนเพิ่มเติมเกี่ยวกับฉลากระดับของจุด
  • คุณสามารถเรียกใช้ PCA หรือการวิเคราะห์จำแนกเชิงเส้นของฟิชเชอร์ก่อนที่จะเรียกใช้เพื่อนบ้านที่ใกล้ที่สุด k ด้วยวิธีนี้คุณสามารถกำจัดฟีเจอร์ที่สัมพันธ์กันในขณะที่คำนวณระยะทางระหว่างจุดต่าง ๆ และด้วยเหตุนี้เพื่อนบ้าน k ของคุณจะมีประสิทธิภาพมากขึ้น
  • ลองใช้ค่า K ที่แตกต่างกันสำหรับจุดต่าง ๆ โดยพิจารณาจากความแปรปรวนในระยะทางระหว่างเพื่อนบ้าน K

ฉันเชื่อว่าคุณกำลังอ้างถึงพารามิเตอร์ OpenCV nactive_vars (ไม่ใช่ max_depth) ซึ่งฉันตั้งเป็นค่าเริ่มต้น sqrt (N) นั่นคือ nactive_vars = sqrt (16) สำหรับชุดข้อมูลแรกและ sqrt (200) สำหรับอีกสองคน max_depth กำหนดว่าต้นไม้เติบโตเต็มความลึกหรือไม่ (25 คือค่าสูงสุด) และยอดคงเหลือระหว่าง underfitting และ overfitting เพิ่มเติมเกี่ยวกับที่นี่: stats.stackexchange.com/questions/66209/…ไม่แน่ใจเกี่ยวกับ min_sample_count แต่ฉันลองค่าต่าง ๆ และตั้งค่า ถึง 1 ทำงานได้ดีที่สุด
มิกะ

เอกสาร OpenCV ให้คำอธิบายโดยย่อเกี่ยวกับพารามิเตอร์: docs.opencv.org/modules/ml/doc/ ......ตอนนี้ฉันต้องการให้ต้นไม้แบบสุ่มทำงานได้ดีพอสมควรและทำให้สิ่งต่าง ๆ ง่ายขึ้นเพราะฉันต้องการเน้นการทำงานกับระบบตัวจําแนกหลายระบบ
มิกะ

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

ใช่ฉันไม่แน่ใจว่าทำไมฟอเรสต์แบบสุ่มทำงานไม่ดี (หรือดีกว่า) กว่าวิธี k-NN แบบง่าย ๆ ... อาจเป็นกรณีที่เคอร์เนลเข้าใกล้ที่คุณพยายามประเมิน P (y | D) (ข้อมูลที่ส่งออกที่ได้รับ) เช่นใน k-NN โดยไม่ต้องประเมิน P (theta | D) (ข้อมูลที่ได้รับแบบจำลองแฝง) เช่นในโมเดลพารามิเตอร์
Debasis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.