机器学习预测信贷风险

数据资源

https://gitee.com/pingfanrenbiji/resource/tree/master/%E9%87%91%E8%9E%8D%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E7%AC%AC%E4%B8%89%E7%AB%A0%E7%AC%AC%E4%B8%89%E9%A2%98

导入代码库

import pandas as pd
import numpy as np

导入样本

loan_history=pd.read_excel('loan_history.xlsx')
newuser=pad.read_excel('newuser.xlsx')

查看数据维度(行列量)

loan_history.shape
newuser.shape

(12000, 18)
(3000, 17)

newuser相对loan_history少了sample这个特征

数据集信息探索

loan_history.describe()
比如 target列count是12000
就说明 loan_history 这个表格有12000行数据的target值个数汇总是12000

count、mean、std(标准差)、min、25%、50%、75%都是基于当前指标(特征、自变量)对应的一列数据来计算的

观察数据集字段信息

loan_history.info()

object表示字符串类型的值

分析特征变量

  • 将变量名转换成列表形式 便于后续进行循环操作
var_all = loan_history.columns.tolist()

var_all 这个是样本表全量列名 后续需要由其整理出入模指标(特征、自变量)

sample 上面也说到了 loan_history中有、newuser中没有 所以不将此特征入模

并且这个字段是字符型 为了简化代码 不做定性变量处理 故删除这个指标

uid 是关联字段 也不入模
target 预测指标 因变量 也不入模型
所以将这3个特征变量从全量特征中删除 留下的都是需要入模(进行模型训练)的指标
var_all.remove('sample')
var_all.remove('uid')
var_all.remove('target')

判断各列是否有空值

for col in var_all:
    x=loan_history[col].isnull().sum()
    if x != 0:
       print(col,x)
       
循环遍历var_all这个数组中的所有的入模型特征变量
获取当前变量在这个表格中对应的所有的这列数据
通过isnull()函数判断是否为空 
若为空 则sum() 统计+1
如果未打印出结果则说明此处无空值

建立模型

导入机器学习库

# 导入训练、测试数据集划分类
from sklearn.model_selection import train_test_split
# 导入岭回归包中的逻辑回归类
from sklearn.linear_model import LogisticRegression
# 导入统计包中的f1值、精确率(precision 模型判断正例中有多少实际也为正例的)、召回率(recall 实际正例中有多少被模型判断为正例的),roc曲线、auc面积相关类
from sklearn.metrics import confusion_matrix,f1_score,
precision_score,recall_score,roc_auc_score

分割训练集和测试集

train,test=train_test_split(loan_history,test_size=0.4,random_state=2020)

训练、测试数据分割 
第一个参数是 原数据(贷款历史)
第二个参数是 测试数据所占的比例 一般是30%-40%合适
第三个参数是 随机种子 这是固定的随机种子
即每次分割之后的数据都是一致的

得到:
train是训练数据集
test是测试数据集

对训练和测试集合分别剥离出自变量、因变量

# 得到训练集的所有的自变量数据
X_train=tarin(var_all)
# 得到训练集的因变量数据 即实际是否还款
y_train=train('target')

# 得到测试数据集的所有自变量数据
X_test=test[var_all]
# 得到测试数据集的因变量数据 即实际是否还款
y_test=test['target']

开始模型训练

  • 创建逻辑回归模型实例
model = LogisticRegression()
  • 调用模型训练算法git 传入 训练数据集中的自变量数据、和训练数据集中的因变量数据
lgr=model.fit(X_train,y_train)

模型训练真正想要做的事情:

假如 是这样的数据

小明的各种实际信息(姓名、手机号、借口记录)    结果是否还款

很多人这样的数据就会构成很大的数据集集

把这个数据集进行训练 得出一个公式

这个公式是根据这些数据训练出来的

而预测就是 有了一个新的客户 小红 ,有他的基本信息 但没有贷款记录 

根据他的基本信息 代入这个公式 得出一个结果 即是否贷款给他

测试模型

既然已经训练出来一个模型(公式)了 那么我要验证下这个公式的准确性
根据准确性来判断这个模型是否合理,若不合理 我调整训练参数再进行训练得到新的模型
y_pred = lgr.predict_proba(X_test)[:,1]

