Download as pdf or txt
Download as pdf or txt
You are on page 1of 10

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN




LẬP TRÌNH PYTHON CHO MÁY HỌC


LỚP: CS116.022
BÁO CÁO ĐỒ ÁN
HOME CREDIT - CREDIT RISK MODEL STABILITY

Nhóm thực hiện


Sinh viên Nguyễn Trần Khương An 22520026
Sinh viên Nguyễn Ấn 22520019
Sinh viên Nguyễn Phú Tài 22521280
Mục lục
I. GIỚI THIỆU ........................................................................................................................3
1. GIỚI THIỆU VỀ CUỘC THI ......................................................................................................3
2. BỘ DỮ LIỆU .........................................................................................................................3
3. ĐỘ ĐO ĐÁNH GIÁ .................................................................................................................3
4. ĐẶC TRƯNG QUAN TRỌNG ...................................................................................................4
II. CÁC PHƯƠNG PHÁP LIÊN QUAN .................................................................................5
1. XỬ LÝ DỮ LIỆU: ...................................................................................................................5
2. XÂY DỰNG MODEL: .............................................................................................................6
III. PHƯƠNG PHÁP THỰC HIỆN ......................................................................................6
1. XỬ LÝ DỮ LIỆU ....................................................................................................................6
2. KHÔNG SỬ DỤNG HACK .......................................................................................................7
3. SỬ DỤNG METRIC HACK .......................................................................................................9
IV. KẾT LUẬN ,HƯỚNG PHÁT TRIỂN TƯƠNG LAI VÀ BẢN PHÂN CÔNG. .......10
1. KẾT LUẬN..........................................................................................................................10
2. HƯỚNG PHÁT TRIỂN TƯƠNG LAI ........................................................................................10
3. BẢNG PHÂN CÔNG .............................................................................................................10
I. Giới thiệu
1. Giới thiệu về cuộc thi
Home Credit là một nhà cung cấp tài chính tiêu dùng quốc tế được thành lập vào năm
1997, chuyên hỗ trợ vay vốn cho người dùng, đặc biệt dành cho những người có ít hoặc
không có lịch sử tín dụng. Vào năm 2018, hợp tác với Kaggle, Home Credit đã tổ chức
cuộc thi Home Credit Default Risk với sự tham gia của hàng ngàn người. Cuộc thi này
đã nhận được sự hưởng ứng tích cực từ cộng đồng Kaggler và chứng minh được giá trị
thực tiễn của công nghệ trong lĩnh vực tài chính.
Nhận thấy tiềm năng to lớn của công nghệ và mong muốn tiếp tục ứng dụng khoa học
máy tính vào việc đánh giá rủi ro tín dụng, vào năm 2024, nhóm tác giả đã ra mắt cuộc
thi Home Credit - Credit Risk Model Stability. Với tư cách là người tham gia, cần
thực hiện xây dựng các model dự đoán khả năng vỡ nợ của mỗi khách hàng dựa trên các
thông tin cho sẵn giúp các nhà cung cấp tài chính chấp nhận hỗ trợ vay vốn.
2. Bộ dữ liệu
Dữ liệu đóng vai trò vô cùng quan trọng trong quá trình huấn luyện mô hình, việc hiểu
rõ về dataset giúp nâng cao hiệu quả của các mô hình dự đoán. Bộ dữ liệu được lưu trữ
dưỡi dạng file csv hoặc parquet như sơ đồ dưới đây:

