-
决策树概念
根据我们前面学到的知识
顾名思义:一棵用来决策的树。
机器学习已有的数据,分析什么情况会导致什么结果,把它画成一颗分叉的树,
然后如果有新数据来了,带入这棵树来决策应该怎么做。
比如带入性别,得到结果:性别女则决策买买买,性别男则决策吃吃吃。 -
举例
如果使用决策树划分这些数据?
- 先竖着画一条线
- 由已经分割好的两部分继续划分
- 继续划分
- 这就是决策树了
- 熵
物体越无序,熵越大,越不稳定。
物品越有序,熵越小,越稳定。
如何用数学定义描述这种状态?
我们随机N次抽取物品,求出这些抽取出的物品排列起来和原来物品一模一样的概率。
概率越大越稳定。概率越小越不稳定。
又因为这些物品可能数量很多,一直求概率这个值会很小很小,为了使这个值依旧满足衡量稳定与否的作用还不那么小,我们对每个概率都取对数,这样相乘就可以被改成相加了(会是负数,再取相反数)。
我们使用决策树时,就可以使用熵的概念判断决策树划分的好坏了
父节点的熵值-子节点的熵值的平均值=信息增益
信息增益越大越好,就像是上图第三点似的,信息增益为1.
- 信息增益例子
如果先按照性别分类的话,信息增益为0.54
按照职业划分的话信息增益是1.
所以我们这种情况按照职业划分更好。
总而言之,我们选择决策树的父节点时,可以用信息增益这个指标来决定用哪个参数当父节点。
- 随机森林
上述的例子是两个参数,性别和职业,若是某些数据的参数过多,我们还依旧使用决策树的话,就会出现过拟合的状态,这时候模型倾向于记住数据而不是预测数据。类似于下图
这是一种不好的现象,如何解决呢?
随机选择几个参数(列),生成决策树。
再随机选择几个参数(列),生成决策树。
……
多生成几个决策树。
最后要进行预测数值时,将数值代入不同的决策树,得到不同的结果,我们取出现次数最多的结果。如下图所示。
- 超参数
学过数据结构的同学都知道,树有很多性质,决策树作为树的一种,也具有树的性质。
-
最大深度
决策树的最大深度指树根和叶子之间的最大长度。当决策树的最大深度为k时,它最多可以拥有
2 k 2^k 2k片叶子。
设置最大深度这个超参数可以有效避免决策树左右不平衡效率问题。
这样解决了一个问题又会出现什么问题呢?
如左图所示,一个节点内样本过多,一个节点内样本过少,这样也不行,所以还要用到一个超参数 -
每个节点最小样本数
若这个参数被设置为一个整数,就代表样本个数,如果被设置为小数就代表节点样本与总样本数的比值(必须大于等于此比值) -
最大特征数
这个超参数就是第5点所说的,限制每次查找数据特征的个数,来生成许多决策树,以防出现过拟合的情况。
- 代码示例
# Import statements
from sklearn.tree import DecisionTreeClassifier#分类器
from sklearn.metrics import accuracy_score#计算模型是准确率
import pandas as pd
import numpy as np
# Read the data.
data = np.asarray(pd.read_csv('data.csv', header=None))#读取数据
# Assign the features to the variable X, and the labels to the variable y.
X = data[:,0:2]#数据中前两列是参数(所有行都包括)
y = data[:,2]#数据中第三列是标签(所有行都包括)
# TODO: Create the decision tree model and assign it to the variable model.
model = DecisionTreeClassifier()#实例化一个决策树模型
# TODO: Fit the model.
model.fit(X,y)#放入数据学习
# TODO: Make predictions. Store them in the variable y_pred.
y_pred = model.predict(X)#预测数据
# TODO: Calculate the accuracy and assign it to the variable acc.
acc = accuracy_score(y, y_pred)#计算准确率