大家好,我是小泽。
刚结束金融赛道的复赛,回来修整了一会。就把初赛的代码整理一下开源给大家。
比赛链接
初赛要求选手依照主办方已给数据找出“羊毛党”,具体包含:利用用户通信、流量、app使用等行为数据。

由于之前主要是在生活赛道,来金融的时候大家已经发现数据中奇数月和偶数月分布差异很大,并且采用1、3月份建模效果最好。所以我这一块主要还是怼的业务特征。

数据处理
首先是对数据做了一些转型以及填充编码处理

data.replace('\\N', np.NaN, inplace=True)
#所有从网络侧到用户侧的数据流,都属于下行流量;从用户侧到网络侧是数据流,则属于上行流量,一般用户来说下行流量远大于上行流量
f_features = ['gprs_fee', 'overrun_flux_fee', 'out_actvcall_dur', 'actvcall_fee','out_activcall_fee', 'monfix_fee', 'gift_acct_amt', 'call_cnt','up_flux', 'down_flux', 'p2psms_up_cnt','p2psms_cmnct_fee', 'p2psms_pkg_fee']
data[f_features] = data[f_features].astype('float')cat_cols = ['if_group','if_family','sms_inpkg_ind']
def encode_df(data):for col in cat_cols:   print(col)encode = LabelEncoder()data[col] = data[col].fillna('unkown')        encode.fit(data[col])        data[col] = encode.transform(data[col])return datadata=encode_df(data)

特征工程
然后是一些根据业务背景做的一些简单的业务特征

data['total_flow']=data['up_flux']+data['down_flux']
data['average_flow']=data['total_flow']/data['call_cnt']
data['aver_up_fee'] = data['up_flux']/data['call_cnt']
data['aver_down_fee'] = data['down_flux']/data['call_cnt']
data['total_liuliang_fee']=data['gprs_fee']+data['overrun_flux_fee']
data['total_yu_e'] = data['chrg_amt'] + data['gift_acct_amt']
data['p2p_feeall'] = data['p2psms_cmnct_fee'] + data['p2psms_pkg_fee']data['use_money'] = data['total_yu_e'] - data['monfix_fee']
data['aver_chrg'] = data['chrg_amt'] / data['chrg_cnt']data['total_cnt'] = data['call_cnt'] + data['chrg_cnt'] + data['p2psms_up_cnt']
data.drop(['actvcall_fee','out_activcall_fee','overrun_flux_fee','gprs_fee'],axis=1,inplace=True)

接下来是分组特征,分组特征往往表现出比较极端的效果,对模型的影响还是较大,后面需要细致的调试。

data_usr=data.sort_values(by=['phone','month']).reset_index()
data_usr.fillna(data_usr.median(),inplace=True)def get_features1(data):data_count=pd.DataFrame()data_count['phone']=data['phone'].unique()for f in tqdm(['chrg_amt','total_liuliang_fee','total_yu_e','p2p_feeall','total_flow','p2psms_up_cnt']):df_temp = data.groupby('phone')[f].agg(**{'df_{}_mean'.format(f): 'mean','df_{}_std'.format(f): 'std','df_{}_max'.format(f): 'max','df_{}_min'.format(f): 'min','df_{}_sum'.format(f): 'sum',}).reset_index()data_count=pd.merge(data_count,df_temp,on='phone',how='left') for f in tqdm(['monfix_fee']):df_temp = data.groupby('phone')[f].agg(**{'df_{}_sum'.format(f): 'sum',}).reset_index()data_count=pd.merge(data_count,df_temp,on='phone',how='left')   return data_countdata_usr=get_features1(data_usr)

对数据做EDA分析可以发现部分行为特征做01分箱往往可以表现出比较好的效果

def f(x):if x>0:return 1else:return 0
data['if_flux_na']=0
data.loc[(data['up_flux'].isnull())&(data['down_flux'].isnull()),['if_flux_na']] = 1
data.loc[data['down_flux']!=np.nan,['if_flux_na']] = 0
data.loc[data['up_flux']!=np.nan,['if_flux_na']] = 0data['if_czcs']=data['chrg_cnt'].apply(f)
data['if_call']=data['call_cnt'].apply(f)
data['if_p2psms']=data['p2psms_up_cnt'].apply(f)
data['if_czje']=data['chrg_amt'].apply(f)

接下来的特征主要是考虑两个特征之间的相关性,比如上、下行流量的一些衍生关系。B榜还是挺有用的,A榜的上下行流量数据特征基本没啥用,所以这里只是提一下这方面的思路,具体还是要看大家自己线下对比效果。