Thư viện Polars là một lựa chọn tối ưu khi làm việc với các tệp dữ liệu lớn, đặc biệt là
các tệp Parquet. Với thiết kế tận dụng tối đa khả năng của phần cứng hiện đại, Polars
cho phép xử lý dữ liệu một cách nhanh chóng và hiệu quả, vượt trội so với các thư viện
truyền thống như Pandas. Trong bài toán này, nhóm sử dụng các tệp Parquet được đọc
và xử lý dữ liệu bởi Polars.
3. Độ đo đánh giá
• Điểm gini
Điểm gini là một chỉ số đánh giá chất lượng của mô hình phân loại, tương tự như AUC
(Area Under the Curve). Công thức tính điểm gini từ AUC là:
gini = 2.AUC -1
- AUC: diện tích dưới đường cong ROC (Receiver Operating Characteristic). Nó đo
lường khả năng phân biệt giữa các lớp của mô hình. AUC có giá trị từ 0 đến 1, trong đó
0.5 thể hiện mô hình ngẫu nhiên, 1 thể hiện mô hình hoàn hảo.
• Falling_rate:
Sau khi tính điểm gini hàng tuần, một mô hình hồi quy tuyến tính ax+b được xây dựng
dựa trên các điểm gini này để xác định xu hướng thay đổi của chúng theo thời gian. Giá
trị `falling_rate` được tính toán là:
falling_rate = min(0, a)
• Độ biến thiên của các dự đoán:
Độ biến thiên của các dự đoán được đo bằng cách tính độ lệch chuẩn của các phần dư từ
hồi quy tuyến tính trên:
std(residuals)
Nhằm đo lường mức độ biến thiên của các điểm gini hàng tuần so với giá trị dự đoán từ
mô hình hồi quy tuyến tính. Độ biến thiên cao cho thấy mô hình không ổn định.
• Stability metric:
stability metric = mean(gini) + 88.min(0, a) - 0.5.std(residuals)
Stability metric tỉ lệ thuận với độ đo gini và tỉ lệ thuận với AUC, giúp đánh giá hiệu
suất và tính ổn định của mô hình trong dự đoán theo thời gian. Việc sử dụng AUC trong
quá trình huấn luyện giúp dễ dàng tính toán và cài đặt hơn.
4. Đặc trưng quan trọng
• Target: Trong quá trình phân tích dữ liệu cho thấy phân phối của 2 label có phần mất cân
bằng nhiều khi label 0 gấp hơn 30 lần so với label 1

• Date_decison và week_num: date_decision ( dưới dạng year-month-day) là ngày quyết


định có thể chấp nhận đơn xin vay của case_id (khách hàng) đó. Còn week_num ảnh
hưởng trực tiếp đến độ đo đánh giá của mô hình.

Có thể thấy, có vẻ như Covid-19 đã bị ảnh hưởng rất nhiều đến tài chính của người tiêu dùng khiến số
lượng vay tăng đáng kể. Dựa vào phân phối theo tuần cho thấy, nhà cung cấp tài chính thường đưa ra quyết
định cuối tuần và quá trình này được tự động và chạy trên lịch trình được xác định. Ngoài ra, ta xác định
được đối với những tuần đầu của week_num dữ liệu có phần ổn định hơn so với các tuần trong khoảng 40 -
80. Điều này giúp các phiên bản hack có điểm số tốt hơn khi predict những tuần đầu.
• Khoản thanh toán hàng tháng của hợp đồng (annuity_780A).
• Plot corr matrix trong bảng static_0 với kiểu “A” và “P” có thể thấy có nhiều đặc trưng
có độ tương quan cao, có thể loại bỏ để tránh tình trạng đa cộng tuyến (multicollinearity),
giúp cải thiện hiệu suất và độ ổn định của mô hình học máy.

• Dữ liệu null1

Từ những giá trị trên, ta có thể áp dụng các kĩ thuật loại bỏ null, fill_na để làm sạch dữ liệu.
II. Các phương pháp liên quan
1. Xử lý dữ liệu2:
• Encode: Sử dụng các phương pháp chuyển đổi dữ liệu như Target Enoder đối với dữ liệu
target, Category encode đối với dữ liệu dạng Category bằng CountEncoder,...
• Sử dụng SMOTE, oversampling, undersampling để xử lí dữ liệu mất cân bằng.
• Thu gọn: thu gọn các tính năng phân loại có số lượng giá trị riêng biệt lớn hơn 200. Thay
vì loại bỏ các tính năng này thì hợp nhất một số giá trị có tần số thấp thành một nhóm.
• Loại bỏ những đặc trưng có độ tương quan cao.
• Bỏ các đặc trưng nhiều giá trị null hoặc fill với các giá trị mặc định (thường là 0)

