วิธีใช้ smote สำหรับข้อมูลที่ไม่สมดุลใน r (พร้อมตัวอย่าง)
บ่อยครั้งเมื่อทำงานกับ อัลกอริธึมการจำแนกประเภท ของการเรียนรู้ของเครื่อง คลาสในชุดข้อมูลจะไม่สมดุล
ตัวอย่างเช่น:
- ชุดข้อมูลที่มีข้อมูลเกี่ยวกับว่าผู้เล่นระดับวิทยาลัยถูกร่างเข้าสู่ NBA หรือไม่ อาจมีผู้เล่น 98% ที่ยังไม่ได้ร่าง และ 2% กำลังถูกร่าง
- ชุดข้อมูลที่มีข้อมูลเกี่ยวกับผู้ป่วยที่เป็นมะเร็งหรือไม่นั้น อาจประกอบด้วยผู้ป่วย 99% ที่ไม่มีมะเร็ง และมีเพียง 1% ที่เป็นมะเร็ง
- ชุดข้อมูลที่มีข้อมูลการฉ้อโกงทางธนาคารอาจมีธุรกรรมที่ถูกต้องตามกฎหมาย 96% และธุรกรรมที่ฉ้อโกง 4%
เนื่องจากคลาสที่ไม่สมดุลเหล่านี้ โมเดลการคาดการณ์ที่คุณสร้างจึงอาจทำงานได้ไม่ดีกับคลาสส่วนน้อย
ที่แย่กว่านั้นคือชนกลุ่มน้อยมักเป็นกลุ่มที่เราต้องการทำนายมากที่สุด
วิธีหนึ่งในการแก้ปัญหาความไม่สมดุลนี้คือการใช้ เทคนิคการสุ่มตัวอย่างเกินส่วนน้อยแบบสังเคราะห์ ซึ่งมักเรียกสั้น ๆ ว่า SMOTE
เทคนิคนี้เกี่ยวข้องกับการสร้างชุดข้อมูลใหม่โดยการสุ่มตัวอย่างการสังเกตจากคลาสชนกลุ่มน้อย ซึ่งสร้างชุดข้อมูลที่มีคลาสที่สมดุลมากขึ้น
วิธีที่ง่ายที่สุดในการใช้ SMOTE ใน R คือการใช้ฟังก์ชัน SMOTE() จากแพ็คเกจ DMwR
ฟังก์ชันนี้ใช้ไวยากรณ์พื้นฐานต่อไปนี้:
SMOTE(form, data, perc. over = 200 , perc. under = 200 , ...)
ทอง:
- form : สูตรที่อธิบายโมเดลที่คุณต้องการปรับเปลี่ยน
- data : ชื่อของกรอบข้อมูล
- perc.over : ตัวเลขที่กำหนดจำนวนกรณีเพิ่มเติมของคลาสชนกลุ่มน้อยที่ถูกสร้างขึ้น
- perc.under : ตัวเลขที่กำหนดจำนวนกรณีเพิ่มเติมของคลาสส่วนใหญ่ที่ถูกสร้างขึ้น
ตัวอย่างต่อไปนี้แสดงวิธีใช้ฟังก์ชันนี้ในทางปฏิบัติ
ตัวอย่าง: วิธีใช้ SMOTE ใน R
สมมติว่าเรามีชุดข้อมูลต่อไปนี้ซึ่งมี การสังเกต 100 ครั้งใน R โดยที่ 90 รายการมีคลาส “ใช่” และ 10 รายการมีคลาส “ไม่ใช่” สำหรับตัวแปรตอบสนอง:
#make this example reproducible set. seed ( 0 ) #create data frame with one response variable and two predictor variables df <- data. frame (y=rep(as. factor (c(' Yes ', ' No ')), times=c( 90 , 10 )), x1=rnorm( 100 ), x2=rnorm( 100 )) #view first six rows of data frame head(df) y x1 x2 1 Yes 1.2629543 0.7818592 2 Yes -0.3262334 -0.7767766 3 Yes 1.3297993 -0.6159899 4 Yes 1.2724293 0.0465803 5 Yes 0.4146414 -1.1303858 6 Yes -1.5399500 0.5767188 #view distribution of response variable table(df$y) Drowned 10 90
นี่เป็นตัวอย่างคลาสสิกของชุดข้อมูลที่ไม่สมดุล เนื่องจากตัวแปรการตอบสนองที่เราคาดการณ์ไว้มีการสังเกต 90 ครั้งโดยมีคลาสเป็น “ใช่” และมีเพียง 10 การสังเกตที่มีคลาสเป็น “ไม่ใช่”
ในการสร้างชุดข้อมูลที่สมดุลมากขึ้น เราสามารถใช้ฟังก์ชัน SMOTE() จากแพ็คเกจ DMwR :
library ( DMwR) #use SMOTE to create new dataset that is more balanced new_df <- SMOTE(y ~ ., df, perc. over = 2000 , perc. under = 400 ) #view distribution of response variable in new dataset table(new_df$y) Drowned 210,800
ชุดข้อมูลผลลัพธ์ประกอบด้วยการสังเกต 210 รายการโดยมี “ไม่ใช่” เป็นคลาส และการสังเกต 800 รายการโดยมี “ใช่” เป็นคลาส
ต่อไปนี้คือวิธีที่ฟังก์ชัน SMOTE สร้างชุดข้อมูลใหม่นี้:
- อาร์กิวเมนต์ perc.over ระบุว่าเราต้องการเพิ่ม 2000/100 (หรือ 20) คูณจำนวนการสังเกตชนกลุ่มน้อยที่มีอยู่เข้ากับชุดข้อมูล เนื่องจากมีข้อสังเกต 10 รายการอยู่ในชุดข้อมูลดั้งเดิม เราจึงเพิ่ม การสังเกตส่วนน้อยเพิ่มเติม 20*10 = 200 รายการ
- อาร์กิวเมนต์ perc.under ระบุว่าเราต้องการทำให้จำนวนการสังเกตส่วนใหญ่เท่ากับ 400/100 (หรือ 4) คูณจำนวนการสังเกตของชนกลุ่มน้อยที่บวกเข้ากับการสังเกตของชนกลุ่มน้อยที่มีอยู่ เนื่องจากมีการเพิ่มการสังเกตชนกลุ่มน้อยเพิ่มเติมอีก 200 รายการ เราจึงสร้างจำนวนการสังเกตส่วนใหญ่เท่ากับ 200 * 4 = การสังเกตส่วนใหญ่ 800 ครั้ง
ผลลัพธ์ที่ได้คือชุดข้อมูลที่ยังคงมีคลาสส่วนใหญ่มากกว่า แต่ยังคงมีความสมดุลมากกว่าชุดข้อมูลดั้งเดิม
ตอนนี้คุณสามารถปรับอัลกอริธึมการจำแนกประเภทที่คุณเลือกกับชุดข้อมูลใหม่นี้ ซึ่งน่าจะทำงานได้ดีกว่าในคลาสส่วนน้อย เนื่องจากมีข้อสังเกตเพิ่มเติมจากคลาสส่วนน้อยในชุดข้อมูลใหม่นี้
หมายเหตุ : คุณสามารถลองใช้อาร์กิวเมนต์ perc.over และ perc.under ในฟังก์ชัน SMOTE เพื่อรับชุดข้อมูลที่ตรงกับความต้องการของคุณ
แหล่งข้อมูลเพิ่มเติม
บทช่วยสอนต่อไปนี้จะอธิบายวิธีดำเนินการงานทั่วไปอื่นๆ ใน R:
วิธีสร้างตารางสรุปใน R
วิธีทำให้ข้อมูลเป็นมาตรฐานใน R
วิธีลบค่าผิดปกติใน R