机器学习之决策树

课程链接: 学堂在线-张敏老师机器学习算法训练营

一、决策树是什么?

针对于解决离散,无序的非数值特征的分类问题

树的结构如下图,主要由几个特征组成:

  1. 圆框称之为非叶节点(属性eg:outlook,humidity)
  2. 箭头称之为特征(sunny,rain,overcast)
  3. 方框称之为叶节点(标签,也有可能存在多种标签共存)

其中某树的构造的一种实现办法为:
{属性A:{特征1:{下一层嵌套属性B字典或者标签},特征2:{下一层嵌套字典或者标签}}}

二、核心算法

2.1 主要过程

树的结构一般都是由递归算法实现的,主要的算法由以下五部分组成:

  1. 比较属性里最好的属性,作为分类属性
  2. 属性A作为节点
  3. 对A属性里的每一个值都进行再分类
  4. 递归步骤123
  5. 直到找到对应的标签

对于上列的步骤,难点在于步骤1和步骤5,那么下面我就对1和5进行解释

2.1.1如何挑选当前分类的属性

我们需要选择分类的节点需要有两个特征:

  1. 表达的信息多(尽可能的在下次分类时更"纯")
  2. 节点尽可能的少

因此我们在这里引入了混杂度的概念:用于评价信息的不确定性,主要由三个指标评价:

1 信息熵(entropy),这个概念比较重要,后期的大部分分类问题的loss函数利用的都是交叉熵的概念,这个后续会详解,在这记住熵的基本公式就可以了:
在这里插入图片描述这里我们可以看出P越大,熵越小,说明得到的信息就越少。即概率越小的事件带来的信息量越多,而正态分布具有最大的熵值,另外我们定义p = 0 的时候 对应的熵也为0

2 Gini混杂度&错分类混杂度,这两个在n均分类的时候值想等,所以就只给出了gini的计算式子,
最大的gini混杂度在n分类问题均分时最大 = 最大错分类的混杂度:
在这里插入图片描述

代码如下(示例):

通过上面混杂度的定义,我们就可以算出各个属性的对应的混杂度,之后我们只要找到下一个节点中能让信息增益最大的分类属性,就可以作为其分类的属性了。
代码里计算的是:原始的S - 经过属性A分类后的熵Sa
但是原始的熵对于每一个属性都是定值,所以只要属性分类后的熵值最小值就是下一个分类的属性了。

### 2.1.2何时截止分裂
1. 当剩下的标签分无可分的时候,即所有的标签都是一类
2. 剩下的数据中拥有完全相同的特征,但标签却不全相同--- 这个时候应该考虑bias 和 是否漏了某些feature未考虑
3. 剩下的属性信息增益都是0 --- 随机选一种

## 2.2 过拟合问题
**过拟合:** 指的是在training set表现的很好loss较低,但是在testing set上表现的很差的一类现象。这个问题不仅仅出现在决策树的模型里,在所有的机器/深度学习的模型里都是top类的问题。(ps:可能引起的原因是由于training set 的数据没有泛化性所以一般方法是增大training数据,增加L1/L2正则项,减少model的复杂度等方法)
但是在决策树中,过拟合的问题更为棘手,由于树的结构,所以我们可以在training的过程中,准确率就达到100%,类似于查表,但是实际上这种查表的并不能泛化到testing里去,因为我们需要对决策树采取一些剪枝的办法。

### 2.2.1 预剪枝
**预剪枝:** 指的是在数据分裂在统计意义上并不显著的时候,树形成的时候就停止生长。一般有2种办法:
1. 设定最小样本数,当training的样本数小于一个特定的比例(总样本5%)
2. 对于信息增益值设定一个阈值,当增益值小于这个阈值就停止分裂
以上这两个值都属于超参数