1 https://www.kaggle.com/code/sergiosaharovskiy/home-credit-crms-2024-eda-and-submission
2 https://www.kaggle.com/competitions/home-credit-credit-risk-model-stability/discussion/508588
2. Xây dựng model:
- LightGBM:
Ưu điểm: Hiệu suất cao và xử lý tốt dữ liệu lớn. Hỗ trợ tính toán GPU và hiệu quả
với dữ liệu mất cân bằng. Thời gian huấn luyện và dự đoán nhanh.
Nhược điểm: Yêu cầu tinh chỉnh tham số cẩn thận. Mô hình khó giải thích và dễ bị
overfitting.
- CatBoost:
Ưu điểm: Xử lý tốt dữ liệu phân loại và giảm thiểu overfitting. Dễ sử dụng và hỗ trợ
tính toán GPU.
Nhược điểm: Tài liệu và cộng đồng hỗ trợ hạn chế. Hiệu quả có thể không vượt trội
trên một số loại dữ liệu khác và yêu cầu tài nguyên tính toán mạnh. Thời gian tính
toán lâu
- XGBoost
Ưu điểm: Hiệu suất cao và khả năng mở rộng tốt. Được sử dụng rộng rãi với tài liệu
và cộng đồng hỗ trợ phong phú. Thời gian huấn luyện và dự đoán nhanh.
Nhược điểm: Yêu cầu tinh chỉnh tham số phức tạp. Dễ bị overfitting nếu không cẩn
thận.
III. Phương pháp thực hiện
1. Xử lý dữ liệu
Xử lý dữ liệu là một bước quan trọng trong quá trình phân tích và mô hình hóa dữ
liệu, giúp đảm bảo rằng dữ liệu đầu vào được làm sạch và tối ưu hóa trước khi áp dụng
các kỹ thuật phân tích hoặc xây dựng mô hình.

Figure 3.1: Workflow xử lý dữ liệu


Nhóm thực hiện gọi các hàm trong workflow để xử lý như liệu.
- Tạo các cột mới đối với depth =1 và 2: bao gồm max, mean và var vì ở depth>0 thì sẽ có
thêm num_group1 và num_group2.
▪ max_expr: Đối với các cột có tên kết thúc là "P", "M", "A", "D", "T", "L", tìm giá trị
lớn nhất trong cột và gán vào biến “max_{col}”.
▪ mean_expr và var_expr: Đối với các cột có tên kết thúc là "P", "A", "D", tìm giá trị
trung bình và phương sai trong cột và gán vào biến “mean_{col}” và “var_{col}”.
- Nối các LazyFrame bằng left join, dựa vào case_id.
- Lọc dữ liệu:
▪ Loại bỏ các cột có phần trăm giá trị missing (null) lớn hơn 95%.
▪ Loại bỏ các cột dạng chuỗi có số lượng giá trị duy nhất lớn hơn 200 hoặc chỉ có một
giá trị duy nhất trong cột có dạng string (chuỗi)
- Biến đổi cột "riskassesment_302T" để tạo ra những đặc trưng mới chứa thông tin quan
trọng về xác suất vỡ nợ của khách hàng.
▪ Biến đổi cột “riskassesment_302T” thành hai cột “riskassesment_302T_rng” và
”riskassesment_302T_mean”:
▪ “riskassesment_302T_rng”: Thể hiện sự biến thiên giữa xác suất cao nhất và thấp nhất
mà khách hàng sẽ vỡ nợ trong năm tới.
▪ “riskassesment_302T_mean”: Hiển thị giá trị trung bình của xác suất đó.
- Xử lí dữ liệu ngày ( những cột kết thúc bằng “D” và date_decison):
▪ Chuyển đổi các ngày thành số ngày tính tới thời điểm date_decision( ép kiểu về int32)
▪ Thay đổi cột date_decion thành 2 cột date, year (month đã có sẵn).
- Chuyển đổi pl.LazyFrame thành pd.Dataframe
- Thực hiện tương tự với tập test. Cách xử lí trên được nhóm tham khảo từ kaggle3
2. Không sử dụng hack
a) Cross validation:
Cross validation (CV) là một kỹ thuật quan trọng dùng để đánh giá độ chính xác của mô hình.
Dựa vào tính chất của dataset khi độ đo gini được sử dụng trong bài toán được tính theo từng
week_num, nhóm sử dụng StratifiedGroupKFold(group=WEEK_NUM) vì nó kết hợp hai đặc
tính quan trọng: phân tầng (stratification) và phân nhóm (grouping).
Thực nghiệm StratifiedGroupKFold với 2 tham số là n_splits và shuffle như sau:
Tham số Private score Public score
n_splits = 3, shuffle = true 0.51051 0.59009
n_splits = 5, shuffle = true 0.51139 0.58850
n_splits = 7, shuffle = true Out of memory Out of memory
n_splits = 3, shuffle = false 0.51024 0.58934
n_splits = 5, shuffle = false 0.51251 0.59044
n_splits = 7, shuffle = false 0.51591 0.59125
Dựa trên kết quả cho thấy, khi chọn nfold = 7, shuffle = false sẽ cho kết quả tốt nhất.
b) Huấn luyện mô hình:
Dựa vào các nghiên cứu trước đó cho thấy sử dụng các ensemble model như XGBoost,
LightGBM và CatBoost sẽ có hiệu quả tốt hơn các mạng neural network. Nhóm thực hiện
thử nghiệm với cả 3 model trên kết hợp với optuna để tìm ra bộ tham số tốt nhất khi kết hợp
với n_splits = 7, shuffle = false.
Đầu tiên, chúng ta sẽ sử dụng CatBoost - một công cụ mạnh mẽ được thiết kế để xử lý dữ liệu
có cấu trúc một cách tự động. Vì CatBoost tốn nhiều chi phí tính toán và thời gian nên nhóm
lựa chọn sử dụng các tham số chính của CatBoost bao gồm:

3 https://www.kaggle.com/code/pereradulina/credit-risk-prediction-with-lightgbm-and-catboost
Tiếp theo, chúng ta sẽ áp dụng LightGBM - một thư viện tối ưu hóa cho tốc độ và hiệu suất
trong học máy, sử dụng thuật toán Gradient Boosting Decision Tree (GBDT) với các cải
tiến như GOSS và EFB để tăng tốc độ huấn luyện và giảm sự tiêu tốn bộ nhớ. Các tham số
chính của LightGBM được tinh chỉnh bằng cách sử dụng Optuna, bao gồm:

Cuối cùng sử dụng optuna tương tự đối với XGBoost để tìm ra tham số tốt nhất như sau:

c) Thực hiện VotingModel để chọn ra kết quả tốt nhất:


VotingModel là một mô hình ensemble tùy chỉnh được thiết kế để thực hiện tổng hợp dự đoán
thông qua bỏ phiếu. Nó kế thừa từ BaseEstimator và RegressorMixin của scikit-learn.
• Phương Thức Dự Đoán (predict):
Phương thức predict thực hiện dự đoán bằng cách trung bình các dự đoán từ tất cả các
mô hình đã huấn luyện. Các đặc trưng đầu vào (features) được truyền vào từng mô hình
để lấy dự đoán, sau đó các dự đoán này được trung bình để cho ra kết quả cuối cùng.
• Phương Thức Dự Đoán Xác Suất (predict_proba):
Phương thức predict_proba thực hiện dự đoán xác suất bằng cách trung bình các xác
suất từ tất cả các mô hình đã huấn luyện. Các đặc trưng đầu vào được truyền vào từng
mô hình để lấy xác suất dự đoán, sau đó các xác suất này được trung bình để cho ra kết
quả cuối cùng.
Việc sử dụng VotingModel giúp tận dụng được ưu điểm của cả hai mô hình và cung cấp sự đa
dạng trong việc dự đoán.
Nhóm thực nghiệm với 3 model ensemble cho thấy kết quả như sau:
Model Maximum CV
AUC score
CatBoost 0.8565
LightGBM 0.8505
XGBoost 0.8190
LightGBM + CatBoost Cat: 0.8460
Lgb: 0.853
LightGBM+ XGBoost XG: 0.8337
Lgb: 0.722
CatBoost+ XGBoost Cat: 0.8389
XG: 0.8071
Dựa vào kết quả trên cho thấy khi sử dụng Voting model cho catboost và lightgbm sẽ ra kết quả
tối nhất và đây cũng là cách nhóm lựa chọn cho private test.
• Tổng kết:
- Như vậy sau khi tinh chỉnh các tham số nhóm đưa ra được phương pháp cuối cùng
như sau:
▪ Chia tập train bằng StratifiedGroupKFold thành phần với n_split =7 và
shuffle = false
▪ Tối ưu tham số model lightgbm bằng optuna ( để khi submit không bị out
of memory, nhóm chỉ giữ lại bộ tham số lightgbm tốt nhất sau khi train
trong đoạn code )
▪ Sử dụng voting model kết hợp giữa lightgbm và Catboost
3. Sử dụng metric hack4
3.1 Hướng suy nghĩ dẫn dắt:
- Dựa vào yêu cầu của BTC, có thể nghĩ đến việc đánh giá AUC score của một testing
set thỏa điều kiện mọi quan sát đều có thời gian sau các quan sát của training set
tối thiểu 1 năm. Điều này sẽ giúp đánh giá model nào khái quát hóa tốt nhất một
khoảng X tháng/ năm trong tương lai, phù hợp với yêu cầu của BTC đã đề ra.
- Vì các model chấm điểm tín dụng - "credit scoring model" thường có vòng đời từ
một năm trở lên và hiệu suất nhất quán của chúng theo thời gian là chìa khóa quan
trọng nhất, và BTC đang tìm kiếm một model tốt thuộc loại này.
3.2 Phương hướng thực hiện:
a) Train một model đủ tốt (AUC score khoảng 0.85) trên training set.
model = VotingModel(lgb_models + cat_models)
b) Train một model khác hơi kém hơn (thậm chí kém hơn nhiều).
Có thể là regressor model được train dựa trên các xác suất dự đoán của model đầu
tiên trên training set (tức là dùng các xác suất dự đoán này làm nhãn để train).
c) Thêm vào tập train và test cột target mới là "target ", và lần lượt gán nhãn 0 và 1 cho tất
cả các dữ liệu trong tập tương ứng. Sau đó kết hợp chúng, tạo thành dataset mới.
df_train['target'], df_test['target'] = 0, 1
df_train = pd.concat([df_train,df_test])
y = df_train["target"]
df_train = df_train.drop(columns=["target", "case_id", "WEEK_NUM"])
d) Train một model mới có thể dự đoán “target_new” trên dataset mới này. Model này sẽ
học được cách phân biệt giữa training data và testing data.
Sau đó, dùng model này để dự đoán giá trị của “target_new” trên testing set.
df_train,y,df_test=joblib.load('/kaggle/working/data.pkl')
fitted_models_lgb=[]
model = lgb.LGBMClassifier()
model.fit(df_train,y)

