老肥今天和大家分享的是“梧桐杯”中国移动大数据应用创新大赛的智慧金融赛道的Baseline方案(抱歉鸽了很久),线上成绩为0.9438
,处于一个相对靠前的排名位置。
在金融领域,活跃着一批“职业羊毛党”,他们通过套现、套利行为大肆牟利,影响普通用户本应享有的权益。他们制作各种自动、半自动的黑产工具,如自动注册机、刷单自动机、短信代接平台、分身软件、猫池等,并捆绑手机卡、银行卡或通过第三方平台交易完成套现,从而实现“薅羊毛”活动,自身获利的同时对商家、银行、平台、运营商的利益造成损失。如何从普通用户中有效鉴别出羊毛党,从而提前进行防范,在实际商业应用中有着重要的意义。
防羊毛党评分模型旨在从普通用户中区分出羊毛党用户号码,本次挑战赛设置了更具挑战性的任务,相比其他竞赛,本次竞赛所提供的训练字段相对较少,总体为低资源的竞赛任务,具体包含:
初赛——利用用户通信、流量、app使用等行为数据识别真实羊毛党群体,即简单的二分类问题,是羊毛党,或者不是羊毛党。
每一个号码样本包含两个月的数据,由加密过的手机号码和月份
共同构成主键。包含两个基础特征以及多个月消费特征、APP访问特征、短信特征。训练数据是一月份以及二月份的特征,测试数据为三月份以及四月份的特征。
评价指标为标准的F1 score
, 我们可以在这个指标上做很多后处理来提升成绩。
本方案未做细致特征工程,非常简单的Baseline,将特征分为数值类型的和类别特征。
data = pd.read_csv('data/data_a.csv')
# 将\N替换为空值
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_family', 'if_group', 'sms_inpkg_ind']
data.sort_values('month', inplace=True)
data.drop_duplicates('phone', inplace=True)
data.reset_index(drop=True, inplace=True)
data[cat_cols] = data[cat_cols].astype('category')
并且只选择了一月份的数据来做训练数据,镜像地选用测试集的三月份数据作为测试集数据,使用分层五折进行lgb模型的训练,模型的参数使用祖传参数,评价标准为binary_error
生成预测文件。
def find_best_t(y_pred, y_true):
best_score = f1_score(y_true, np.where(y_pred >= 0.5, 1, 0))
t = 0.5
for i in tqdm(range(300, 700)):
current_score = f1_score(y_true, np.where(y_pred >= i / 1000, 1, 0))
if current_score > best_score:
best_score = current_score
t = i / 1000
print(f'best score: {best_score}, best t: {t}')
return t
t = 0.5
t = find_best_t(oof_lgb, y)
对于该二分类问题,我们还可以通过调整阈值的后处理方法来提分,选择本地验证集最高f1_score
的阈值, 在预测时采用相同的阈值(原来阈值为0.5),大于该阈值取1,小于该阈值则取0。