def get_features2(df):features = [['gift_acct_amt','monfix_fee'],['up_flux','down_flux']]for fea in features:df[f'{fea[0]}_{fea[1]}_std'] = df[fea].std(1)df[f'{fea[0]}_{fea[1]}_max'] = df[fea].max(1)df[f'{fea[0]}_{fea[1]}_min'] = df[fea].min(1)df[f'{fea[0]}_{fea[1]}_sub'] = df[fea[0]] - df[fea[1]]return dfX_train = get_features2(X_train)
X_test = get_features2(X_test)

模型依旧采用的是五折的lgb,由于时间问题并没有尝试五折的catboost,这题的类别特征不是很多,具体的效果没有进行对比

KF = StratifiedKFold(n_splits=5, random_state=2021, shuffle=True)
params = {'objective':'binary','metric':'binary_error', 'learning_rate':0.04, 'num_iterations': 10000, 'silent':True
}oof_lgb = np.zeros(len(X_train))
predictions_lgb = np.zeros((len(X_test)))# 五折交叉验证
for fold_, (trn_idx, val_idx) in enumerate(KF.split(X_train.values, y.values)):print("fold n°{}".format(fold_))print('trn_idx:',trn_idx)print('val_idx:',val_idx)trn_data = lgb.Dataset(X_train.iloc[trn_idx][features],label=y.iloc[trn_idx])    val_data = lgb.Dataset(X_train.iloc[val_idx][features],label=y.iloc[val_idx])num_round = 10000clf = lgb.train(params,trn_data,num_round,valid_sets = [trn_data, val_data],verbose_eval=500,early_stopping_rounds=200,  categorical_feature=cat_cols,    )       oof_lgb[val_idx] = clf.predict(X_train.iloc[val_idx][features], num_iteration=clf.best_iteration)predictions_lgb[:] += (clf.predict(X_test[features], num_iteration=clf.best_iteration))/5
print("AUC score: {}".format(roc_auc_score(y, oof_lgb)))
print("F1 score: {}".format(f1_score(y, [1 if i >= 0.5 else 0 for i in oof_lgb])))
print("Precision score: {}".format(precision_score(y, [1 if i >= 0.5 else 0 for i in oof_lgb])))
print("Recall score: {}".format(recall_score(y, [1 if i >= 0.5 else 0 for i in oof_lgb])))

写在最后
到这里基本就结束了,是不是觉得很不可思议?百余行代码就可以获得较好的成绩,也没有用比较花里胡哨的模型,所以根据数据去实现好的业务特征往往就是会带来意想不到的效果,由于做金融赛道的时候只剩下一周时间还有部分想法没有实现,这里也一并分享给大家(仅供参考):
1.对类别特征做交叉
2.对数值特征(比如余额)做更为细致的分箱
3.研究业务背景,根据已有的特征去实现更强的业务特征
4.尝试更换其他模型,比如catboost

我是小泽,一名还在努力的大三小生。如果你觉得这篇文章对你有些帮助欢迎点赞,也期待你的关注!

同行的小伙伴也欢迎加我微信,一起学习进步!

