本文梳理了几种常用的不平衡数据集处理方法,包括过采样、欠采样,类别加权和数据加权的方法。以下通过信用卡违约实例数据进行说明。
不平衡数据集,尤其长尾数据一直都是重点和难点。实际应用中,应根据具体的业务需求,确定应该尽量提高模型的哪个指标。如:对于信用卡违约这样一个对正类样本(违约)判定要求较高的场景,往往需要更高的召回率。我们采用AUC和F1得分评价模型结果,总体情况见下表。可见效果都一般,但处理后,F1值确实都有提升。(注:本文中除基模型外的模型均未进行调优,可能对处理后的数据未必合适。)
1. 导入数据集
本文为了简单起见,直接采用预处理过的信用卡违约数据进行训练。训练集中,未违约和违约用户约比为3.5:1。
# 导入所需模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import sklearn
from sklearn import metrics
from sklearn.metrics import precision_recall_curve,classification_report
from sklearn.metrics import confusion_matrix, accuracy_score
import warnings
warnings.filterwarnings('ignore')
import lightgbm as lgb
# 预处理后的数据
df_train = pd.read_csv('./train_set_pre.csv')
df_test = pd.read_csv('./test_set_pre.csv')
X_train = df_train.drop(['default.payment.next.month'],axis=1)
y_train = df_train['default.payment.next.month']
X_test = df_test.drop(['default.payment.next.month'],axis=1)
y_test = df_test['default.payment.next.month']
# 自定义得分报告函数
def model_report(model,train_x,train_y,test_x,test_y):
# 模型在训练集上的表现
train_pre = model.predict(train_x)
train_score = model.predict_