我们正式进入了机器学习的模型的部分,虽然如今最火的的机器学习方面的库是Tensorflow, 可是这里仍是先简单介绍一下另外一个数据处理方面很火的库叫作sklearn。其实我们在前面已经介绍了一点点sklearn,主要是在categorical data encoding那一块。其实sklearn在数据建模方面也是很是666的。通常经常使用的模型均可以用sklearn来作的。既然它都这么牛逼了,我们为啥还要学TensorFlow呢?其实主要的缘由有两个,一是由于Google在流量方面的强势推广,致使绝大部分的机器学习方面的应用都是用TensorFlow, 二是由于TensorFlow包括的经常使用库确实要更加多一点。因此致使如今TensorFlow直接火到爆。因此sklearn在模型方面的应用,我们只在决策树这里讲一下,都免绝大部分的模型仍是用TensorFlow来解释,毕竟它的市场更加大嘛。这里没有啥好坏之分的,他们的API都写的很清楚,不管选什么框架,你们本身起看看文档均可以的。这节内容主要分两部分,第一部分介绍决策树在sklearn中的应用,第二部分做为补充内容介绍决策树的原理(决策树的构建原理)。node
决策树其实很简单,就是将一条数据中的每个feature做为一个node,而后根据不一样的条件分红不一样的分支branch,每个branch还有一个node,这个node可能仍是feature也多是leave(target)。具体一个决策树种有多少个node,有多少个leaves,我们后面再说,这设计到了不少几率和信息熵方面的知识。我们如今只须要知道一个大体的概念就是,决策树中的node是我们的feature,leaves是我们的target,branch是我们的split conditions 就好了,具体其中的细节我们暂时不须要了解,我们这里的重点是如何用sklearn这个框架搭建出我们的决策树模型。我们这里先直接用一个代码示例来展现,而后再来解释他的过程。api
from sklearn.tree import DecisionTreeRegressor #1.Define melb_model = DecisionTreeRegressor() #2. fit melb_model.fit(X,y) #3. predict melb_house_prediction = melb_model.predict(X) #4.Mean Absolute Error (MAE) from sklearn.metrics import mean_absolute_error mean_absolute_error(y,melb_house_prediction)
上面是一个最简单的用sklearn建模一个decision tree的实例了,其总共包括:实例化决策树,训练决策树,预测,和验证四个步骤。固然在实际中会有不少的细节部分须要处理,例如第一步实例化的过程有可能会有不少的参数须要调整,如max_depth, min_sample_split等等这些参数,这些都须要根据我们后面的模型表现来不断的调整; 其次在验证阶段也是的,我们得把我们的数据集分割成training dataset和validation dataset, 这里面也包括了不少技术来分割和random的;具体这些细节,我们在后面遇到了再说哈。对于绝大部分的决策树模型,我们均可以用上面的4个步骤来建立。既然说到这里了,咱如今也就简单的数据分割的api也给你们展现一下。框架
from sklearn.model_selection import train_test_split train_X, validate_X, train_y, validate_y = train_test_split(X,y,random_state=0)
上面是一个最简单的数据分割代码,默认是将(X,y)按照80%,20%比例分割,分别用于training和validation;固然啦,这里的分割比例也能够自行经过train_test_split函数的参数进行调节。random_state是当作random generator的seed,是将数据打乱后在分割。既然如何用sklearn建模决策树的内容讲了,我们也顺带把random forest 随机森林模型在sklearn中如何建模的内容也说了把,毕竟random forest是基于decision tree的,并且random forest建模过程跟decision tree几乎是如出一辙的,见下面代码展现如何建立random forest的,dom
from sklearn.model_selection import train_test_split train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 1) from sklearn.ensemble import RandomForestRegressor #define melb_model = RandomForestRegressor(random_state=1) #training melb_model.fit(train_X,train_y) #prediction predictions = melb_model.predict(val_X) #validation from sklearn.metrics import mean_absolute_error mae = mean_absolute_error(val_y, predictions)
在解释上面的代码以前,我们先来讲说什么是random forest。你们想想,既然前面我们建立了一颗决策树,那我们就天然而然的能够建造许多的决策树而后就能够建立一个森林啦,就叫作随机森林。用random forest预测的时候,我们就把test data放进这个随机森林的每一颗树里面去预测,最后我们取预测的平均值。就是怎么简单so easy。我们如今就理解到这个程度就够了,实际的底层的建立原理,等我们把decision tree的建立原理弄懂了之后你们就知道了。我们看上面的代码,它跟decision tree只有几个小区别,第一个就是random forest是一个ensemble,至关于把许多小decision tree模型打包成了一个ensemble;第二个就是他的实例化名称是RandomForestRegressor。其余都差很少,你们在这里不须要死记硬背这些代码,关键要了解这里面的每一步有什么做用,为何须要这些步骤就好了。再一个就是必定得对decision tree和random forest的结构从上层有一个大体的了解,对于他们的底层细节结构,我们能够看看下面的一部分。机器学习
因为在博客中画图不方便,我特意花了一张解释decision tree建立原理的一张图,而后这部份内容主要是围绕着这张图做为一个解释。这里面还涉及到一些数学计算和几率的一些内容。因此这幅图的信息量仍是蛮大的。其实说白了,这里讲决策树的建立原理实际上就是解释如何每一步从n个features中选择一个特色的feature做为node,具体是根据一个什么指标来选择feature做为node的。好了废话很少说,直接上图啦函数
先来解释一下一个简单的概念,就是entropy, 中文我们能够称做是信息熵。它是一种衡量信息量的值,具体这个值是怎么的计算的我们能够看上面的图片,我上面的图片还配备了一个简单的数字实例给演示。在正式解释以前我们先来问一问我们本身一个最基本的问题,那就是decision tree究竟是来干什么的???decision tree最本质的功能是根据feature的条件来最终分离出不一样的信息(这里的信息我们能够理解为target)。于是这里信息熵我们能够理解为这一组数据能够被分辨(分离的)能力,信息熵越小,越容易被分辨,信息熵越大(1),就越难被分辨出来。Information Gain是父节点的信息熵跟他子节点信息熵之差, I(A)的值越大,则说明从这个节点获取的信息就越大,那么就选这个获取信息量越大的feature。这个过程就是决策树中选择feature的方法。若是上面的理解了,我们也就瓜熟蒂落的理解了是如何构建decision tree和random forest的了,他们之间还有一个小区别是,decision tree每个都要算每个feature的Information Gain而后才来选择Information Gain最大的那个feature;而random forest建立它的每一颗tree的过程则是每一步都是随机选几个features来就算Information Gain,而后选最大的,从而确保了tree的多样性。学习