之前看到使用python实现决策树的文章,找了一批数据样本来实现一遍。
以下为依葫芦画瓢的复盘实现
代码实现
- 数据集来自拍拍贷公开的借款人借款成交特征与还款状态的样本数据
- 目的是根据历史数据来预测还款人是否会逾期
import pandas as pd
import numpy as np #导入两个基础计算包
df=pd.read_csv('LCIS-cleaned.csv') #导入数据源
数据导入完成,来观察一下数据集
df.head() #查看前5行
数据源是预先处理过的,特征值和目标值已经筛选好,可以直接用来分离。
很明显,是否逾期是作为目标值的,剩下的字段作为特征值,通过一个借款用户的特征来判断他会不会逾期(但是实际业务场景中的特征字段会远比图中的字段多)。
X = df.drop('是否逾期',axis=1)
y = df.是否逾期 #提取特征与目标
这个时候就有个问题了,像借款金额这些数值没有问题,但是初始评级借款类型等都是字符,这个时候需要把字符转换为数值。
from sklearn.preprocessing import LabelEncoder
from collections import defaultdict
d = defaultdict(LabelEncoder)
X_trans = X.apply(lambda x: d[x.name].fit_transform(x))
X_trans.head() #映射特征字段,将字符映射为数值;都是单一类型直接映射
来观察一下映射后的特征字段和目标字段
把数据集拆分一下,一部分拿来做训练,一部分拿来检验训练的结果
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_trans, y, random_state=1) #将数据拆分为测试集与训练集
这个时候到了最重要的一步,调出机器学习的决策树;
相当应封装好了算法和模型,只要召唤神龙把数据丢进去就好了。
from sklearn import tree
clf = tree.DecisionTreeClassifier(max_depth=3)
clf = clf.fit(X_train, y_train) #调用机器学习包 决策树模型
调用完毕,下面来验证一下模型
test_rec = X_test.iloc[1,:]
clf.predict([test_rec]) #使用测试集数据验证模型,输入预测结果
预测结果
y_test.iloc[1] #调出真实结果
真实结果,预测值与真实值一致。
来看下整体的预测准确率,0.96
from sklearn.metrics import accuracy_score
accuracy_score(y_test, clf.predict(X_test)) #模型准确率
最简单的决策树模型已经完成了,为了更好理解,用代码把决策树的图画出来(来来来种个树)。
with open("lc-is.dot", 'w') as f:
f = tree.export_graphviz(clf,
out_file=f,
max_depth = 3,
impurity = True,
feature_names = list(X_train),
class_names = ['逾期', '未逾期'],
rounded = True,
filled= True )
from subprocess import check_call
check_call(['dot','-Tpng','lc-is.dot','-o','lc-is.png'])
from IPython.display import Image as PImage
from PIL import Image, ImageDraw, ImageFont
img = Image.open("lc-is.png")
draw = ImageDraw.Draw(img)
img.save('output.png')
PImage("output.png")
实现原理
第一部分粗暴展示了代码实现,那决策树算法是如何工作的呢?
引用周志华老师的西瓜书的一段话
我们要对“这是好瓜吗?”这样的问题进行进行决策时,通常会进行一系列的判断或者“子决策”:我们先看“它是什么颜色?”,如果是“青绿色”,则我们再看“它的根蒂是什么形态?”,如果是“蜷缩”,我们再看“它敲起来是什么声音?”,最后,我们得出决策:这是个好瓜。
决策树方法是人类在面临问题时候一种很自然的处理机制,通过不断的二分决策对属性进行判定,输出最后的分类。
- 数据来源:拍拍贷互金训练营数据集
- 代码环境:Anaconda环境下的Jupyter Notebook
- 参考文章:贷还是不贷:如何用Python和机器学习帮你决策?
我的tableau public:yangliang的tableau public主页