ใน ตอนที่ 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 ที่ดีขึ้น เร็วขึ้น