ใน ตอนที่ 1 ของชุดนี้ เราได้พูดคุยถึงปัญหาความไม่สมดุลของชั้นเรียนคืออะไร และเหตุใดจึงจำเป็นต้องจัดการกับความไม่สมดุลของชั้นเรียน ในส่วนนี้ เราจะเรียนรู้ว่าน้ำหนักของชั้นเรียนคืออะไร และวิธีปรับปรุงความไม่สมดุลของชั้นเรียนโดยใช้น้ำหนักของชั้นเรียน
น้ำหนักของชั้นเรียนคืออะไร?
ด้วยข้อมูลคลาสที่มีอคติ อัลกอริธึมการเรียนรู้ของเครื่องส่วนใหญ่จึงไม่มีประโยชน์มากนัก อย่างไรก็ตาม เราสามารถปรับเปลี่ยนอัลกอริธึมการฝึกเพื่อคำนึงถึงการกระจายคลาสที่บิดเบือนได้ ซึ่งสามารถทำได้โดยการให้น้ำหนักที่แตกต่างกันให้กับชั้นเรียนส่วนใหญ่และชนกลุ่มน้อย ในขั้นตอนการฝึก น้ำหนักที่แตกต่างกันจะส่งผลต่อการแบ่งประเภทของชั้นเรียน จุดประสงค์ทั้งหมดของระบบนี้คือการลงโทษการจัดประเภทที่ไม่ถูกต้องซึ่งสร้างขึ้นโดยชนกลุ่มน้อยด้วยการกำหนดน้ำหนักของชั้นเรียนให้สูงขึ้น ขณะเดียวกันก็ลดน้ำหนักของชั้นเรียนส่วนใหญ่ด้วย
เพื่อให้สิ่งต่าง ๆ ชัดเจนยิ่งขึ้น เราจะทบทวนตัวอย่างเมืองที่เราพิจารณาก่อนหน้านี้อีกครั้ง
ลองคิดดู: คุณใช้เวลาเดือนที่แล้วในเมืองใหม่ของคุณ แทนที่จะออกไปข้างนอกเมื่อจำเป็น คุณได้สำรวจเมืองใหม่ตลอดทั้งเดือน คุณใช้เวลาทั้งเดือนในการทำความเข้าใจเส้นทางและสถานที่ในเมือง ตอนนี้คุณสามารถเข้าใจเมืองใหม่ได้ดีขึ้นแล้ว เนื่องจากคุณใช้เวลาค้นคว้าข้อมูลมากขึ้นและมีโอกาสหลงทางน้อยลง
นี่คือวิธีการทำงานของตุ้มน้ำหนักของชั้นเรียน เราให้น้ำหนักแก่คลาสส่วนน้อยมากขึ้นในฟังก์ชันต้นทุนของอัลกอริทึมในระหว่างการฝึกอบรม เพื่อให้สามารถให้โทษที่สูงกว่าแก่คลาสส่วนน้อย และอัลกอริทึมสามารถลดข้อผิดพลาดสำหรับคลาสส่วนน้อยได้
โปรดทราบว่ามีเกณฑ์ที่ควรเพิ่มหรือลดน้ำหนักของชนกลุ่มน้อยและกลุ่มส่วนใหญ่ ด้วยการให้น้ำหนักที่สูงมากแก่คลาสเสียงข้างน้อย อัลกอริธึมจะมีอคติต่อคลาสเสียงข้างน้อย ซึ่งจะเพิ่มข้อผิดพลาดในคลาสเสียงข้างมาก
ไลบรารีการสร้างแบบจำลองตัวแยกประเภท sklearn ส่วนใหญ่รวมถึงไลบรารีที่เน้นการเพิ่มประสิทธิภาพเช่น LightGBM และ catboost มีพารามิเตอร์ในตัว “class_weight” ซึ่งช่วยให้เราสามารถเพิ่มประสิทธิภาพการให้คะแนนสำหรับคลาสส่วนน้อยได้ ตามค่าเริ่มต้น class_weight=None ดังนั้นทั้งสองคลาสจึงมีน้ำหนักเท่ากัน นอกจากนั้น เราอาจส่งพจนานุกรมที่มีน้ำหนักแบบแมนนวลสำหรับทั้งสองคลาสหรือให้ค่า 'สมดุล' ก็ได้ โมเดลจะกำหนดน้ำหนักของคลาสตามสัดส่วนผกผันกับความถี่ตามลำดับโดยอัตโนมัติเมื่อ class_weights = 'สมดุล'
เพื่อคำนวณสิ่งนี้ สูตรจะเป็นดังนี้:
wj=n_samples / (n_classes * n_samplesj)
ที่นี่,
- j หมายถึงชั้นเรียน
- wj = น้ำหนักของแต่ละคลาส
- n_samples = จำนวนตัวอย่างหรือแถวทั้งหมดในชุดข้อมูล
- n_classes = จำนวนคลาสที่ไม่ซ้ำกันทั้งหมดในเป้าหมาย
- n_samplesj = จำนวนแถวทั้งหมดของคลาสที่เกี่ยวข้อง
สำหรับตัวอย่างจังหวะของเรา (อ้างอิงในตอนที่ 1):
n_ตัวอย่าง = 43400
n_คลาส= 2(0&1)
n_sample0= 42617
n_ตัวอย่าง1= 783
ซึ่งหมายถึงน้ำหนักสำหรับคลาส 0:
w0= 43400/(2*42617) = 0.509
ในทำนองเดียวกันน้ำหนักสำหรับคลาส 1:
w1= 43400/(2*783) = 27.713
หวังว่านี่จะชี้แจงว่า class_weight = 'balanced' ช่วยเราในการให้น้ำหนักที่สูงกว่าแก่กลุ่มชนกลุ่มน้อย และให้น้ำหนักที่ต่ำกว่าแก่กลุ่มคนส่วนใหญ่ได้อย่างไร
การส่งผ่านค่าเป็น 'สมดุล' จะให้ผลลัพธ์ที่ดีที่สุดโดยทั่วไป แต่ในกรณีร้ายแรงของความไม่สมดุลของคลาส เราสามารถปรับน้ำหนักได้ด้วยตนเอง
น้ำหนักชั้นเรียนในการถดถอยโลจิสติก
ตามทฤษฎี เราสามารถแก้ไขอัลกอริธึมการเรียนรู้ของเครื่องได้โดยการเพิ่มน้ำหนักคลาสที่แตกต่างกันให้กับฟังก์ชันต้นทุน แต่เราจะหารือเกี่ยวกับการถดถอยโลจิสติกโดยเฉพาะที่นี่
หมายเหตุ: คำอธิบายนี้ใช้เฉพาะการถดถอยโลจิสติกเท่านั้น เนื่องจากอัลกอริทึมขั้นสูงนี้ใช้งานง่าย
การสูญเสียบันทึกถูกใช้เป็นฟังก์ชันต้นทุนสำหรับการถดถอยโลจิสติก เราไม่ใช้ค่าคลาดเคลื่อนกำลังสองเฉลี่ยเป็นฟังก์ชันต้นทุนในการถดถอยโลจิสติก เนื่องจากเราใช้เส้นโค้งซิกมอยด์แทนเส้นตรงเป็นฟังก์ชันการทำนาย การยกกำลังสองของฟังก์ชันซิกมอยด์จะทำให้เกิดเส้นโค้งที่ไม่นูน ซึ่งหมายความว่าจะมีค่าขั้นต่ำเฉพาะจุดหลายจุด ซึ่งทำให้การลู่เข้าโดยใช้การไล่ระดับลงทำได้ยาก อย่างไรก็ตาม การสูญเสียบันทึกเป็นฟังก์ชันนูน และเราสามารถรวมกันได้เพียงค่าต่ำสุดเท่านั้น
กำลังแยกตัวอย่างข้อมูลที่ยากใช่ไหม ดาวหางสามารถทำเช่นนั้นได้ เรียนรู้เพิ่มเติมเกี่ยวกับสถานการณ์ PetCam ของเราและค้นพบสิ่งประดิษฐ์ของดาวหาง
การสูญเสียบันทึกจะถูกคำนวณดังนี้:
ที่นี่,
- N = จำนวนค่า
- yi = ค่าที่แท้จริงของคลาสเป้าหมาย
- yi = ความน่าจะเป็นที่คาดการณ์ไว้ของคลาสเป้าหมาย
ใช้สูตรการสูญเสียบันทึก มาสร้างตารางจำลองที่ประกอบด้วยการคาดการณ์จริง ความน่าจะเป็นที่คาดการณ์ไว้ และต้นทุนที่คำนวณได้
เรามีข้อสังเกต 10 รายการในตารางนี้ เก้ารายการจากคลาส 0 และอีกหนึ่งรายการจากคลาส 1 คอลัมน์ถัดไปแสดงความน่าจะเป็นที่คาดการณ์ไว้สำหรับการสังเกตแต่ละครั้ง และสุดท้าย เราก็มีการปรับค่าใช้จ่ายตามสูตรการสูญเสียบันทึก
เมื่อน้ำหนักถูกเพิ่มให้กับฟังก์ชันต้นทุน ฟังก์ชันการสูญเสียบันทึกที่แก้ไขจะเป็น:
ที่นี่,
- w0 = น้ำหนักคลาสสำหรับคลาส 0
- w1 = น้ำหนักของคลาสสำหรับคลาส 1
ตอนนี้ เรามาเพิ่มน้ำหนักและดูว่ามันจะส่งผลต่อค่าปรับอย่างไร
เราจะใช้สูตร class_weights= 'balanced' เพื่อคำนวณค่าน้ำหนัก
w0 = 10/(2*1) = 5
w1 = 10/(2*9) = 0.55
ต้นทุนสำหรับค่าแรกคำนวณดังนี้:
ต้นทุน = -(5(0*บันทึก(0.32) + 0.55(1–0)*บันทึก(1–0.32))
= -(0 + 0.55*บันทึก(.68))
= -(0.55*(-0.385))
= 0.211
ในทำนองเดียวกัน เราสามารถคำนวณต้นทุนถ่วงน้ำหนักสำหรับการสังเกตแต่ละครั้ง และตารางที่อัปเดตคือ:
ตารางนี้ยืนยันว่าน้ำหนักเล็กน้อยที่ใช้กับฟังก์ชันต้นทุนสำหรับคลาสส่วนใหญ่ส่งผลให้ค่าความผิดพลาดน้อยลง ส่งผลให้ค่าสัมประสิทธิ์แบบจำลองอัปเดตน้อยลง การเพิ่มค่าน้ำหนักที่มากขึ้นให้กับฟังก์ชันต้นทุนสำหรับคลาสส่วนน้อยส่งผลให้มีการคำนวณข้อผิดพลาดที่มากขึ้น และต่อมามีการอัพเดตค่าสัมประสิทธิ์แบบจำลองเพิ่มเติม การทำเช่นนี้ทำให้เราสามารถปรับอคติของโมเดลเพื่อลดข้อผิดพลาดในคลาสชนกลุ่มน้อยได้
บทสรุป
ในที่สุดเราก็สามารถสรุปได้ว่าน้ำหนักที่น้อยนำไปสู่การลงโทษเล็กน้อย และการอัปเดตค่าสัมประสิทธิ์ของแบบจำลองเล็กน้อย ในขณะที่น้ำหนักที่มากนำไปสู่การลงโทษจำนวนมาก และการอัปเดตค่าสัมประสิทธิ์ของแบบจำลองครั้งใหญ่
ในส่วนสุดท้ายของชุดนี้ เราจะเรียนรู้วิธีค้นหาค่าที่เหมาะสมที่สุดสำหรับน้ำหนักคลาสด้วยการนำไปใช้ใน Python
หมายเหตุบรรณาธิการ: Heartbeat เป็นสิ่งพิมพ์ออนไลน์ที่ขับเคลื่อนโดยผู้ร่วมให้ข้อมูลและชุมชนที่อุทิศให้กับการจัดหาทรัพยากรทางการศึกษาชั้นนำสำหรับวิทยาศาสตร์ข้อมูล การเรียนรู้ของเครื่อง และผู้ปฏิบัติงานด้านการเรียนรู้เชิงลึก เรามุ่งมั่นที่จะสนับสนุนและสร้างแรงบันดาลใจให้กับนักพัฒนาและวิศวกรจากทุกสาขาอาชีพ
Heartbeat เป็นอิสระด้านบรรณาธิการ สนับสนุนและเผยแพร่โดย Comet ซึ่งเป็นแพลตฟอร์ม MLOps ที่ช่วยให้นักวิทยาศาสตร์ข้อมูลและทีม ML สามารถติดตาม เปรียบเทียบ อธิบาย และเพิ่มประสิทธิภาพการทดลองของพวกเขา เราจ่ายเงินให้กับผู้ร่วมให้ข้อมูล และเราไม่ขายโฆษณา
หากคุณต้องการมีส่วนร่วม ตรงไปที่ เรียกผู้ร่วมให้ข้อมูล ของเรา คุณยังสามารถลงทะเบียนเพื่อรับจดหมายข่าวรายสัปดาห์ของเรา ("Deep Learning Weekly" และ "Comet Newsletter") เข้าร่วมกับเราที่ « ""Slack" และติดตาม Comet บน "Twitter" และ "LinkedIn" เพื่อดูแหล่งข้อมูล กิจกรรม และ อีกมากมายที่จะช่วยให้คุณสร้างโมเดล ML ที่ดีขึ้น เร็วขึ้น