### 2.2.2 后剪枝
**预剪枝:** 在树已经形成后,通过**验证集alidation set**进行剪枝。一般有2种办法:
1.  错误率降低剪枝: 自下而上的剪去可以在验证集上可以提高准确率的节点。
2. 规则后剪枝:首先将树转换成条件结构的集合,一条分支就是一个规则eg:
if (outlook = sunny ) ^ (humidity = high) ^ (windy = True ) then lable = no
转换成规则
(outlook = sunny )  (humidity = high)  (windy = True ) 
对然后依次对这些规则排序(根据准确率),找到在验证集中可以提升该规则准确率的规则前件进行剪枝,但是剪完之后在某个路径下就可能无法恢复成一颗树了。


剪掉的节点标签可以赋值为:
1出现最多类的标签 
2根据标签出现的概率赋值,然后在测试时根据概率去选择标签或者多个标签 
3如果是一个数值标签,可以给加权平均值
**PS:后剪枝我们可以看出这个计算量是条件的指数集,所以用的时候可以先从路径长的条件规则或者错误率较高的条件开始剪。**


**总结:** 对于后剪枝的两种办法而言,错误降低剪枝只能从下慢慢的往上贪心的剪枝,而规则后剪枝可以在树的任何位置进行剪,但是最后可能不能恢复成一棵树。整体来说,预剪枝更快,而后剪枝准确率更高。

# 三. 数据预处理
## 3.1 连续属性处理
我们可以利用qcut 或者cut函数将连续值等分成n份。

## 3.2 未知属性处理
1. 取当前属性里出现最多的那个属性赋值
2. 取对应标签里出现最多的那个属性赋值
3. 取概率赋值
## 3.3 具有过多取值的属性
如果属性有更多的取值,决策树会优先选择作为节点,从而带来误差,eg:
一年365天被分成365个属性。
因此我们引入信息增益比(GainRatio)来替代信息收益:
[熵/信息增益/信息增益比](https://wenku.baidu.com/view/c3771dd2f51fb7360b4c2e3f5727a5e9856a2786.html)

## 3.4 具有代价的属性
有的时候属性的收集不容易,因此我们引入代价表示不同的属性收集代价的重要性计算信息增,简单表达为:(gain(s,a) + 1) / cost(a)

# 4 总结
例如:以上就是今天要讲的内容,本文仅仅简单介绍了决策树的简单应用,算法,优化,数据处理以及代码实现过程。其实个人觉得难点还是在于,如何难点在于理解树的结构以及如何选择合适的属性作为分类的节点。其实除了决策树之外,我们还可以通过多个随机的决策树组合进行众数投票选出最后的标签增加model 的稳定性

## 代码实现
基于英雄联盟的胜率的数据,附上代码的实现:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
决策树是常用的机器学习算法之一,通过对数据的分类和特征值计算来完成对未知数据的预测。本文将介绍使用Python实现决策树算法的相关步骤。 首先,需要导入决策树算法工具包,使用以下代码: ```python from sklearn import tree ``` 然后,导入训练数据和测试数据,并进行预处理。为了方便起见,在本文中采用生成随机数的方式来生成样本数据,使用以下代码: ```python from sklearn.datasets import make_classification X, y = make_classification(n_samples=100, n_features=4, n_classes=2, n_informative=2, n_redundant=0, random_state=0, shuffle=False) ``` 接下来,使用生成的样本数据进行模型训练。这里使用scikit-learn中的DecisionTreeClassifier()函数。 ```python clf = tree.DecisionTreeClassifier() clf = clf.fit(X, y) ``` 训练后,调用predict()方法进行对测试数据的预测,使用以下代码: ```python y_pred = clf.predict(X) ``` 最后,评估模型的准确率,使用以下代码: ```python from sklearn.metrics import accuracy_score print(accuracy_score(y, y_pred)) ``` 这就是使用Python实现决策树算法的基本过程。决策树可以根据数据中的不同特征进行分类,是一个简单且常用的分类算法。决策树算法也可用于回归问题,例如预测一个数的大小。与其他机器学习算法相比,决策树具有易于理解和可解释的优点,同时还可以处理非线性的分类问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曼城周杰伦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值