百行代碼入手數(shù)據(jù)挖掘競賽~
數(shù)據(jù)及背景
給定實際業(yè)務(wù)中借款人信息,邀請大家建立風(fēng)險識別模型,預(yù)測可能拖欠的借款人。
實踐&數(shù)據(jù)下載地址:https://challenge.xfyun.cn/topic/info?type=car-loan&ch=dw-sq-1
實踐代碼
Baseline采用LightGBM模型,進行了必要的注釋和代碼實現(xiàn),分數(shù)為0.58左右。
##?導(dǎo)入第三方包
import?pandas?as?pd
import?numpy?as?np
import?lightgbm?as?lgb
from?sklearn.model_selection?import?KFold
from?sklearn.metrics?import?f1_score,?roc_auc_score
import?warnings
warnings.filterwarnings('ignore')
##?讀取數(shù)據(jù)集,具體下載方式可見操作手冊
train?=?pd.read_csv('train.csv')
test?=?pd.read_csv('test.csv')
sample_submit?=?pd.read_csv('sample_submit.csv')
##?訓(xùn)練數(shù)據(jù)及測試數(shù)據(jù)準備
all_cols?=?[f?for?f?in?train.columns?if?f?not?in?['customer_id','loan_default']]
x_train?=?train[all_cols]
x_test?=?test[all_cols]
y_train?=?train['loan_default']
##?作為baseline部分僅使用經(jīng)典的LightGBM作為訓(xùn)練模型,我們還能嘗試XGBoost、CatBoost和NN(神經(jīng)網(wǎng)絡(luò))
def?cv_model(clf,?train_x,?train_y,?test_x,?clf_name='lgb'):
????folds?=?5
????seed?=?2021
????kf?=?KFold(n_splits=folds,?shuffle=True,?random_state=seed)
????train?=?np.zeros(train_x.shape[0])
????test?=?np.zeros(test_x.shape[0])
????cv_scores?=?[]
????for?i,?(train_index,?valid_index)?in?enumerate(kf.split(train_x,?train_y)):
????????print('************************************?{}?************************************'.format(str(i+1)))
????????trn_x,?trn_y,?val_x,?val_y?=?train_x.iloc[train_index],?train_y[train_index],?train_x.iloc[valid_index],?train_y[valid_index]
????????train_matrix?=?clf.Dataset(trn_x,?label=trn_y)
????????valid_matrix?=?clf.Dataset(val_x,?label=val_y)
????????params?=?{
????????????'boosting_type':?'gbdt',
????????????'objective':?'binary',
????????????'metric':?'auc',
????????????'min_child_weight':?5,
????????????'num_leaves':?2?**?7,
????????????'lambda_l2':?10,
????????????'feature_fraction':?0.9,
????????????'bagging_fraction':?0.9,
????????????'bagging_freq':?4,
????????????'learning_rate':?0.01,
????????????'seed':?2021,
????????????'nthread':?28,
????????????'n_jobs':-1,
????????????'silent':?True,
????????????'verbose':?-1,
????????}
????????model?=?clf.train(params,?train_matrix,?50000,?valid_sets=[train_matrix,?valid_matrix],?verbose_eval=500,early_stopping_rounds=200)
????????val_pred?=?model.predict(val_x,?num_iteration=model.best_iteration)
????????test_pred?=?model.predict(test_x,?num_iteration=model.best_iteration)
????????train[valid_index]?=?val_pred
????????test?+=?test_pred?/?kf.n_splits
????????cv_scores.append(roc_auc_score(val_y,?val_pred))
????????
????????print(cv_scores)
???????
????print("%s_scotrainre_list:"?%?clf_name,?cv_scores)
????print("%s_score_mean:"?%?clf_name,?np.mean(cv_scores))
????print("%s_score_std:"?%?clf_name,?np.std(cv_scores))
????return?train,?test
lgb_train,?lgb_test?=?cv_model(lgb,?x_train,?y_train,?x_test)
##?預(yù)測結(jié)果
sample_submit['loan_default']?=?lgb_test
sample_submit['loan_default']?=?sample_submit['loan_default'].apply(lambda?x:1?if?x>0.25?else?0).values
sample_submit.to_csv('baseline_result.csv',?index=False)
上分策略