调用逻辑回归的预测的函数 将X_test测试数据作为参数 得到每个测试数据和对应的预测结果的概率  预测结果有0,1区分(具体0,1代表什么含义根据业务来定义 比如0表示未还款,1=表示已还款)

比如0.01539811 表示 这个人还款的概率为 0.01539811

设置一个阈值是0.22 那么 0.01539811<0.22 就认为0.01539811这个概率表示不还款 

[:,1]表示筛选数据表的所有行 选择第二列数据 即获取预测结果为已还款的数据

这个是每条测试数据对应的还款的概率 假设设置一个阈值为0.22 即大于表示还款,小于表示不还款 那么第一个 0.0117612<0.22就表示0.0117612为不还款

上面显示进行训练数据的训练得到一个模型
然后让模型去预测测试数据得到一个预测结果
然后再拿着实际的数据和预测数据进行比对 画roc曲线、计算ks、计算auc面积等就是为了验证预测结果和实际结果的差别
from sklearn.metrics import roc_curve,auc

# 计算ks和auc

def ks_perf(actuals,predictions):
    fpr,tpr,threshold = roc_curve(actuals,predictions)
    auc_ = auc(fpr,tpr)
    ks_ = max(tpr-fpr)
    print(auc_,ks_)
    
actuals是实际的是否还款即因变量数据
predictions 是模型预测的是否还款因变量数据

roc曲线
roc曲线

根据fpr和tpr可以计算auc面积( 横轴是fpr纵轴是tpr 曲线(roc曲线)和x轴之间的面积)
ks值
ks值
根据2个数据集可以画roc曲线 得到 fpr(真正例率tpr,假正例率fpr,阈值threshold)

横轴是阈值threshold 纵轴是fpr和tpr 同一个阈值 tpr rate - fpr rate 值即是ks曲线

Ks指标越大 模型的风险区分能力越强


ROC曲线上的每一个点代表一个阈值
ROC曲线坐标系(0,0) 阈值最大
(1,1)阈值最小
从这两张图也可以看得出来

调用这个ks_perf函数 传入测试数据集(实际数据)、模型预测结果集 计算auc和ks值

ROC的值越大越好 取值范围是0.5-1之间

Ks值 0.2-0.3基本可用 ,0.3以上可用

将预测结果放入数据表中

根据上一步的流程来判断模型预测的结果怎么样 看来模型预测效果还不错

那么就把这个预测结果放入数据表中

test['prob'] = y_pred

# 获取指定列的数据
test_oos = test[['uid''prob''target']]
# 生成excel文件
test_oos.to_excel('score_oos.xlsx', index = False)
index=False 不生成表格每行数据最前面的序号列

计算f1

上面是根据测试数据集对应的自变量的还款概率多少来计算ks和auc

这里根据测试数据集对应的因变量 target(实际和预测)来计算f1

因为y_pred这一列数据为测试数据集根据模型预测产生的还款概率数据

那么设置一个阈值 比如0.22 大于该值表示还款 设置为1
小于该值表示不还款设置为0

那么根据y_pred就可以产生一个预测的traget
# 设置一个0.22阈值 来计算f1值 调整阈值大小 目的是为了得到一个最大的f1值
test_oss['target_new'] = test_oos['prob'].map(lambda x: 1 if x > 0.22 else 0)
# 实际因变量和预测的因变量
f1_score(test_oss['target'],test_oss['target_new'])

对推断集进行预测

和上面的过程一致 不就细说了

# 获取推断数据集newuser中的所有的自变量特征数据
x_inference = newuser[var_all]
# 调用逻辑回归的预测函数 获取还款概率
y_inference = lgr.predict_proba(x_inference)[:, 1]
newuser['prob'] = y_inference
result = newuser[['uid''prob']]
# 设置一个阈值 将还款概率转换为0(不还款),1(还款)即二分类问题 
result['pred_label'] = result['prob'].map(lambda x: 1 if x > 0.22 else 0)
result = result[['uid''pred_label']]
result.to_excel('newuser_prob.xlsx', index = False)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值