阿里云天池学习赛 – Datawhale学习笔记
1.赛题数据及背景
阿里云天池学习赛【金融风控-贷款违约预测】
数据集注册天池账号后可下载
1.1学习目标
- 理解赛题数据和目标,清楚评分体系。
- 完成相应报名,下载数据和结果提交打卡(可提交示例结果),熟悉比赛流程
1.2赛题概况
- 比赛要求参赛选手根据给定的数据集,建立模型,预测金融风险。
- 通过这道赛题来引导大家走进金融风控数据竞赛的世界,主要针对于于竞赛新人进行自我练习、自我提高。
赛题以预测金融风险为任务,数据集报名后可见并可下载,该数据来自某信贷平台的贷款记录,总数据量超过120w,包含47列变量信息,其中15列为匿名变量。为了保证比赛的公平性,将会从中抽取80万条作为训练集,20万条作为测试集A,20万条作为测试集B,同时会对employmentTitle、purpose、postCode和title等信息进行脱敏。
1.3数据概况
target变量:isDefault
1.4预测指标
- 竞赛采用AUC作为评价指标。AUC(Area Under Curve)被定义为 ROC曲线 下与坐标轴围成的面积。
- 这里贴一个Python计算画图示例:
- 常用评价指标说明与对比(干货)
- 核儿:指标很多,理解含义的同时,关键要知道结合不同场景选择对应的评估指标!
- 当然,要了解常用指标评估阈值
- 核儿:指标很多,理解含义的同时,关键要知道结合不同场景选择对应的评估指标!
1.4.1 sklearn里的常见评测指标
- 另外sklearn.metrics 里面提供了大部分评价的方法可以直接进行预测结果的评估
1.5 比赛经验总结
赛题理解是开始比赛的第一步,赛题的理解有助于对竞赛全局的把握。通过赛题理解有助于对赛题的业务逻辑把握,对于后期的特征工程构建和模型选择都尤为重要。
- 在开始比赛之前要对赛题进行充分的了解。
- 比赛什么时候开始,什么时候结束,什么时候换B榜数据。
- 和该比赛有没有类似的比赛可以参考借鉴。
- 线上提交结果的次数往往是有限的,提前了解每日可以提交的次数。
- 比赛使用的是什么评价指标,可以选择相同的评价指标作为线下验证的方式。
1.6 赛题流程
1.7 拓展知识——评分卡
评分卡是一张拥有分数刻度会让相应阈值的表。信用评分卡是用于用户信用的一张刻度表。以下代码是一个非标准评分卡的代码流程,用于刻画用户的信用评分。评分卡是金融风控中常用的一种对于用户信用进行刻画的手段哦!
#评分卡 不是标准评分卡
def Score(prob,P0=600,PDO=20,badrate=None,goodrate=None):
P0 = P0
PDO = PDO
theta0 = badrate/goodrate
B = PDO/np.log(2)
A = P0 + B*np.log(2*theta0)
score = A-B*np.log(prob/(1-prob))
return score
- 映射公式
- 查看评分分布
#画图--样本密度分布,图线下面积是比例
all_data3 =X_train_lgbm.copy()#用于画图分析的评分数据副本
bad=all_data3.score[all_data3.target==1]
good=all_data3.score[all_data3.target==0]
plt.figure(figsize=(7,5))
sns.distplot(bad,bins=50,hist=False,label='bad')
sns.distplot(good,bins=50,hist=False,label='good')
plt.xlabel('Score',fontdict={'fontsize':12},labelpad=10)
plt.legend(loc=0,fontsize=11)
• 不做woe转化的评分卡(逻辑回归和lgbm)
# 一、输出概率算分数onekey
def score(xbeta):
score = 1000-500*(math.log2(1-xbeta)/xbeta) #好人的概率/坏人的概率
score = 400-20*(np.log2(xbeta/(1-xbeta)))
return score
evl['xbeta'] = model.predict_proba(evl_x)[:,1]
evl['score'] = evl.apply(lambda x : score(x.xbeta) ,axis=1)
#['person_info','finance_info','credit_info','act_info']
# 二、wx+b 算分数onekey
def score(person_info,finance_info,credit_info,act_info):
xbeta = person_info * ( 3.49460978) + finance_info * ( 11.40051582 ) + credit_info * (2.45541981) + act_info * ( -1.68676079) --0.34484897
score = 650-34* (xbeta)/math.log(2)
return score
val['score'] = val.apply(lambda x : score(x.person_info,x.finance_info,x.credit_info,x.act_info) ,axis=1)
all_data3.score.describe().to_frame().T#分数分布