上述Baseline是一個較為簡單的Baseline,試跑排名第8。如果想常掛榜首,需要考慮持續(xù)優(yōu)化,這里給出幾種方法:
本代碼實踐僅使用了賽題原始的特征,并沒有進行過多的特征工程,這里還是很值得優(yōu)化,并且相信會有很多提升點。特征工程對比賽結(jié)果的影響非常大,這里給出常見的幾種特征工程操作的介紹:特征交互、特征編碼和特征選擇。
特征交互
交互特征的構(gòu)造非常簡單,使用起來卻代價不菲。如果線性模型中包含有交互特征時,那它的訓(xùn)練時間和評分時間就會從 O(n) 增加到 O(n2),其中 n 是單一特征的數(shù)量。
特征和特征之間組合
特征和特征之間衍生
特征編碼
one-hot編碼
label-encode編碼
特征選擇
特征選擇技術(shù)可以精簡掉無用的特征,以降低最終模型的復(fù)雜性,它的最終目的是得到一個簡約模型,在不降低預(yù)測準確率或?qū)︻A(yù)測準確率影響不大的情況下提高計算速度。
特征選擇不是為了減少訓(xùn)練時間(實際上,一些技術(shù)會增加總體訓(xùn)練時間),而是為了減少模型評分時間
2.?進行參數(shù)優(yōu)化
對于模型的參數(shù)部分baseline部分并沒有進行過多的優(yōu)化和實驗,當(dāng)然這也是個比較大的優(yōu)化的,下面給出幾種調(diào)參的參考方法。
貪心調(diào)參
先使用當(dāng)前對模型影響最大的參數(shù)進行調(diào)優(yōu),達到當(dāng)前參數(shù)下的模型最優(yōu)化,再使用對模型影響次之的參數(shù)進行調(diào)優(yōu),如此下去,直到所有的參數(shù)調(diào)整完畢。
網(wǎng)格調(diào)參
sklearn 提供GridSearchCV用于進行網(wǎng)格搜索,只需要把模型的參數(shù)輸進去,就能給出最優(yōu)化的結(jié)果和參數(shù)。相比起貪心調(diào)參,網(wǎng)格搜索的結(jié)果會更優(yōu),但是網(wǎng)格搜索只適合于小數(shù)據(jù)集,一旦數(shù)據(jù)的量級上去了,很難得出結(jié)果。
貝葉斯調(diào)參
給定優(yōu)化的目標函數(shù)(廣義的函數(shù),只需指定輸入和輸出即可,無需知道內(nèi)部結(jié)構(gòu)以及數(shù)學(xué)性質(zhì)),通過不斷地添加樣本點來更新目標函數(shù)的后驗分布(高斯過程,直到后驗分布基本貼合于真實分布)。簡單的說,就是考慮了上一次參數(shù)的信息,從而更好的調(diào)整當(dāng)前的參數(shù)。
3.?嘗試新的模型
作為Baseline部分僅使用經(jīng)典的LightGBM作為訓(xùn)練模型,我們還能嘗試XGBoost、CatBoost和NN(神經(jīng)網(wǎng)絡(luò)),這里推薦兩篇Datawhale成員吳忠強的文章做參考。
上分利器
XGBoost模型
LightGBM模型
4.?進行模型融合
模型融合是一種能在各種的機器學(xué)習(xí)任務(wù)上提高準確率的強有力技術(shù),可謂是機器學(xué)習(xí)比賽大殺器,現(xiàn)在介紹基礎(chǔ)上分和進階上分兩種方式。
基礎(chǔ)上分
簡單平均和加權(quán)平均是常用的兩種比賽中模型融合的方式。其優(yōu)點是快速、簡單。
平均:(簡單實用) 簡單平均法 加權(quán)平均法 投票: 簡單投票法 加權(quán)投票法 綜合: 排序融合 log融合
進階上分
stacking在眾多比賽中大殺四方,但是跑過代碼的小伙伴想必能感受到速度之慢,同時stacking多層提升幅度并不能抵消其帶來的時間和內(nèi)存消耗,實際環(huán)境中應(yīng)用還是有一定的難度。
此外,在有答辯環(huán)節(jié)的比賽中,主辦方也會一定程度上考慮模型的復(fù)雜程度,所以說并不是模型融合的層數(shù)越多越好的。
stacking:
構(gòu)建多層模型,并利用預(yù)測結(jié)果再擬合預(yù)測。 blending:
選取部分數(shù)據(jù)預(yù)測訓(xùn)練得到預(yù)測結(jié)果作為新特征,帶入剩下的數(shù)據(jù)中預(yù)測。 boosting/bagging
當(dāng)然在比賽中將加權(quán)平均、stacking、blending等混用也是一種策略,可能會收獲意想不到的效果哦!
