【baseline】Kaggle新賽!信用違約預(yù)測大賽
日前,Kaggle發(fā)布了American Express - Default Prediction 信用違約預(yù)測大賽。要求參賽者:
運用機器學(xué)習(xí)技能來預(yù)測信用違約

這是一個金融風(fēng)控場景下的結(jié)構(gòu)化數(shù)據(jù)挖掘任務(wù),對本領(lǐng)域感興趣的小伙伴,千萬不要錯過。
下面是本場比賽的baseline。
加我回復(fù)“運通”獲取baseline+數(shù)據(jù)集
https://www.kaggle.com/competitions/amex-default-prediction
信用違約預(yù)測是管理消費貸款業(yè)務(wù)風(fēng)險的核心。信用違約預(yù)測允許貸方優(yōu)化貸款決策,從而帶來更好的客戶體驗和穩(wěn)健的商業(yè)經(jīng)濟。當(dāng)前的模型可以幫助管理風(fēng)險。但是有可能創(chuàng)建更好的模型,這些模型的性能優(yōu)于當(dāng)前使用的模型。美國運通是一家全球綜合支付公司。作為世界上最大的支付卡發(fā)行商,他們?yōu)榭蛻籼峁┴S富生活和建立商業(yè)成功的產(chǎn)品、見解和體驗。
在本次比賽中,您將運用機器學(xué)習(xí)技能來預(yù)測信用違約。具體來說,您將利用工業(yè)規(guī)模的數(shù)據(jù)集來構(gòu)建機器學(xué)習(xí)模型,以挑戰(zhàn)生產(chǎn)中的當(dāng)前模型。訓(xùn)練、驗證和測試數(shù)據(jù)集包括時間序列行為數(shù)據(jù)和匿名客戶檔案信息。您可以自由探索任何技術(shù)來創(chuàng)建最強大的模型,從創(chuàng)建特征到在模型中以更有機的方式使用數(shù)據(jù)。
3、評價指標(biāo)
本次比賽的評估指標(biāo) ?? 是排名排序的兩個度量的平均值:歸一化基尼系數(shù) ?? 和 4% 的違約率 ??組成:
.
對于子指標(biāo) ?? 和 ??,負(fù)標(biāo)簽的權(quán)重為 20 以調(diào)整下采樣。計算過程可以從這里找到
https://www.kaggle.com/code/inversion/amex-competition-metric-python
4、數(shù)據(jù)介紹
本次比賽的目的是根據(jù)客戶每月的客戶資料預(yù)測客戶未來不償還信用卡余額的概率。目標(biāo)二元變量是通過觀察最近一次信用卡賬單后 18 個月的績效窗口來計算的,如果客戶在最近一次賬單日后的 120 天內(nèi)未支付到期金額,則將其視為違約事件。
該數(shù)據(jù)集包含每個客戶在每個報表日期的匯總配置文件特征。特征通過了匿名和歸一化處理,特征可以分為以下類別:
D_* = 拖欠變量
S_* = 支出變量
P_* = 付款變量
B_* = 平衡變量
R_* = 風(fēng)險變量
加我回復(fù)“運通”獲取baseline+數(shù)據(jù)集
其中這些變量為類別變量:
['B_30', 'B_38', 'D_114', 'D_116', 'D_117', 'D_120', 'D_126', 'D_63', 'D_64', 'D_66', 'D_68']
是為每個customer_ID預(yù)測未來付款違約的概率(目標(biāo) = 1),每個文件內(nèi)容的介紹如下:
train_data.csv - 每個 customer_ID 具有多個日期的訓(xùn)練數(shù)據(jù)
train_labels.csv - 每個 customer_ID 的目標(biāo)標(biāo)簽
test_data.csv - 對應(yīng)的測試數(shù)據(jù);您的目標(biāo)是預(yù)測每個 customer_ID 的目標(biāo)標(biāo)簽
sample_submission.csv - 格式正確的示例提交文件
首先我們來查看下數(shù)據(jù)集,在數(shù)據(jù)集中的數(shù)據(jù)字段基本進(jìn)行了匿名處理:

在數(shù)據(jù)集中也有較多的字段包含了缺失值:

比賽標(biāo)簽分布中違約用戶占比較少,類別分布比較均衡:

接下來我們可以查看字段按照分類之后的統(tǒng)計,如下圖所示:

進(jìn)一步我們也可以統(tǒng)計字段與標(biāo)簽的相關(guān)性:

由于數(shù)據(jù)集原始數(shù)據(jù)集文件較大(50GB左右),直接進(jìn)行讀取并進(jìn)行分析并不可取。在進(jìn)行送入模型進(jìn)行之前可以考慮對數(shù)據(jù)值進(jìn)行壓縮,具體的壓縮方法包括:
?將數(shù)據(jù)集中的類別字段,使用Pandas的category進(jìn)行代替;
?將數(shù)據(jù)集中的數(shù)值字段,使用flaoat16和float32代替原始的float64;
?將數(shù)據(jù)集使用feather或者parquet格式進(jìn)行存儲;
通過上述方法可以將數(shù)據(jù)集壓縮到總共5GB左右,接下來就可以嘗試后續(xù)的建模過程。
數(shù)據(jù)集壓縮和轉(zhuǎn)換的過程可以參考:
https://www.kaggle.com/code/abdellatifsassioui/create-pickeld-data-from-50-gb-to-6gb
加我回復(fù)“運通”獲取baseline+數(shù)據(jù)集
本次賽題是一個典型的匿名結(jié)構(gòu)化比賽,因此可以考慮直接使用樹模型來進(jìn)行建模,具體的步驟為:
?對數(shù)據(jù)集進(jìn)行處理
?定義樹模型進(jìn)行訓(xùn)練
?五折交叉完成預(yù)測
# XGB MODEL PARAMETERSxgb_parms = {'max_depth':4,'learning_rate':0.05,'subsample':0.8,'colsample_bytree':0.6,'eval_metric':'logloss','objective':'binary:logistic','tree_method':'gpu_hist','predictor':'gpu_predictor','random_state':SEED}
skf = KFold(n_splits=FOLDS)for fold,(train_idx, valid_idx) in enumerate(skf.split(train.target )):# TRAIN, VALID, TEST FOR FOLD KXy_train = IterLoadForDMatrix(train.loc[train_idx], FEATURES, 'target')X_valid = train.loc[valid_idx, FEATURES]y_valid = train.loc[valid_idx, 'target']dtrain = xgb.DeviceQuantileDMatrix(Xy_train, max_bin=256)dvalid = xgb.DMatrix(data=X_valid, label=y_valid)# TRAIN MODEL FOLD Kmodel = xgb.train(xgb_parms,dtrain=dtrain,evals=[(dtrain,'train'),(dvalid,'valid')],num_boost_round=9999,early_stopping_rounds=100,verbose_eval=100)model.save_model(f'XGB_v{VER}_fold{fold}.xgb')# GET FEATURE IMPORTANCE FOR FOLD Kdd = model.get_score(importance_type='weight')df = pd.DataFrame({'feature':dd.keys(),f'importance_{fold}':dd.values()})importances.append(df)# INFER OOF FOLD Koof_preds = model.predict(dvalid)acc = amex_metric_mod(y_valid.values, oof_preds)Metric =',acc,'\n')# SAVE OOFdf = train.loc[valid_idx, ['customer_ID','target'] ].copy()= oof_predsdf )del dtrain, Xy_train, dd, dfdel X_valid, y_valid, dvalid, model_ = gc.collect()
由于本次比賽數(shù)據(jù)量比較多,因此深度學(xué)習(xí)模型也可以考慮。深度學(xué)習(xí)模型主要需要調(diào)整網(wǎng)絡(luò)結(jié)構(gòu),下面是一個基礎(chǔ)的全連接網(wǎng)絡(luò)代碼:
def my_model(n_inputs=len(train.columns)):activation = 'swish'l1 = 1e-7l2 = 4e-4inputs = Input(shape=(n_inputs, ))x0 = BatchNormalization()(inputs)x0 = Dense(256,kernel_regularizer=tf.keras.regularizers.L1L2(l1=l1,l2=l2),activation=activation,)(x0)x0 = Dropout(0.1)(x0)x = Dense(64,kernel_regularizer=tf.keras.regularizers.L1L2(l1=l1,l2=l2),activation=activation,)(x0)x = Dense(64,kernel_regularizer=tf.keras.regularizers.L1L2(l1=l1,l2=l2),activation=activation,)(x)x = Concatenate()([x, x0])x = Dropout(0.1)(x)x = Dense(16,kernel_regularizer=tf.keras.regularizers.L1L2(l1=l1,l2=l2),activation=activation,)(x)x = Dense(1,activation='sigmoid',)(x)model = Model(inputs, x)=tf.keras.optimizers.Nadam(learning_rate=LR_START,clipvalue= 0.5,clipnorm = 1.0 # prevent gradient explosion),loss=tf.keras.losses.BinaryCrossentropy(),)del x,x0return model
加我回復(fù)“運通”獲取baseline+數(shù)據(jù)集
本次比賽是一個典型的匿名結(jié)構(gòu)化比賽,因此主要的關(guān)注點可以放在模型結(jié)構(gòu)和模型集成。
? 可以優(yōu)先調(diào)整每額每個模型,樹模型和深度學(xué)習(xí)模型都可以取得0.796左右的精度;
? 增加每個模型的隨機性,大量使用bagging進(jìn)行訓(xùn)練;