4 https://www.kaggle.com/code/andreasbis/metric-hack-implementation
fitted_models_lgb.append(model)
e) Tùy vào xác suất dự đoán của "target_new" có đủ cao (sẽ có một ngưỡng tự đặt)
hay không, mà model sẽ cho rằng quan sát tương ứng đó giống như testing data hay
training data, và tương ứng sử dụng model "tốt hơn" hay "kém hơn" để dự đoán.
model = VotingModel(fitted_models_lgb)
df_test = df_test.drop(columns=["WEEK_NUM",'target'])
df_test = df_test.set_index("case_id")
y_pred = pd.Series(model.predict_proba(df_test)[:,1], index=df_test.index)
condition = y_pred<0.96
df_subm = df_subm.set_index("case_id")
df_subm.loc[condition, 'score'] = (df_subm.loc[condition, 'score'] - 0.05).clip(0)
Giá trị của chiến lược metric hack mà nhóm đã rút ra:
• Chiến lược này sử dụng một mô hình thứ ba để xác định xem dữ liệu nào trong test set nên
được dự đoán bằng mô hình nào. Mô hình phân loại này học cách phân biệt giữa train set và
test set, và dựa trên kết quả dự đoán, quyết định sử dụng mô hình nào để dự đoán kết quả cuối
cùng. Điều này có thể giúp tối ưu hóa hiệu suất dự đoán, đặc biệt khi test set có thể không đồng
nhất với train set.
IV. Kết luận ,hướng phát triển tương lai và bản phân công.
1. Kết luận
Trong quá trình thực hiện dự án, nhóm đã học hỏi và ứng dụng nhiều phương pháp học
máy chất lượng cũng như các kỹ thuật xử lý dữ liệu tiên tiến, kết hợp cùng với kiến
thức đã học trên lớp. Các mô hình như CatBoost, LightGBM đã được thử nghiệm và
cho thấy hiệu quả vượt trội khi kết hợp trong một Voting Model, đã cho kết quả tốt nhất
với điểm số AUC cao hơn so với các mô hình riêng lẻ. Việc tối ưu hóa tham số bằng kỹ
thuật Optuna và áp dụng kỹ thuật kiểm tra chéo với StratifiedGroupKFold đã giúp nâng
cao độ chính xác của mô hình.
2. Hướng phát triển tương lai
Cải thiện mô hình: Tiếp tục tìm kiếm và thử nghiệm các mô hình, các thuật toán và kỹ
thuật mới khác nhằm cải thiện độ chính xác và hiệu quả của mô hình.
Nâng cao kiến thức: Tiếp tục học hỏi và nắm vững các thuật toán và kỹ thuật mới trong
lĩnh vực học máy và phân tích dữ liệu qua các nguồn tài liệu và cuộc thi.
3. Bảng phân công

Mức độ
MSSV Họ và tên Công việc
hoàn thành
EDA, Huấn luyện mô hình
22520019 Nguyễn Ấn 100%
Viết báo cáo phần 1, 2
Nguyễn Trần Tinh chỉnh tham số, Xử lý dữ liệu
22520026 100%
Khương An Viết báo cáo phần 3.1, 3.2
Xây dựng mô hình
22521280 Nguyễn Phú Tài Phát triển và sử dụng metric hack 100%
Viết báo cáo phần 3.3, 4

You might also like