耳闻目击了机器学习的诸般神奇,有没有冲动打算本身尝试一下?本文咱们经过一个贷款风险评估的案例,用最通俗的语言向你介绍机器学习的基础招式,一步步帮助你用Python完成本身的第一个机器学习项目。试过以后你会发现,机器学习真的不难。python
祝贺你,成功进入了一家金融公司实习。git
第一天上班,你还处在兴奋中。这时主管把你叫过去,给你看了一个文件。github
文件内容是这个样子的:算法
主管说这是公司宝贵的数据资产。嘱咐你认真阅读,而且从数字中找出规律,以便作出明智的贷款决策。安全
每一行数据,都表明了以前的一次贷款信息。你琢磨了好久,终于弄明白了每一列究竟表明什么意思:微信
sub_grade
: 贷款细分级别short_emp
:一年之内短时间雇佣emp_length_num
:受雇年限home_ownership
:居住状态(自有,按揭,租住)last_delinq_none
:贷款申请人是否有不良记录last_major_derog_none
:贷款申请人是否有还款逾期90天以上记录revol_util
:透支额度占信用比例total_rec_late_fee
:逾期罚款总额safe_loans
:贷款是否安全最后一列,记录了这笔贷款是否定期收回。拿着之前的这些宝贵经验教训,主管但愿你可以总结出贷款是否安全的规律。在面对新的贷款申请时,从容和正确应对。app
主管让你找的这种规律,能够用决策树来表达。框架
咱们来讲说什么是决策树。dom
决策树长得就像这个样子:机器学习
作决策的时候,你须要从最上面的节点出发。在每个分支上,都有一个判断条件。知足条件,往左走;不知足,向右走。一旦走到了树的边缘,一项决策就完成了。
例如你走在街上,碰见邻居老张。你热情地打招呼:
“老张,吃了吗?”
好了,这里就是个分支。老张的回答,将决定你的决策走向,即后面你将说什么。
第一种状况。
老张:吃过了。
你:要不来我家再吃点儿?
第二种状况。
老张:还没吃。
你:那赶忙回家吃去吧。再见!
……
具体到贷款这个实例,你须要依次分析申请人的各项指标,而后断定这个贷款申请是否安全,以作出是否贷款给他的决策。把这个流程写下来,就是一棵决策树。
做为一名金融界新兵,你本来也是抱着积极开放的心态,但愿多尝试一下的。可是当你把数据表下拉到最后一行的时候,你发现记录竟然有46509条!
你估算了一下本身的阅读速度、耐心和认知负荷能力,以为这个任务属于Mission Impossible(不可能完成),因而开始默默地收拾东西,打算找主管道个别,辞职不干了。
且慢,你没必要如此沮丧。由于科技的发展,已经把一项黑魔法放在了你的手边,随时供你取用。它的名字,叫作机器学习。
什么叫机器学习?
从前,人是“操做”计算机的。一项任务如何完成,人内心是彻底有数的。人把一条条指令下达给电脑,电脑负责傻呵呵地干完,收工。
后来人们发现,对有些任务,人根本就不知道该怎么办。
前些日子的新闻里,你知道Alpha Go和柯洁下围棋。柯洁不只输了棋,还哭了。
但是制造Alpha Go的那帮人,当真知道怎样下棋,才能赢过柯洁吗?你就是让他们放弃体育家精神,攒鸡毛凑掸子一块儿上,跟柯洁下棋……你估计哭的是谁?
一帮连本身下棋,都下不赢柯洁的人,又是如何制做出电脑软件,打败了人类围棋界的“最强大脑”呢?
答案正是机器学习。
你本身都不知道如何完成的任务,天然也不可能告诉机器“第一步这么干,第二步那么办”,或者“若是出现A状况,打开第一个锦囊;若是出现B状况,打开第二个锦囊”。
机器学习的关键,不在于人类的经验和智慧,而在于数据。
本文咱们接触到的,是最为基础的监督式学习(supervised learning)。监督式学习利用的数据,是机器最喜欢的。这些数据的特色,是都被打了标记。
主管给你的这个贷款记录数据集,就是打了标记的。针对每一个贷款案例,后面都有“是否安全”的标记。1表明了安全,-1表明了不安全。
机器看到一条数据,又看到了数据上的标记,因而有了一个假设。
而后你再让它看一条数据,它就会强化或者修改原先的假设。
这就是学习的过程:创建假设——收到反馈——修正假设。在这个过程当中,机器经过迭代,不断刷新本身的认知。
这让我想起了经典相声段子“蛤蟆鼓”里面的对话片断。
甲:那我问问你,蛤蟆你看见过吧?
乙:谁没见过蛤蟆呀。
甲:你说为何它那么小的动物,叫唤出来的声音会那么大呢?
乙:那是由于它嘴大肚儿大脖子粗,叫唤出来的声音必然大。万物都是一个理。
甲:我家的字纸篓子也是嘴大脖子粗,为何它不叫唤哪?
乙:字纸篓是死物,那是竹子编的,不但不叫,连响都响不了。
甲:吹的笙也是竹子的,怎么响呢?
乙:虽然竹子编的,由于它有窟窿有眼儿,有眼儿的就响。
甲:我家筛米的筛子满是窟窿眼儿,怎么吹不响?
这里相声演员乙,就一直试图创建能够推广的假设。惋惜,甲老是用新的例证摧毁乙的三观。
在四处碰壁后,可怜的机器跌跌撞撞地成长。看了许许多多的数据后,电脑逐渐有了本身对一些事情判断的想法。咱们把这种想法叫作模型。
以后,你就能够用模型去辅助本身作出明智的判断了。
下面咱们开始动手实践。用Python作个决策树出来,辅助咱们判断贷款风险。
使用Python和相关软件包,你须要先安装Anaconda套装。详细的流程步骤请参考《 如何用Python作词云 》一文。
主管给你展现的这份贷款数据文件,请从 这里 下载。
文件的扩展名是csv,你能够用Excel打开,看看是否下载正确。
若是一切正常,请把它移动到我们的工做目录demo里面。
到你的系统“终端”(macOS, Linux)或者“命令提示符”(Windows)下,进入咱们的工做目录demo,执行如下命令。
pip install -U PIL
复制代码
运行环境配置完毕。
在终端或者命令提示符下键入:
jupyter notebook
复制代码
Jupyter Notebook已经正确运行。下面咱们就能够正式编写代码了。
首先,咱们新建一个Python 2笔记本,起名叫作loans-tree。
为了让Python可以高效率处理表格数据,咱们使用一个很是优秀的数据处理框架Pandas。
import pandas as pd
复制代码
而后咱们把loans.csv里面的内容所有读取出来,存入到一个叫作df的变量里面。
df = pd.read_csv('loans.csv')
复制代码
咱们看看df这个数据框的前几行,以确认数据读取无误。
df.head()
复制代码
由于表格列数较多,屏幕上显示不完整,咱们向右拖动表格,看表格最右边几列是否也正确读取。
经验证,数据全部列都已读入。
统计一下总行数,看是否是全部行也都完整读取进来了。
df.shape
复制代码
运行结果以下:
(46508, 13)
复制代码
行列数量都正确,数据读取无误。
你应该还记得吧,每一条数据的最后一列safe_loans
是个标记,告诉咱们以前发放的这笔贷款是否安全。咱们把这种标记叫作目标(target),把前面的全部列叫作“特征”(features)。这些术语你如今记不住不要紧,由于之后会反复遇到。天然就会强化记忆。
下面咱们就分别把特征和目标提取出来。依照机器学习领域的习惯,咱们把特征叫作X,目标叫作y。
X = df.drop('safe_loans', axis=1)
y = df.safe_loans
复制代码
咱们看一下特征数据X的形状:
X.shape
复制代码
运行结果为:
(46508, 12)
复制代码
除了最后一列,其余行列都在。符合咱们的预期。咱们再看看“目标”列。
y.shape
复制代码
执行后显示以下结果:
(46508,)
复制代码
这里的逗号后面没有数字,指的是只有1列。
咱们来看看X的前几列。
X.head()
复制代码
运行结果为:
注意这里有一个问题。Python下作决策树的时候,每个特征都应该是数值(整型或者实数)类型的。可是咱们一眼就能够看出,grade, sub_grade
, home_ownership
等列的取值都是类别(categorical)型。因此,必须通过一步转换,把这些类别都映射成为某个数值,才能进行下面的步骤。
那咱们就开始映射吧:
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()
复制代码
运行结果是这样的:
这里,咱们使用了LabelEncoder函数,成功地把类别变成了数值。小测验:在grade列下面,B被映射成了什么数字?
请对比两个表格,思考10秒钟。
答案是1。你答对了吗?
下面咱们须要作的事情,是把数据分红两部分,分别叫作训练集和测试集。
为何这么折腾?
由于有道理。
想一想看,若是期末考试以前,老师给你一套试题和答案,你把它背了下来。而后考试的时候,只是从那套试题里面抽取一部分考。你凭借超人的记忆力得到了100分。请问你学会了这门课的知识了吗?不知道若是给你新的题目,你会不会作呢?答案仍是不知道。
因此考试题目须要和复习题目有区别。一样的道理,咱们用数据生成了决策树,这棵决策树确定对已见过的数据处理得很完美。但是它可否推广到新的数据上呢?这才是咱们真正关心的。就如同在本例中,你的公司关心的,不是之前的贷款该不应贷。而是如何处理从此遇到的新贷款申请。
把数据随机拆分红训练集和测试集,在Python里只须要2条语句就够了。
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)
复制代码
咱们看看训练数据集的形状:
X_train.shape
复制代码
运行结果以下:
(34881, 12)
复制代码
测试集呢?
X_test.shape
复制代码
这是运行结果:
(11627, 12)
复制代码
至此,一切数据准备工做都已就绪。咱们开始呼唤Python中的scikit-learn软件包。决策树的模型,已经集成在内。只须要3条语句,直接调用就能够,很是方便。
from sklearn import tree
clf = tree.DecisionTreeClassifier(max_depth=3)
clf = clf.fit(X_train, y_train)
复制代码
好了,你要的决策树已经生成完了。
就是这么简单。任性吧?
但是,我怎么知道生成的决策树是个什么样子呢?眼见才为实!
这个……好吧,我们把决策树画出来吧。注意这一段语句内容较多。之后有机会我们再详细介绍。此处你把它直接抄进去执行就能够了。
with open("safe-loans.dot", 'w') as f:
f = tree.export_graphviz(clf,
out_file=f,
max_depth = 3,
impurity = True,
feature_names = list(X_train),
class_names = ['not safe', 'safe'],
rounded = True,
filled= True )
from subprocess import check_call
check_call(['dot','-Tpng','safe-loans.dot','-o','safe-loans.png'])
from IPython.display import Image as PImage
from PIL import Image, ImageDraw, ImageFont
img = Image.open("safe-loans.png")
draw = ImageDraw.Draw(img)
img.save('output.png')
PImage("output.png")
复制代码
见证奇迹的时刻到了:
你是否是跟我第一次看到决策树的可视化结果同样,惊诧了?
咱们其实只让Python生成了一棵简单的决策树(深度仅3层),可是Python已经尽职尽责地帮咱们考虑到了各类变量对最终决策结果的影响。
欣喜若狂的你,在悄悄背诵什么?你说想把这棵决策树的判断条件背下来,而后去作贷款风险判断?
省省吧。都什么时代了,还这么喜欢背诵?
之后的决策,电脑能够自动化帮你完成了。
你不信?
咱们随便从测试集里面找一条数据出来。让电脑用决策树帮咱们判断一下看看。
test_rec = X_test.iloc[1,:]
clf.predict([test_rec])
复制代码
电脑告诉咱们,它调查后风险结果是这样的:
array([1])
复制代码
以前提到过,1表明这笔贷款是安全的。实际状况如何呢?咱们来验证一下。从测试集目标里面取出对应的标记:
y_test.iloc[1]
复制代码
结果是:
1
复制代码
经验证,电脑经过决策树对这个新见到的贷款申请风险判断无误。
可是咱们不能用孤证来讲明问题。下面咱们验证一下,根据训练得来的决策树模型,贷款风险类别判断准确率究竟有多高。
from sklearn.metrics import accuracy_score
accuracy_score(y_test, clf.predict(X_test))
复制代码
虽然测试集有近万条数据,可是电脑当即就算完了:
0.61615205986066912
复制代码
你可能会有些失望——忙活了半天,怎么才60%多的准确率?刚及格而已嘛。
不要灰心。由于在整个儿的机器学习过程当中,你用的都是缺省值,根本就没有来得及作一个重要的工做——优化。
想一想看,你买一台新手机,本身还得设置半天,不是吗?面对公司的贷款业务,你用的居然只是没有优化的缺省模型。可即使这样,准确率也已经超过了及格线。
关于优化的问题,之后有机会我们详细展开来聊。
你终于摆脱了实习第一天就灰溜溜逃走的厄运。我仿佛看到了一颗将来的华尔街新星正在冉冉升起。
苟富贵,无相忘哦。
贷款风险判断以外,你以为决策树还有哪些用武之地?除了本文提到的决策树,你还知道哪几种用于分类的机器学习算法?欢迎留言分享给你们,咱们一块儿交流讨论。
喜欢请点赞。还能够微信关注和置顶个人公众号“玉树芝兰”(nkwangshuyi)。
若是你对数据科学感兴趣,不妨阅读个人系列教程索引贴《如何高效入门数据科学?》,里面还有更多的有趣问题及解法。