LightGBM的意思是轻量级(light)的梯度提升机(GBM),其相对Xgboost具有训练速度快、内存占用低的特点。关于lgb针对xgb做的优化,后面想写一篇文章复习一下。本篇文章主要讲解如何利用lgb建立一张评分卡,不涉及公式推导。关于lgb的基础使用教程,由于和xgb有许多相似之处,这里放一篇基础教程的链接。
LightGBM使用简单介绍:https://mathpretty.com/10649.html
  本文是梅子行老师的金融风控实战课程的笔记。

import pandas as pd
from sklearn.metrics import roc_auc_score,roc_curve,auc
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.linear_model import LogisticRegression
import numpy as np
import random
import math
import time
import lightgbm as lgbdata = pd.read_csv('Acard.txt')df_train = data[data.obs_mth != '2018-11-30'].reset_index().copy()
val = data[data.obs_mth == '2018-11-30'].reset_index().copy()lst = ['person_info','finance_info','credit_info','act_info','td_score','jxl_score','mj_score','rh_score']

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-61JGuNcc-1587045363117)(https://imgkr.cn-bj.ufileos.com/b7132395-64c1-4068-8b49-7297f24472b2.png)]

  变量都是数值型,无需进行处理。由于lgb采用的是cart回归树,所以只能接受数值特征输入,不直接支持类别特征。对于类别特征,可以进行one-hot编码或者label-encoding编码转化成数值型变量。
  然后选取跨时间验证集,将2018年11月份的数据选作跨时间验证集,用于评估模型的表现。
  一共有8个入模变量,其中info结尾的是无监督系统输出的个人表现,score结尾的是收费的外部征信数据。

df_train = df_train.sort_values(by = 'obs_mth',ascending = False)rank_lst = []
for i in range(1,len(df_train)+1):rank_lst.append(i)df_train['rank'] = rank_lstdf_train['rank'] = df_train['rank']/len(df_train)pct_lst = []
for x in df_train['rank']:if x <= 0.2:x = 1elif x <= 0.4:x = 2elif x <= 0.6:x = 3elif x <= 0.8:x = 4else:x = 5pct_lst.append(x)
df_train['rank'] = pct_lst
#train = train.drop('obs_mth',axis = 1)
df_train.head()

  这里将样本均分为5份,并打上相应的标签,目的是为了训练中进行交叉验证。这里有一个注意的地方,在机器学习中,一般数据集可以分为训练集、验证集、测试集,但是在信贷风控领域中验证集和测试集定义正好相反。跨时间验证集其实是测试集,而上面作交叉验证的“测试集”其实才是验证集。总之,验证集是为了模型调参用的,而测试集是为了看模型的泛化效果。

def LGB_test(train_x,train_y,test_x,test_y):from multiprocessing import cpu_countclf = lgb.LGBMClassifier(boosting_type='gbdt', num_leaves=31, reg_alpha=0.0, reg_lambda=1,max_depth=2, n_estimators=800,max_features = 140, objective='binary',subsample=0.7, colsample_bytree=0.7, subsample_freq=1,learning_rate=0.05, min_child_weight=50,random_state=None,n_jobs=cpu_count()-1,num_iterations = 800 #迭代次数)clf.fit(train_x, train_y,eval_set=[(train_x, train_y),(test_x,test_y)],eval_metric='auc',early_stopping_rounds=100)print(clf.n_features_)return clf,clf.best_score_[ 'valid_1']['auc']

  定义lightgbm函数,这里用的是sklearn接口的方法。lgb建模和xgb一样,也有两种方法。可以看到,参数也有很多是一样的。解释一下几个参数的含义:

‘num_leaves’:一颗树上的叶子数,默认为31.
‘reg_alpha’:L1 正则,默认为0,在xgb自带建模中为lambda_l1。
‘objective’:损失函数。默认为regression,即回归问题的均方误差损失函数。这里用的binary是对数损失函数作为目标函数,表示二分类任务。
‘min_child_weight’:子节点上最小的样本权重和。指建立每个模型所需要的最小样本数,可以用来处理过拟合。
‘subsample_freq’:bagging 的频率,默认为1。即多少次迭代之后进行一次bagging。

  n_features_为入模特征的个数,这里为8。best_score_表示模型的最佳得分,是一个字典,返回验证集上的AUC值。

feature_lst = {}
ks_train_lst = []
ks_test_lst = []
for rk in set(df_train['rank']):   ttest = df_train[df_train['rank'] ==  rk]ttrain = df_train[df_train['rank'] !=  rk]train = ttrain[lst]train_y = ttrain.bad_indtest = ttest[lst]test_y = ttest.bad_ind    start = time.time()model,auc = LGB_test(train,train_y,test,test_y)                    end = time.time()#模型贡献度放在feture中feature = pd.DataFrame({'name' : model.booster_.feature_name(),'importance' : model.feature_importances_}).sort_values(by =  ['importance'],ascending = False)
    #计算训练集、测试集、验证集上的KS和AUCy_pred_train_lgb = model.predict_proba(train)[:, 1]y_pred_test_lgb = model.predict_proba(test)[:, 1]train_fpr_lgb, train_tpr_lgb, _ = roc_curve(train_y, y_pred_train_lgb)test_fpr_lgb, test_tpr_lgb, _ = roc_curve(test_y, y_pred_test_lgb)train_ks = abs(train_fpr_lgb - train_tpr_lgb).max()test_ks = abs(test_fpr_lgb - test_tpr_lgb).max()train_auc = metrics.auc(train_fpr_lgb, train_tpr_lgb)test_auc = metrics.auc(test_fpr_lgb, test_tpr_lgb)ks_train_lst.append(train_ks)ks_test_lst.append(test_ks)    feature_lst[str(rk)] = feature[feature.importance>=20].nametrain_ks = np.mean(ks_train_lst)
test_ks = np.mean(ks_test_lst)ft_lst = {}
for i in range(1,6):ft_lst[str(i)] = feature_lst[str(i)]fn_lst=list(set(ft_lst['1']) & set(ft_lst['2']) & set(ft_lst['3']) & set(ft_lst['4']) &set(ft_lst['5']))print('train_ks: ',train_ks)
print('test_ks: ',test_ks)print('ft_lst: ',fn_lst )

  这里的ks值取的是每次交叉验证的ks值的平均值。特征重要性大于20的有4个,是将所有交叉验证过程中特征重要度大于20的特征去重,最后得到4个重要度最高的特征。模型的booster_.feature_name()参数保存特征的名字,feature_importances_保存特征的重要性。
  然后用这4个变量入模,看下模型在跨时间验证集(测试集)上的表现。

lst = ['person_info','finance_info','credit_info','act_info']train = data[data.obs_mth != '2018-11-30'].reset_index().copy()
evl = data[data.obs_mth == '2018-11-30'].reset_index().copy()x = train[lst]
y = train['bad_ind']evl_x =  evl[lst]
evl_y = evl['bad_ind']model,auc = LGB_test(x,y,evl_x,evl_y)y_pred = model.predict_proba(x)[:,1]
fpr_lgb_train,tpr_lgb_train,_ = roc_curve(y,y_pred)
train_ks = abs(fpr_lgb_train - tpr_lgb_train).max()
print('train_ks : ',train_ks)y_pred = model.predict_proba(evl_x)[:,1]
fpr_lgb,tpr_lgb,_ = roc_curve(evl_y,y_pred)
evl_ks = abs(fpr_lgb - tpr_lgb).max()
print('evl_ks : ',evl_ks)from matplotlib import pyplot as plt
plt.plot(fpr_lgb_train,tpr_lgb_train,label = 'train LR')
plt.plot(fpr_lgb,tpr_lgb,label = 'evl LR')
plt.plot([0,1],[0,1],'k--')
plt.xlabel('False positive rate')
plt.ylabel('True positive rate')
plt.title('ROC Curve')
plt.legend(loc = 'best')
plt.show()

最后将概率映射成得分,并生成得分报告。

def score(xbeta):score = 1000-500*(math.log2(1-xbeta)/xbeta)  #好人的概率/坏人的概率return score
evl['xbeta'] = model.predict_proba(evl_x)[:,1]
evl['score'] = evl.apply(lambda x : score(x.xbeta) ,axis=1)
#生成报告
row_num, col_num = 0, 0
bins = 20
Y_predict = evl['score']
Y = evl_y
nrows = Y.shape[0]
lis = [(Y_predict[i], Y[i]) for i in range(nrows)]
ks_lis = sorted(lis, key=lambda x: x[0], reverse=True)
bin_num = int(nrows/bins+1)
bad = sum([1 for (p, y) in ks_lis if y > 0.5])
good = sum([1 for (p, y) in ks_lis if y <= 0.5])
bad_cnt, good_cnt = 0, 0
KS = []
BAD = []
GOOD = []
BAD_CNT = []
GOOD_CNT = []
BAD_PCTG = []
BADRATE = []
dct_report = {}
for j in range(bins):ds = ks_lis[j*bin_num: min((j+1)*bin_num, nrows)]bad1 = sum([1 for (p, y) in ds if y > 0.5])good1 = sum([1 for (p, y) in ds if y <= 0.5])bad_cnt += bad1good_cnt += good1bad_pctg = round(bad_cnt/sum(evl_y),3)badrate = round(bad1/(bad1+good1),3)ks = round(math.fabs((bad_cnt / bad) - (good_cnt / good)),3)KS.append(ks)BAD.append(bad1)GOOD.append(good1)BAD_CNT.append(bad_cnt)GOOD_CNT.append(good_cnt)BAD_PCTG.append(bad_pctg)BADRATE.append(badrate)dct_report['KS'] = KSdct_report['BAD'] = BADdct_report['GOOD'] = GOODdct_report['BAD_CNT'] = BAD_CNTdct_report['GOOD_CNT'] = GOOD_CNTdct_report['BAD_PCTG'] = BAD_PCTGdct_report['BADRATE'] = BADRATE
val_repot = pd.DataFrame(dct_report)

【作者】:Labryant
【原创公众号】:风控猎人
【简介】:某创业公司策略分析师,积极上进,努力提升。乾坤未定,你我都是黑马。
【转载说明】:转载请说明出处,谢谢合作!~

lightgbm简易评分卡制作相关推荐

  1. 数据挖掘:银行评分卡制作——数据分箱、WOE、IV的意义

    在银行评分卡的项目中,通常都会需要把数据分箱,分箱后并不是对数据进行哑变量处理,而是用WOE值去替换,再放入模型中. 学习的过程中会对这些操作有些疑问,比如,数据分箱有什么意义,WOE和IV值是干什么 ...

  2. 银行业评分卡制作——IV、WOE

    参考链接:https://blog.csdn.net/kevin7658/article/details/50780391 1.IV的用途 IV的全称是Information Value,中文意思是信 ...

  3. 使用逻辑回归制作评分卡

    1.什么是评分卡? 在银行借贷场景中,评分卡是一种以分数形式来衡量一个客户的信用风险大小的手段,一般来说,评分卡打出的分数越高,客户的信用越好,风险越小. 2.评分卡怎么使用? 对于需要借贷的个人或者 ...

  4. 【菜菜的sklearn课堂笔记】逻辑回归与评分卡-用逻辑回归制作评分卡-分箱

    视频作者:菜菜TsaiTsai 链接:[技术干货]菜菜的机器学习sklearn[全85集]Python进阶_哔哩哔哩_bilibili 分训练集和测试集 from sklearn.model_sele ...

  5. sklearn实战之逻辑回归与制作评分卡

    sklearn实战系列: (1) sklearn实战之决策树 (2) sklearn实战之随机森林 (3) sklearn实战之数据预处理与特征工程 (4) sklearn实战之降维算法PCA与SVD ...

  6. 案例:用逻辑回归制作评分卡

    文章目录 1. 探索数据与数据预处理 (1)去重 (2)填补缺失值 用平均值来填补家庭成员 用随机森林填补MonthlyIncome字段 (3)描述性统计处理异常值 (4)为什么不统一量纲,也不标准化 ...

  7. ​sklearn专题五:用逻辑回归​制作评分卡

    目录 3.1 导库,获取数据 3.2 探索数据与数据预处理 3.2.1 去除重复值 3.2.2 填补缺失值 3.2.3 描述性统计处理异常值 3.2.4 为什么不统一量纲,也不标准化数据分布? 3.2 ...

  8. 【Python】信用评级项目——个人评分A卡制作

    序言     评分卡模型通常有四个类型:     A 卡, 又称为申请者评级模型,主要应用于相关融资类业务中新客户的主体评级,适用于个人 和机构融资主体.     B 卡,又称为行为评级模型,主要应用 ...

  9. 用逻辑回归制作评分卡

    目录 一.评分卡 二.导库,获取数据 三.探索数据与数据预处理 1.去除重复值 2.填补缺失值 3.描述性统计处理异常值 4.为什么不统一量纲,也不标准化数据分布 5.样本不均衡问题 6.分训练集和测 ...

最新文章

  1. CentOS7 NTP客户端和服务器安装和使用
  2. Verilog 中如何无误使用 generate for?
  3. vue前端 html,Vue.js v-html
  4. [转]自动驾驶基础--路径规划
  5. horizon服务主要模块_OpenStack组件——Horizon Web界面管理服务
  6. grpc,protoc, protoc-gen-go,rust
  7. 系统学习深度学习(三十)--Deep Q-Learning
  8. PHPCURL直接访问JSONRPC服务
  9. sqlserver中where条件加判断
  10. 任务管理平台_“平房区教师培训学分管理平台启用暨任务部署培训会议”
  11. 用glew,glfw实现opengl学习笔记5课纹理(2)
  12. mysql聚簇索引abc_索引优化_MySQL开发教程_IT技术个人博客
  13. 基于LSTM神经网络的负荷预测(Python代码实现)
  14. c2-00支持java_双卡双待 诺基亚C2-00的外观详解
  15. 秦安三中2021高考一成绩查询,喜报!天水一中、三中、五中2019年高考成绩来了!...
  16. KMS验证 错误码ERROR CODE0xC004F074
  17. 普林斯顿算法课Part2第四周作业_Boggle
  18. datanlysis
  19. 23考研计算机:天津理工大学
  20. 使用Cloudflare Workers部署博客

热门文章

  1. tf.data.Dataset 用法
  2. io密集型和cpu密集型java,如何设计CPU密集型与I/O密集型程序
  3. Leetcode 349. 两个数组的交集 (每日一题 20211014)
  4. Albert: A lite bert for self-supervised learning of language representations (Albert)
  5. Leetcode-一篇帖子就够啦
  6. 判断一个数是否是回文数
  7. Tensorflow实现MNIST数据自编码(3)
  8. 文巾解题 26. 删除有序数组中的重复项
  9. Python可视化应用实战-如何制作酷炫的图表?
  10. Linux疑难杂症解决方案100篇(五)-SHELL脚本中case语句的多种使用场景