baseline来啦!第三届厦门国际银行数创金融杯金融营销建模大赛(奖金34万!)
1.大賽背景
隨著科技發(fā)展,銀行陸續(xù)打造了線上線下、豐富多樣的客戶觸點,來滿足客戶日常業(yè)務(wù)辦理、渠道交易等需求。面對著大量的客戶,銀行需要更全面、準確地洞察客戶理財需求。在實際理財產(chǎn)品業(yè)務(wù)開展過程中,需要挖掘不同理財產(chǎn)品對客群的吸引力,從而找到目標客群,進行針對性營銷。
本次競賽提供實際業(yè)務(wù)場景中的客戶行為、資產(chǎn)信息、產(chǎn)品交易信息等為建模對象,一方面希望能借此展現(xiàn)各參賽選手的數(shù)據(jù)挖掘?qū)崙?zhàn)能力,另一方面需要選手在復(fù)賽中結(jié)合建模的結(jié)果提出相應(yīng)的營銷解決方案,充分體現(xiàn)數(shù)據(jù)分析的價值。
2.賽題描述
(1) 賽題任務(wù)
此次競賽題目主要是針對客戶購買各類理財產(chǎn)品存單概率進行預(yù)測,并將預(yù)測結(jié)果作為營銷方案的依據(jù)。
(2) 數(shù)據(jù)使用規(guī)則
本賽題不能使用任何外部數(shù)據(jù)。本次提供的數(shù)據(jù)經(jīng)過脫敏,部分連續(xù)型數(shù)據(jù)(如利率、價格、金融等)經(jīng)過一定的線性變換,但不影響建模使用和模型預(yù)測結(jié)果。
(3) A/B榜規(guī)則
本次初賽采用AB榜形式。初賽時間總共一個半月,前一個月排行榜顯示A榜成績(有公私榜,公私榜比例是6:4)后半個月切換成B榜單(有公私榜),排行榜顯示B榜成績,以參賽者提交的最高分為準,最后初賽成績=A榜成績0.3+B榜成績0.7。
3.評估指標
1、初賽采用A/B榜賽制,最終初賽成績=0.3A榜測試集F2值+0.7B榜測試集F2值,其中:
recall = TP/(TP+FN),召回率
precision = TP/(TP+FP),精準率
F2 = 5recallprecision/(4*precision+recall),F2值
TP是真樣例,FP是假陽例,FN是假陰例,通過以上公式得到該類F2值。
4.數(shù)據(jù)描述
本次比賽的任務(wù)核心是通過用戶7,8,9月的歷史消費記錄來預(yù)測其在10月是否會有購買行為,賽題給的數(shù)據(jù)表非常之多,這里不詳細進行展開,具體可以查看賽題主辦方所給的數(shù)據(jù)描述。
5.Baseline思路
本賽題是一個非常典型的結(jié)構(gòu)化數(shù)據(jù)的比賽,這里我們依然采取傳統(tǒng)的特征工程+lgb(也可以是xgb,cat)的方案。由于本賽題有較強的時序性,所以這里我們在線下進行驗證的時候使用7,8月的數(shù)據(jù)進行訓(xùn)練在第9月的數(shù)據(jù)上進行驗證,而在線上進行提交的時候,則使用7,8,9月三個月的數(shù)據(jù)進行訓(xùn)練.這里需要注意的是,這次賽題的線上評分標準為F2的得分,在進行F2得分計算的時候需要我們提交的預(yù)測結(jié)果是0和1的整數(shù)值,但是我們的模型預(yù)測的結(jié)果是一個概率值,這里就涉及到一個閾值的選取,這里建議大家在線下驗證的時候手動搜索一下這個閾值,其代碼如下所示:
def search_best_thre(y_true,y_pre):best_f2 = 0best_th = 0for i in range(100):th = 0.03+i/1000y_pre_copy = y_pre.copy()y_pre_copy[y_pre_copy >= th] = 1y_pre_copy[y_pre_copy < th] = 0temp_f2 = f2_score(y_true,y_pre_copy)if temp_f2>best_f2:best_f2 = temp_f2best_th = th print(f'thre: {best_th} f2 score: {best_f2}')return best_th其中,這里的f2_score就是我們自己手動實現(xiàn)的計算F2分數(shù)的評估函數(shù)
6.特征工程
6.1 用戶信息表
這里對用戶信息表進行簡單的與主表進行合并,以此來獲取用戶信息,其代碼如下:
# 客戶信息表 d = pd.read_csv(data_root2 + 'd.csv')df = df.merge(d, on='core_cust_id', how='left')del d gc.collect()6.2 用戶風(fēng)險表
這里的用戶風(fēng)險由于是每個一段實際就會對用戶的風(fēng)險進行一次評級,所以這里每一個用戶都有可能會對應(yīng)多個風(fēng)險等級,這里我們只選取最近的對用戶風(fēng)險進行評級的得分,具體做法是我們以user和評估日期為主鍵進行排序,然后按user為主鍵進行去重,并且在去重的時候僅保留最后一條數(shù)據(jù),這樣我們便保留了用戶最近一次風(fēng)險評估的記錄,其代碼如下:
# 客戶風(fēng)險表 e = pd.read_csv(data_root2+'e.csv')e = e.sort_values(['core_cust_id','e2'])e = e.drop_duplicates(subset=['core_cust_id'],keep='last')df = df.merge(e[['core_cust_id','e1']],on='core_cust_id',how='left')del e gc.collect()6.3 用戶資產(chǎn)信息表
用戶的資產(chǎn)信息也會在不同時間點有不同的變化,這里我們統(tǒng)計計算每個月用戶的各種資產(chǎn)的平均值作為用戶的特征,其代碼實現(xiàn)如下:
# 資產(chǎn)信息表 f = pd.read_csv(data_root2 + 'f.csv')f.fillna(0, inplace=True)map_dict = dict(zip(sorted(f['f22'].unique()), sorted(df['a3'].unique())))f['f22'] = f['f22'].map(map_dict)for c in ['f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9','f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16','f17', 'f18', 'f19','f20', 'f21']:f[c] = f[c].apply(lambda x: str(x).replace(',','')).astype('float') f_stat = f.groupby(['core_cust_id','f22']).agg(f2_mean=('f2', 'mean'), f3_mean=('f3', 'mean'), f4_mean=('f4', 'mean'), f5_mean=('f5', 'mean'),f6_mean=('f6', 'mean'),f7_mean=('f7', 'mean'),f8_mean=('f8', 'mean'),f9_mean=('f9', 'mean'),f10_mean=('f10', 'mean'),f11_mean=('f11', 'mean'),f12_mean=('f12', 'mean'),f13_mean=('f13', 'mean'),f14_mean=('f14', 'mean'),f15_mean=('f15', 'mean'),f16_mean=('f16', 'mean'),f17_mean=('f17', 'mean'),f18_mean=('f18', 'mean'),f19_mean=('f19', 'mean'),f20_mean=('f20', 'mean'),f21_mean=('f21', 'mean'),).reset_index()df = df.merge(f_stat, left_on=['core_cust_id','a3'], right_on=['core_cust_id','f22'], how='left')del f, f_stat gc.collect()6.4 賬戶交易流水表
用戶的交易流水同樣也十分重要,這里的賬戶交易流水信息包含了借方的信息和貸方的信息,我們對這兩部分分別統(tǒng)計,風(fēng)別統(tǒng)計借方與貸放每個月涉及金額的統(tǒng)計值,并且將其作為歷史信息拼接到原有的數(shù)據(jù)表中,他的意思就是比如我預(yù)測10月份改用戶會不會購買東西,那么我就將其9月份的賬戶交易信息作為其歷史特征,對于預(yù)測9月份用戶會不會購買東西,就將其8月的賬戶交易信息作為歷史特征,其代碼實現(xiàn)如下:
# S 表:賬戶交易流水表,其中 s3 和 s6 是客戶編號,可以和其他表中的 core_cust_id進行關(guān)聯(lián)。s = pd.read_csv(data_root2+'s.csv')s['month'] = s['s7'].apply(lambda x: x.split('-')[1]).astype('int32')s['s4'] = s['s4'].apply(lambda x: str(x).replace(',','')).astype('float')tmp_s3 = s.groupby(['s3','month']).agg(s3_s4_sum=('s4', 'sum'),s3_s4_mean=('s4', 'mean'),s3_s4_count=('s4','count')).reset_index()tmp_s6 = s.groupby(['s6','month']).agg(s6_s4_sum=('s4', 'sum'), s6_s4_mean=('s4', 'mean'),s6_s4_count=('s4','count')).reset_index()tmp_s3['month'] = tmp_s3['month']+1tmp_s6['month'] = tmp_s6['month']+1tmp_s3 = tmp_s3.rename(columns={'s3':'core_cust_id'})tmp_s6 = tmp_s6.rename(columns={'s6':'core_cust_id'})df = df.merge(tmp_s3,on=['core_cust_id','month'],how='left')df = df.merge(tmp_s6,on=['core_cust_id','month'],how='left')6.5 app 點擊行為表
這張表記錄了user和產(chǎn)品之間的交互記錄,這里簡單的對user和產(chǎn)品交互情況進行統(tǒng)計,其代碼如下:
#app 點擊行為表 r = pd.read_csv(data_root2+'r.csv') r = cross_enc(r,'core_cust_id','prod_code') r = r.sort_values(['core_cust_id','r5']).reset_index(drop=True) r = r.drop_duplicates(subset=['core_cust_id'],keep='last') df = df.merge(r[['core_cust_id','prod_code','core_cust_id_count','prod_code_count','core_cust_id_prod_code_count','cross_core_cust_id_prod_code_count_div_core_cust_id_count','cross_core_cust_id_prod_code_count_div_prod_code_count']],on=['core_cust_id','prod_code'],how='left')6.6 目標編碼
這里對user和產(chǎn)品id進行了五折目標編碼,其代碼如下:
## 五折目標編碼from sklearn.model_selection import StratifiedKFold label = 'y' skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=2020)enc_list = ['core_cust_id','prod_code']for f in tqdm(enc_list):train_df[f + '_target_enc'] = 0test_df[f + '_target_enc'] = 0for i, (trn_idx, val_idx) in enumerate(skf.split(train_df, train_df[label])):trn_x = train_df[[f, label]].iloc[trn_idx].reset_index(drop=True)val_x = train_df[[f]].iloc[val_idx].reset_index(drop=True)enc_df = trn_x.groupby(f, as_index=False)[label].agg({f + '_target_enc': 'mean'})val_x = val_x.merge(enc_df, on=f, how='left')test_x = test_df[[f]].merge(enc_df, on=f, how='left')val_x[f + '_target_enc'] = val_x[f + '_target_enc'].fillna(train_df[label].mean())test_x[f + '_target_enc'] = test_x[f + '_target_enc'].fillna(train_df[label].mean())train_df.loc[val_idx, f + '_target_enc'] = val_x[f + '_target_enc'].valuestest_df[f + '_target_enc'] += test_x[f + '_target_enc'].values / skf.n_splits7.Baseline結(jié)果
在構(gòu)造完特征之后,使用lgb對所得的數(shù)據(jù)進行訓(xùn)練,其線下的閾值搜索結(jié)果如下:
thre: 0.03 f2 score: 0.3942484810161383 thre: 0.031 f2 score: 0.39657528516049867 thre: 0.032 f2 score: 0.39895684622669514 thre: 0.033 f2 score: 0.40054636211507927 thre: 0.034 f2 score: 0.4026079162691184 thre: 0.034999999999999996 f2 score: 0.4044912629302788 thre: 0.036 f2 score: 0.40612958944151645 thre: 0.037 f2 score: 0.40753496138593204 thre: 0.038 f2 score: 0.40927755967690993 thre: 0.039 f2 score: 0.410503800118327 thre: 0.04 f2 score: 0.4126804328858547 thre: 0.040999999999999995 f2 score: 0.41439493397173527 thre: 0.041999999999999996 f2 score: 0.414933881594318 thre: 0.043 f2 score: 0.4164246353831421 thre: 0.044 f2 score: 0.417484643151162 thre: 0.045 f2 score: 0.4190938253084154 thre: 0.046 f2 score: 0.4201667149431947 thre: 0.047 f2 score: 0.4213196324089531 thre: 0.048 f2 score: 0.4225329108548656 thre: 0.049 f2 score: 0.42326606470288314 thre: 0.05 f2 score: 0.4239773348575973 thre: 0.051000000000000004 f2 score: 0.4246038365304421 thre: 0.052 f2 score: 0.42623418944115027 thre: 0.054 f2 score: 0.4272477986135949 thre: 0.055 f2 score: 0.4281746644036414 thre: 0.057999999999999996 f2 score: 0.428551417415209 thre: 0.059 f2 score: 0.4293245411428671 thre: 0.06 f2 score: 0.4303395127494851 thre: 0.061 f2 score: 0.43075245365321696 thre: 0.062 f2 score: 0.43146751165763464 thre: 0.063 f2 score: 0.43217145548751756 thre: 0.064 f2 score: 0.4324398249452955 thre: 0.065 f2 score: 0.433346787509632 thre: 0.066 f2 score: 0.4336518242520382在線上進行測評的得分為:0.29,可以看出本次賽題的線下和線上的差異有一點大
8.展望
本次baseline使用的表不是很多,還有很多與產(chǎn)品相關(guān)的表沒有使用,可以加入對這些產(chǎn)品相關(guān)的表的使用嘗試其他的boosting模型,例如xgb,cat等等可以嘗試使用一些自動調(diào)參工具對lgb進行調(diào)參模型融合。
對本次比賽感興趣的同學(xué)也可以參與深度之眼開設(shè)的baseline指導(dǎo)課程,旨在通過2次直播講清楚此次大賽baseline的構(gòu)建思路、代碼以及優(yōu)化。
1月13日直播:手把手教你baseline構(gòu)建(代碼講解)
1月20日直播:baseline優(yōu)化講解
帶著大家在實踐中學(xué)習(xí)、在學(xué)習(xí)中實踐,打出好成績,學(xué)到知識。
2次直播、全程答疑。
原價198元,13日前限時0.1元!
長按二維碼,立即參賽
第一次參賽沒關(guān)系,群內(nèi)300+小伙伴,我們幫你組隊!
課程大綱
賽圈大佬指導(dǎo)
2次直播、全程答疑。
原價198元,13日前限時0.1元!
長按二維碼,立即參賽
第一次參賽沒關(guān)系,群內(nèi)300+小伙伴,我們幫你組隊!
—1月13日開班—
總結(jié)
以上是生活随笔為你收集整理的baseline来啦!第三届厦门国际银行数创金融杯金融营销建模大赛(奖金34万!)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7打不开qq文件怎么办
- 下一篇: 搜狐视频怎么修改昵称