วิธีใช้ 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

เพิ่มความคิดเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *