ความไม่สมดุลของคลาสในข้อมูลสินเชื่อ

การสร้างโมเดลความเสี่ยงด้านเครดิตด้วย Python

Michael Crabtree

Data Scientist, Ford Motor Company

ข้อมูลการผิดนัดมีไม่เพียงพอ

  • ค่าของ loan_status คือคลาสต่างๆ
    • ไม่ผิดนัด: 0
    • ผิดนัด: 1
y_train['loan_status'].value_counts()
loan_status จำนวนในชุดข้อมูล Training เปอร์เซ็นต์รวม
0 13,798 78%
1 3,877 22%
การสร้างโมเดลความเสี่ยงด้านเครดิตด้วย Python

ฟังก์ชันการสูญเสียของโมเดล

  • Gradient Boosted Trees ใน xgboost ใช้ฟังก์ชันการสูญเสียแบบ log-loss
    • เป้าหมายคือการลดค่านี้ให้น้อยที่สุด

สูตรของ log loss

สถานะสินเชื่อจริง ความน่าจะเป็นที่พยากรณ์ Log Loss
1 0.1 2.3
0 0.9 2.3
  • การพยากรณ์การผิดนัดผิดพลาดส่งผลกระทบทางการเงินมากกว่า
การสร้างโมเดลความเสี่ยงด้านเครดิตด้วย Python

ต้นทุนของความไม่สมดุล

  • False negative (พยากรณ์การผิดนัดเป็นไม่ผิดนัด) มีต้นทุนสูงกว่ามาก
บุคคล วงเงินสินเชื่อ กำไรที่คาดได้ สถานะที่พยากรณ์ สถานะจริง ความสูญเสีย
A $1,000 $10 ผิดนัด ไม่ผิดนัด -$10
B $1,000 $10 ไม่ผิดนัด ผิดนัด -$1,000
  • Log-loss ของโมเดลเท่ากันทั้งสองกรณี แต่ความสูญเสียจริงต่างกัน
การสร้างโมเดลความเสี่ยงด้านเครดิตด้วย Python

สาเหตุของความไม่สมดุล

  • ปัญหาด้านข้อมูล
    • การสุ่มตัวอย่างข้อมูลสินเชื่อไม่ถูกต้อง
    • ปัญหาการจัดเก็บข้อมูล
  • กระบวนการทางธุรกิจ:
    • มีมาตรการอยู่แล้วเพื่อไม่รับสินเชื่อที่มีความเสี่ยงสูง
    • สินเชื่อที่มีแนวโน้มผิดนัดถูกขายต่อให้บริษัทอื่นอย่างรวดเร็ว
  • ปัจจัยด้านพฤติกรรม:
    • โดยปกติผู้คนไม่ผิดนัดชำระสินเชื่อ
      • ยิ่งผิดนัดน้อย เครดิตสกอร์ยิ่งสูง
การสร้างโมเดลความเสี่ยงด้านเครดิตด้วย Python

การจัดการความไม่สมดุลของคลาส

  • มีหลายวิธีในการจัดการความไม่สมดุลของคลาส
วิธีการ ข้อดี ข้อเสีย
รวบรวมข้อมูลเพิ่มเติม เพิ่มจำนวนการผิดนัด สัดส่วนการผิดนัดอาจไม่เปลี่ยนแปลง
ปรับโทษโมเดล เพิ่ม recall สำหรับการผิดนัด โมเดลต้องการการปรับแต่งมากขึ้น
สุ่มตัวอย่างข้อมูลต่างออกไป ปรับแต่งทางเทคนิคน้อยที่สุด ข้อมูลการผิดนัดลดลง
การสร้างโมเดลความเสี่ยงด้านเครดิตด้วย Python

กลยุทธ์ Undersampling

  • รวมตัวอย่างสุ่มขนาดเล็กของกลุ่มไม่ผิดนัดเข้ากับกลุ่มผิดนัด

แผนภาพแสดงกลยุทธ์การ undersampling

การสร้างโมเดลความเสี่ยงด้านเครดิตด้วย Python

การรวมชุดข้อมูลที่แบ่งแล้ว

  • ต้องนำชุด test และ training กลับมารวมกัน
  • สร้างชุดข้อมูลใหม่ 2 ชุดตามค่า loan_status จริง
# Concat the training sets
X_y_train = pd.concat([X_train.reset_index(drop = True),
                       y_train.reset_index(drop = True)], axis = 1)
# Get the counts of defaults and non-defaults
count_nondefault, count_default = X_y_train['loan_status'].value_counts()
# Separate nondefaults and defaults
nondefaults = X_y_train[X_y_train['loan_status'] == 0]
defaults = X_y_train[X_y_train['loan_status'] == 1]
การสร้างโมเดลความเสี่ยงด้านเครดิตด้วย Python

การ Undersampling กลุ่มไม่ผิดนัด

  • สุ่มตัวอย่างจากชุดข้อมูลกลุ่มไม่ผิดนัด
  • นำมา concatenate กับชุดข้อมูลกลุ่มผิดนัด
# Undersample the non-defaults using sample() in pandas
nondefaults_under = nondefaults.sample(count_default)
# Concat the undersampled non-defaults with the defaults
X_y_train_under = pd.concat([nondefaults_under.reset_index(drop = True),
                             defaults.reset_index(drop = True)], axis=0)
การสร้างโมเดลความเสี่ยงด้านเครดิตด้วย Python

มาฝึกกันเถอะ!

การสร้างโมเดลความเสี่ยงด้านเครดิตด้วย Python

Preparing Video For Download...