-
本文分为两大部分第一部分简单举例讲述决策树算法的原理概念
-
第二部分基于决策树用案例实现贷款是否逾期预测
决策树算法是机器学习经典算法之一,原理相对简单易懂。首先决策树毕竟是帮助做出更好的决策的一种算法,决策树ID3根据信息增益的大小作为结点进行分支,拿最经典的西瓜书里判断是否好瓜来举例子,有十七课西瓜各有各的特征,但是我们第一思维是:好瓜毕竟有某种一致的属性,相同不好的西瓜也有它自己独特的特征,就根据这两种特征来判断瓜的品质,这就需要用决策树的算法来学到这样的一个规律从而在给定的一个新瓜中判断瓜的品质。
一:原理计算:
首先算出样本的信息熵,样本结果有两种可能分别是 “是”占了8/17与“否”占了9/17,如下图公示累加求和求相反数。
得到信息熵的大小为0.998,然后计算各个属性的信息增益,以西瓜的色泽举例分析,色泽{青绿,浅白,乌黑}其中好瓜站样本属性分别为:3/6,4/6,1/5坏瓜样本占属性样本比例分别是3/6,2/6,4/5。则根据信息熵公式(4.1)得到:
然后根据公式计算出色泽的信息增益:
同理其他属性的信息增益如下:
计算可得信息增益最大的作为第一层属性节点,所以选择纹理作为第一层信息节点。
接下来就要挨个计算在清晰,模糊,稍微的条件下计算根蒂,纹理,敲声,脐部,触感的薪资增益,信息增益大的作为此节点下的第一个节点,之后一次类推。这篇文章有具体的推理步骤。
参考:https://blog.csdn.net/quinn1994/article/details/80083933
最后分完的结果就是这个亚子了
二:接下来就用决策树算法来实现贷款是否逾期的预测
拍拍贷数据https://pan.baidu.com/s/1vrzcm_geXOGiEE_nWHCO7Q提取码:d12a
数据格式
LC.csv 数据大小:50.7MB,标的特征表,每支标一条记录。共有21个字段,包括一个主键(listingid)、7个标的特征和13个成交当时的借款人信息,全部为成交当时可以获得的信息。
ListingId | 列表成交特征 | 列表序号,为列表的唯一键。 |
借款金额 | 列表成交特征 | 列表成交总金额。 |
借款期限 | 列表成交特征 | 总的期数(按月计)。 |
借款利率 | 列表成交特征 | 年化利率(百分数)。 |
借款成功日期 | 列表成交特征 | 列表成交的日期。都在2015年1月1日以后。 |
初始评级 | 列表成交特征 | 列表成交时的信用评级。AAA为安全标,AA为赔标,A-F为信用等级。 |
借款类型 | 列表成交特征 | 分为'应收安全标',‘电商’,‘APP闪电’,‘普通’和‘其他’。 |
是否首标 | 列表成交特征 | 该标是否为借款人首标。 |
年龄 | 列表成交特征 | 借款人在该列表借款成功时的年龄。 |
性别 | 列表成交特征 | 该列表借款人性别。 |
手机认证 | 列表成交特征 | 该列表借款人手机实名认证是否成功。 |
户口认证 | 列表成交特征 | 该列表借款人户口认证是否成功。 |
视频认证 | 列表成交特征 | 该列表借款人视频认证是否成功。 |
学历认证 | 列表成交特征 | 该列表借款人学历认证是否成功。成功则表示有大专及以上学历。 |
征信认证 | 列表成交特征 | 该列表借款人征信认证是否成功。成功则表示有人行征信报告。 |
淘宝认证 | 列表成交特征 | 该列表借款人淘宝认证是否成功。成功则表示为淘宝店主。 |
历史成功借款次数 | 列表成交特征 | 借款人在该列表成交之前的借款成功次数。 |
历史成功借款金额 | 列表成交特征 | 借款人在该列表成交之前的借款成功金额。 |
总待还本金 | 列表成交特征 | 借款人在该列表成交之前待还本金金额。 |
历史正常还款期数 | 列表成交特征 | 借款人在该列表成交之前的按期还款期数。 |
历史逾期还款期数 | 列表成交特征 | 借款人在该列表成交之前的逾期还款期数。 |
LP (Loan Periodic) 标的还款计划和还款记录表:标的还款计划和还款记录,每支标每期还款为一条记录。 还款记录和状态更新至2017年2月22日。共有10个字段,包括两个主键(listingid和期数),3个还款计划字段和4个还款状态字段
listingid | 列表Id,主键 |
期数 | 期数Id,主键 |
还款状态 | 到记录日的当期状态,分为0-‘未还款’,1-‘已正常还款’,2-‘已逾期还款’,3-‘已提前还清该标全部欠款’,4-‘已部分还款’ |
应还本金 | 当期计划还款本金部分 |
应还利息 | 当期计划还款利息部分 |
剩余本金 | 到记录日,仍未还清的当期本金 |
剩余利息 | 到记录日,仍未还清的当期利息 |
到期日期 | 当期应还款日 |
还款日期 | 当期最近一次实际还款日期 |
recorddate | 记录日 |
数据探索分析:
两个表都有列表id,因此将两个表按照列表id进行融合,融合之后去掉无关特征,在这里我把到期日期,还款日期,recordate,借款日期删除掉了,因为还款状态已经可以作为标签了,到期日期与还款日期用处已经不大。再检查一下是否存在空值然后把表格里的文字转化成数字。其中不需要的字段我是在exce里手动删掉的。
# 数据融合
import pandas as pd
df1 = pd.read_csv('D:/word/拍怕贷/LC.csv')
df2 = pd.read_csv('D:/word/拍怕贷/LP.csv')
merage_df = pd.merge(df1, df2, how="left", on="ListingId")
merage_df.to_csv("PPD.csv")
df = pd.read_csv("PPD.csv",encoding="gbk")
# 数据转化
df = pd.read_csv("PPD.csv", encoding="utf-8")
df = df.drop(["借款成功日期", "到期日期", "还款日期", "recorddate"], axis=1)
LE = LabelEncoder()
df.loc[:, "初始评级":"是否首标"] = df.loc[:, "初始评级":"是否首标"].apply(lambda x: LE.fit_transform(x))
df.loc[:, "性别":"淘宝认证"] = df.loc[:, "性别":"淘宝认证"].apply(lambda x: LE.fit_transform(x))
df.to_csv("NEWPPD.csv")
数据转化这一块比较简单,使用sklearn的LabelEncoder方法可以将文本转化为数据,有几种类型的数据就转化为几种连续性数据。可以对其进行批量转化,利用dataframe的apply方法。但是除了文本之外其他的数据就不用变化,不用进行编码。
套入模型数据预测:
数据已经准备好,那接下来就是进行训练模型预测数据了。首先划分数据集,把dataframe格式 的数据转化为数据矩阵。
from sklearn.tree import DecisionTreeClassifier as DTC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
df3 = pd.read_csv("final_PPD.csv")
feature = df3.loc[:,1:-1].values
give_money = df3.loc[:,-1].values.reshape(-1,1)
train_x,test_x,train_y,test_y = train_test_split(feature,give_money,test_size=0.3)
dt = DTC(criterion="entropy")
dt.fit(train_x,train_y)
result = dt.predict(test_x)
print("准确率:"+str(accuracy_score(test_y,result)))
print("真实结果:")
print(test_y[:20])
print("测试结果:")
print(result[:20])
最后的预测准确率0.83,后期我还会再对数据特征进行优化以得到更好的结果
调试参数换用基尼系数,并对决策树进行剪枝达到最优。
dt = DTC(criterion="gini",
max_depth=16,
random_state=30
# min_samples_leaf=15
# min_samples_split=10
)
调整树的最大深度之后预测的准确率有所上升从原来的0.83上升到0.86,我通过调试发现对于此数据集使用基尼系数还是信息熵预测结果都差不多,但是存在过拟合现象需要剪枝。