Mất cân bằng lớp trong dữ liệu khoản vay

Mô hình hóa Rủi ro Tín dụng bằng Python

Michael Crabtree

Data Scientist, Ford Motor Company

Thiếu trường hợp vỡ nợ trong dữ liệu

  • Giá trị của loan_status là các lớp
    • Không vỡ nợ: 0
    • Vỡ nợ: 1
y_train['loan_status'].value_counts()
loan_status Số lượng dữ liệu huấn luyện Tỷ lệ trên tổng
0 13,798 78%
1 3,877 22%
Mô hình hóa Rủi ro Tín dụng bằng Python

Hàm mất mát của mô hình

  • Gradient Boosted Trees trong xgboost dùng hàm mất mát log-loss
    • Mục tiêu là tối thiểu hóa giá trị này

Công thức log-loss

Trạng thái vay thực Xác suất dự đoán Log-loss
1 0.1 2.3
0 0.9 2.3
  • Dự đoán sai trường hợp vỡ nợ gây thiệt hại tài chính lớn hơn
Mô hình hóa Rủi ro Tín dụng bằng Python

Chi phí của mất cân bằng

  • Âm tính giả (vỡ nợ bị dự đoán là không vỡ nợ) tốn kém hơn nhiều
Người Số tiền vay Lợi nhuận tiềm năng Trạng thái dự đoán Trạng thái thực Tổn thất
A $1,000 $10 Vỡ nợ Không vỡ nợ -$10
B $1,000 $10 Không vỡ nợ Vỡ nợ -$1,000
  • Log-loss của mô hình như nhau cho cả hai, nhưng tổn thất thực tế thì không
Mô hình hóa Rủi ro Tín dụng bằng Python

Nguyên nhân mất cân bằng

  • Vấn đề dữ liệu
    • Lấy mẫu dữ liệu tín dụng không đúng
    • Sự cố lưu trữ dữ liệu
  • Quy trình kinh doanh:
    • Đã có biện pháp loại các khoản có khả năng vỡ nợ
    • Nhanh chóng bán các khoản có khả năng vỡ nợ cho đơn vị khác
  • Yếu tố hành vi:
    • Bình thường, mọi người không vỡ nợ
      • Càng ít vỡ nợ, xếp hạng tín dụng càng cao
Mô hình hóa Rủi ro Tín dụng bằng Python

Xử lý mất cân bằng lớp

  • Nhiều cách xử lý mất cân bằng lớp
Phương pháp Ưu điểm Nhược điểm
Thu thập thêm dữ liệu Tăng số trường hợp vỡ nợ Tỷ lệ vỡ nợ có thể không đổi
Phạt mô hình Tăng recall cho vỡ nợ Cần tinh chỉnh và bảo trì nhiều hơn
Lấy mẫu dữ liệu khác đi Điều chỉnh ít kỹ thuật nhất Ít trường hợp vỡ nợ trong dữ liệu
Mô hình hóa Rủi ro Tín dụng bằng Python

Chiến lược undersampling

  • Kết hợp mẫu ngẫu nhiên nhỏ hơn của không vỡ nợ với vỡ nợ

Sơ đồ chiến lược undersampling

Mô hình hóa Rủi ro Tín dụng bằng Python

Kết hợp các tập đã tách

  • Cần ghép lại tập kiểm tra và huấn luyện
  • Tạo hai tập mới dựa trên loan_status thực tế
# 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]
Mô hình hóa Rủi ro Tín dụng bằng Python

Undersampling nhóm không vỡ nợ

  • Lấy mẫu ngẫu nhiên tập không vỡ nợ
  • Nối với tập vỡ nợ
# 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)
Mô hình hóa Rủi ro Tín dụng bằng Python

Ayo berlatih!

Mô hình hóa Rủi ro Tín dụng bằng Python

Preparing Video For Download...