中国移动“梧桐杯”大数据应用创新大赛智慧金融初赛TOP1开源相关推荐

  1. 报名开始!第二届中国移动“梧桐杯”大数据应用创新大赛邀你夺52w大奖!

    为进一步落实中国移动战略,助力公司数字化转型发展,推动高校人才创新培养,由中国移动通信集团有限公司主办,中国移动通信集团北京有限公司.中国移动通信集团湖北有限公司.中国移动通信集团广东有限公司.中国移 ...

  2. 三城演义!第二届中国移动“梧桐杯”大数据应用创新大赛复赛完美收官

    8月19日至26日,第二届中国移动"梧桐杯"大数据应用创新大赛暨大数据创客马拉松大赛的三场复赛路演暨颁奖典礼在杭州.武汉.广州三地成功举办.35支队伍在数智乡村.数智城市.数智交通 ...

  3. 【报名开始】第二届中国移动“梧桐杯”大数据应用创新大赛邀你夺52w大奖

    为进一步落实中国移动战略,助力公司数字化转型发展,推动高校人才创新培养,由中国移动通信集团有限公司主办,中国移动通信集团北京有限公司.中国移动通信集团湖北有限公司.中国移动通信集团广东有限公司.中国移 ...

  4. 报名即将截止,中国移动“梧桐杯”大数据应用创新大赛,寻找大数据敢想者!...

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale赛事 主办方:中国移动信息技术中心 也许,你在大数据分析路上踽踽独行 来这里, ...

  5. 报名即将截止,“梧桐杯”大数据应用创新大赛,邀你进入大数据先锋阵营

    大数据建模不是孤独寂寞的路,面对无数的数字,一定要有人作伴 大数据建模不是望不到头的路,步履坚实的历程,要用成绩来证明 大数据建模不是沉闷无声的路,凝结心血的方案,值得大声说出来 路上的人 或许在电脑 ...

  6. “梧桐杯”中国移动大数据应用创新大赛 - 智慧城市赛道baseline

    开源一个0.827的baseline 没做太多特征,读数据,看分布,如果分布是长尾分布就加个变换 去掉相关系数低于0.05的特征 对某些在某些区间聚集较为明显的特征分桶处理 网格调参,我还没跳到最优, ...

  7. “联创黔线”杯大数据应用创新大赛

    文章目录 赛题介绍 代码 1 特征工程 1.1 正样本 1.2 负样本 2 建模 3 预测 3.1 测试集 4 提交结果 0 查看数据 0.1 训练数据 0.1.1 正样本 0.1.2 负样本 0.1 ...

  8. 大数据应用项目创新大赛_温州首届大数据应用创新大赛决赛名单公布!有你的单位吗?...

    如何发掘和培养一批优秀大数据应用领域专业人才,让大数据应用精准服务经济发展?昨日上午,"图科杯"首届温州市大数据应用创新大赛(初赛)拉开帷幕.据悉,这是温州贯彻落实我省大数据发展实 ...

  9. 大数据应用项目创新大赛_全国高校大数据应用创新大赛

    2015年国务院发布<促进大数据发展行动纲要>,标志着大数据战略正式上升为国家战略.为配合国家大数据战略,加快产业人才培养,教育部增设了"数据科学与大数据技术"本科专业 ...

  10. 大数据应用项目创新大赛_经济管理学院大数据应用创新大赛顺利举行

    为促进大学生大数据时代的应用创新设计能力,培养大学生技术技能.创新思维.实践能力和团队协作的能力,挖掘大数据管理.商务大数据分析等领域的优秀人才,11月27日由营口理工学院教务处主办,经济管理学院承办 ...

最新文章

  1. 多元统计分析何晓群_多元统计分析第四章作业
  2. 函数指针(就做个笔记)
  3. ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法
  4. 源码里throw new RuntimeException(“Stub!“)什么意思
  5. 基于MATLAB的波速形成仿真
  6. python软件下载网站
  7. web浏览器_vs2019使用webview2开发web浏览器 - 左正
  8. Ansible 学习总结(2)—— Ansible playbook 入门详解
  9. 编写 iPhone Friendly 的 Web 应用程序 (Part 6 - iUI)
  10. c语言判断字符串合法标识符,HDU 2024 C语言合法标识符(以及一些关于输入和ctype.h的内容)...
  11. AngularJs--ng-repeate渲染完毕后执行的代码
  12. uni-App 商品详情轮播图
  13. “造路者”14载终圆梦:铺就浙江沿海新未来
  14. HetConv--Heterogeneous-Kernel-Based-Convolutions-for-Deep-CNNs
  15. Processing创意编程(熟练篇)
  16. 外国语言学c刊集刊联系方式,CSSCI(2017-2018)收录集刊目录 (共189 种).PDF
  17. outlook没有显示已连接到服务器上,Outlook无法连接到服务器怎么办?
  18. 卓训教育:打败挫败感,让孩子对学习更自信
  19. 【sql+python】数据库与程序实践——某自来水公司收费系统
  20. MyBatis-Plus 01入门

热门文章

  1. esayExcel 获取值 null 去除excel中换行 回车 水平制表符
  2. Tensorflow之搭建神经网络八股
  3. k8s calico-node错误日志 listen tcp: lookup localhost on ip:53: no such host
  4. has an unsupported return type
  5. 【转】死链-百度百科
  6. 计算机系统C盘会还原,重装系统c盘东西还在吗|电脑重装系统c盘文件会被清空吗...
  7. 3D打印探讨:三个应用方向与四项风险
  8. java餐厅点餐系统免费_基于jsp的餐厅点餐系统-JavaEE实现餐厅点餐系统 - java项目源码...
  9. 《弗洛伊德及其后继者》读书笔记(part3)--沙利文与人际精神分析
  10. linux恢复rm删除文件ext4,EXT4中恢复使用rm命令误删除的文件