sklearn 决策树_决策树原理以及sklearn中决策树的参数详解

开篇

决策树(Decision Tree)是最流行的机器学习算法之一。决策树可以解决分类(classification)回归分析(Regression)的问题。sklearn中可以仅仅使用几行代码就可以完成决策树的建立。但是,这对于真正想从事机器学习的朋友们是不够的。这一讲,我们就着重来详解一下决策树。

决策树的优势

我们知道机器学习中有很多的模型算法,为什么决策树可以长盛不衰?它到底有什么优势?这是我们学习决策树的基础。

4867c26c363b564ebefd4f487fe4531e.png

决策树

一起先来看一个决策树的实例。决策树的逻辑更加接近于人类判断的逻辑。比较好理解。逻辑树模型的判断逻辑非常清晰,且可视化,如上图。在判断泰坦尼克号上幸存人员的时候,通过决策树应该怎么做呢?

首先,我们判断性别是否是男性:是(Yes)或者否(No);

如果是男性,判断年龄是否大于9.5;

如果是女性,则此人是存活(Survived)。。。

决策树每一个判断都是一个问题,而答案的不同则会长出不同的树枝。我们可以看出决策树整个的逻辑非常的清晰和简单。

什么是决策树?

数据挖掘和机器学习中的决策树训练,使用决策树作为预测模型来预测样本的类标。这种决策树也称作分类树回归树。在这些树的结构里, 叶子节点给出类标而内部节点代表某个属性。

在决策分析中,一棵决策树可以明确地表达决策的过程。在数据挖掘中,一棵决策树表达的是数据而不是决策。本页的决策树是数据挖掘中的决策树。 -----维基百科

b828c427feb619b27fc88eae6f7c7c1e.png

数据

假设我们拿到的数据如上,第一步是分析数据的特征变量(Feature)有哪些?上图中,特征变量就有 天气(outlook)、温度(temp.)、湿度(humidity)、有风(windy)和是否出游(play)。

从决策树中,所有的判断都是从决策树的根部节点开始,慢慢的一步一步的生出中间的过渡节点,最后长出叶子(leaf node)并形成判断并且可以用来预测。

那问题来了,每个节点都对应一个特征变量,那我们该怎么选择最重要的特征变量作为根节点呢?

创建决策树

现在有很多办法筛选特征变量,但是最常用的两种方法是:CART(Classification and Regression Trees) 和 ID3 (Iterative Dichotomiser 3)。CART方法是以Gini 指数为基准,而ID3是以熵变函数作为基准。

具体的公式可以直接参看维基百科:

fe73157788d45d2b9fcbb93b4f135992.png

CART方法

c65ddfc26d0170acd5a2de914e69be6c.png

ID3方法

公式是需要例子去消化并记忆的。下面,我们一起来通过这两种方法筛选出最重要的特征变量吧。

使用ID3方法:

在ID3方法中,我们需要计算每个特征变量的熵。下面就是公式。

b3bfe4c30579126c649bdf6f8695ed51.png

分别计算每一个特征变量的熵,我们拿有风与否(windy)举例:

首先,我们要算一下play(yes或者no)的总熵:

在14行数据中,有9行数据play显示为yes,另外5行play显示为no

那么,

E(yes) = -(9/14) * ln(9/14) = 0.41

E(no) = -(5/14) * ln(5/14) = 0.53

H(S) = E(yes) + E(no) = 0.41 + 0.53 = 0.94

0cfb3261a7f348d1ad78177af85eabe8.png

当windy是false的时候,有6行数据显示play为yes,还有2行数据显示play为no。

当windy是true的时候,有3行数据显示play为yes,还有3行数据显示play为no。

E(windy = false) = -6/8 * log(6/8) - 2/8 * log(2/8) = 0.811

E(windy = true) = -3/6 * log(3/6) - 3/6 * log(3/6) = 1

总共有14行数据,那么,当选择windy的时候,熵的平均值使用加权平均数即可得:

I(windy)= 8/14 * 0.811 + 6/14 * 1 = 0.892

我们得到了H(S)和信息值 I(windy),那么选择windy带来的信息增益是多少呢?

Gain(windy) = H(S) - I(windy) = 0.94 - 0.892 = 0.048

我们需要计算所有特征变量的 信息增益,从中选取信息增益最大的 特征变量,则是根节点。当我们之后选择过渡节点的时候,同样重复上述过程即可。

最后的决策树如下图所示:

472eade6c17a741176f1c3e1ec3e372c.png

决策树

CART方法

同样的,我们拿windy作为示范:

当windy是false的时候,有6行数据显示play为yes,还有2行数据显示play为no。

p(windy-false,play-yes)= 6/8

p(windy-false,play-no)= 2/8

Gini(windy-false) = 1 - p(windy-false,play-yes)^2 - p(windy-false,play-no)^2

= 1 - (6/8)^2 - (2/8)^2 = 3/5

当windy是true的时候,有3行数据显示play为yes,还有3行数据显示play为no。

p(windy-true,play-yes)= 3/6

p(windy-true,play-no)= 3/6

Gini(windy-true) = 1 - p(windy-true,play-yes)^2 - p(windy-true,play-no)^2

= 1 - (3/6)^2 - (3/6)^2 = 1/2

那么,当选择windy时,平均Gini值为:

Gini(windy)= 8/14 * 3/5 + 6/14 * 1/2 = 0.557

Gini值与之前算的信息增益有所不同,Gini值越小,证明模型越好。

python 机器学习包Sklearn中如何实现决策树

7de704cc4caea223373113f88fb04d20.png

sklearn

sklearn中引入tree模块,通过tree.DecisionTreeClassifier() 就可以创建一个决策树。

clf = clf.fit(X_train, Y_train) 通过fit函数就可以实现决策树模型的训练了。

然而在决策树中,可以定义很多参数。如上图所示。我们一个一个的过一遍这些参数。

  • criterion: string类型,可选(默认为"gini"):衡量分类的质量。支持的标准有"gini"代表的是Gini impurity(不纯度)与"entropy"代表的是information gain(信息增益)。
  • splitter: string类型,可选(默认为"best"):在节点中选择分类的策略。支持的策略有"best",选择最好的分类,"random"选择最好的随机分类。
  • max_features: int,float,string or None 可选(默认为None)在进行分类时需要考虑的特征数。1.如果是int,在每次分类是都要考虑max_features个特征。2.如果是float,那么max_fea
  • max_depth: int or None,可选(默认为"None")表示树的最大深度。如果是"None
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值