images
14/10/2020 07:02 am

Gấu mèo đi làm Data Scientist - Phần 9: Credit Card Fraud Analysis - Part 2

Phần trước: Gấu Mèo thử với Decision Tree nhưng kết quả trên tập test không như ý muốn: precision và recall của nhóm gian lận là 0.86 và 0.72 (nghĩa là dự đoán 100 ông thì chỉ có 86 ông thực sự gian lận, và nếu có 100 ông gian lận thì chỉ có 72 ông bị phát hiện). Đồng thời có dấu hiệu của overfitting vì kết quả của tập train lại rất tốt.

Lúc này có nhiều cách để cải tiến được model. Có thể sử dụng thuật toán khác, cũng có thể dùng over-sampling để số lượng trên 2 class cân hơn…


Nhưng mà dùng Decision Tree mà bị overfitting thì cứ thử Random Forest đã bởi bản chất Random Forest được sinh ra cũng để giải quyết vấn đề overfitting của Decision Tree.


classifier = RandomForestClassifier(n_jobs=2, random_state=0)

classifier = classifier.fit(X_train, y_train)


và đo lại kết quả


from sklearn.metrics import classification_report, confusion_matrix

y_pred = classifier.predict(X_test)

print(confusion_matrix(y_test, y_pred))

print(classification_report(y_test, y_pred))


Kết quả như hình 1:

Precision và recall với nhóm gian lận có vẻ tốt hơn rồi, tuy nhiên 100 ông gian lận cũng mới chỉ phát hiện được 77 ông.


Nếu như lấy tiêu chí “Thà bắt nhầm còn hơn bỏ sót" thì thế này chưa ổn. 


Hơn nữa precision đang ở mức khá cao. Nên có thể xem xét việc thay đổi threshold để tăng recall lên (đánh đổi lại precision sẽ giảm xuống). Việc quyết định tăng hay giảm threshold là 

tradeoff - tùy vào biz của bạn cần chỉ số nào hơn).


threshold = 0.29

predicted_proba = classifier.predict_proba(X_test)

y_pred = (predicted_proba [:,1] >= threshold).astype('int')

print(confusion_matrix(y_test, y_pred))

print(classification_report(y_test, y_pred))


Kết quả thu được như hình 2, kết quả giờ có vẻ tốt hơn nhiều rồi. 


Tuy nhiên có một thứ quan trọng mà Gấu Mèo đã lờ đi đấy là việc số lượng 2 class chênh lệch rất nhiều. Gấu Mèo được khuyên rằng đối với dữ liệu dạng unbalanced thì việc trước tiên phải làm cho cân bằng lại đã. Lúc này có thể thêm số lượng ở class ít hơn bằng cách copy nó ra, trộn rồi thêm vào, hoặc cũng có thể bỏ bớt bản ghi ở class nhiều hơn ra.


from sklearn.utils import resample


tmp_df = df

df_majority = tmp_df[tmp_df.Class==0]

df_minority = tmp_df[tmp_df.Class==1]

# Upsample minority class

df_minority_upsampled = resample(df_minority,

                                replace=True,    

                                n_samples=df_majority.shape[0],   

                                random_state=123)

# Combine majority class with upsampled minority class

df_upsampled = pd.concat([df_majority, df_minority_upsampled])

X2 = df_upsampled.drop('Class', axis=1)

Y2 = df_upsampled['Class']

X_train2, X_test2, y_train2, y_test2 = train_test_split(X2, Y2, test_size=0.20)

classifier = RandomForestClassifier(n_jobs=2, random_state=0)

classifier = classifier.fit(X_train2, y_train2)

y_pred2 = classifier.predict(X_test2)

print(confusion_matrix(y_test2, y_pred2))

print(classification_report(y_test2, y_pred2))


Kết quả thu được như hình 3

Kết quả làm cho Gấu Mèo suýt choáng, tuy nhiên model mà chính xác quá như thế này thì cũng nghi nghi. Thực ra trong đoạn code trên Gấu Mèo đã upsample trước lúc split train set và test set. Bởi vậy có khả năng phần lớn testset đã có trong training set nên thực ra việc evaluate không còn chính xác nữa. Gấu Mèo quyết định thử lại, nó chia tập train và test trước rồi mới upsample thì thu được kết quả như hình 4

Vậy ra trong lần này upsample không giúp cho model tốt hơn nhiều lắm. Đúng là cứ phải thử chứ chỉ nghe chém thì toang. Dù sao thì cái vụ dealing với unbalanced dataset cũng cần tìm hiểu thêm, thế là Gấu Mèo xách laptop thẳng tiến tới Thư viện Quốc Gia… để tìm quán cafe.


Mời các bạn đọc lại bài Gấu mèo đi làm Data Scientist - Phần 9: Credit Card Fraud Analysis - Part 1.


và phần tiếp theo Phần 10: Dealing with unbalanced dataset


- Tech Zone -

Thư giãn chút nào!!!

Bài viết liên quan