目录
决策树分类模型
决策树示例
决策树与 if-then 规则
- 决策树可以看作一个 if-then 规则的集合
- 由决策树的根节点到叶节点的每一条路径,构建一条规则:路径上内部节点的特征对应着规则的条件(condition),叶节点对应规则的结论
- 决策树的 if-then 规则集合有一个重要性质:互斥并且完备。这就是说,每个实例都被一条规则(一条路径)所覆盖,并且只被这一条规则覆盖

决策树的目标
- 决策树学习的本质,是从训练数据集中归纳出一组 if-then 分类规则
- 与训练集不相矛盾的决策树,可能有很多个,也可能一个也没有;所以我们需要选择一个与训练数据集矛盾较小的决策树
- 另一角度,我们可以把决策树看成一个条件概率模型,我们的目标是将实例分配到条件概率更大的那一类中去
- 所有可能的情况中选择最优决策树,是一个NP完全问题,所以我们通常采用启发式算法求解决策树,得到一个次最优解
- 采用的算法通常是递归地进行以下过程:选择最优特征,并根据该特征对训练数据进行分割,使得各个子数据集都有一个最好的分类
- 我们使用决策树模型的最终目的是利用决策树模型进行分类预测,预测我们给出的一组数据最终属于哪一种类别,这是一个由不确定到确定的过程
- 最终理想的分类是,每一组数据,都能确定性地按照决策树分支找到对应的类别
- 所以我们就选择使数据信息熵下降最快的特征作为分类节点,使得决策树尽快地趋于确定
1)特征选择
2)随机变量
- 随机变量(random variable)的本质是一个函数,是从样本空间的子集到实数的映射,将事件转换成一个数值

- 根据样本空间中的元素不同(即不同的实验结果),随机变量的值也将随机产生。可以说,随机变量是“数值化”的实验结果
- 在现实生活中,实验结果是描述性的词汇,比如 “硬币的正面”、“反面”。在数学家眼里,这些文字化的叙述太过繁琐,所以拿数字来代表它们
3)熵
- 熵(entropy)用来衡量随机变量的不确定性
- 变量的不确定性越大,熵也就越大
- 设X是一个取有限个值的离散随机变量,其概率分布为:

- 则随机变量X的熵定义为:

- 通常,上式中的对数以2为底或者以e为底(自然对数),这时熵的单位分别称为比特(bit)或纳特(nat)。
- 当随机变量只取两个值,例如 1,0 时,则 X 的分布为:

熵为:

- 这时,熵H§随概率p变化的曲线如下图所示(单位为比特):

4)条件熵(conditional entropy)
- 条件熵 H( Y|X ) 表示在已知随机变量 X 的条件下随机变量 Y 的不确定性:


- 熵 H(D) 表示对数据集 D 进行分类的不确定性。
- 条件熵 H(D|A) 指在给定特征 A 的条件下数据集分类的不确定性
- 当熵和条件熵的概率由数据估计得到时,所对应的熵与条件熵分别称为经验熵(empirical entropy)和经验条件熵(empirical conditional entropy)
5)信息增益
- 特征A对训练数据集D的信息增益 g(D, A),定义为集合D的经验熵H(D)与特征A给定条件下D的条件熵 H(D|A)之差,即

- 决策树学习应用信息增益准则选择特征
- 经验熵H(D)表示对数据集D进行分类的不确定性。而经验条件熵H(D|A)表示在特征A给定的条件下对数据集D进行分类的不确定性。那么它们的差,即信息增益,就表示由于特征A而使得对数据集D的分类的不确定性减少的程度
- 对于数据集D而言,信息增益依赖于特征,不同的特征往往具有不同的信息增益
- 信息增益大的特征具有更强的分类能力
决策树的生成算法
- ID3
决策树(ID3)的训练过程就是找到信息增益最大的特征,然后按照此特征进行分类,然后再找到各类型子集中信息增益最大的特征,然后按照此特征进行分类,最终得到符合要求的模型。 - C4.5
C4.5算法在ID3基础上做了改进,用信息增益比来选择特征 - 分类与回归树(CART)
由特征选择、树的生成和剪枝三部分组成,既可以用于分类也可以用于回归
代码案例
import numpy as np import pandas as pd import xgboost as xgb from sklearn.model_selection import train_test_split # cross_validation from sklearn.datasets import load_iris if __name__ == "__main__": #引入sklearn里面的数据集,iris鸢尾花 iris = load_iris() df = pd.DataFrame(data = iris.data, columns = iris.feature_names) x1,y1 = np.split(data.values, (4,), axis=1) y1 = pd.Categorical(y).codes #划分训练集和测试集 x_train,x_test,y_train,y_test = train_test_split(x1,y1,random_state=1,test_size=50) data_train = xgb.DMatrix(x_train, label=y_train) data_test = xgb.DMatrix(x_test, label=y_test) watch_list = [(data_test, 'eval'), (data_train, 'train')] param = {
'max_depth': 2, 'eta': 0.3, 'silent': 1, 'objective': 'multi:softmax', 'num_class': 3} bst = xgb.train(param, data_train, num_boost_round=6, evals=watch_list) y_hat = bst.predict(data_test) result = y_test.reshape(1, -1) == y_hat print('正确率:\t', float(np.sum(result)) / len(y_hat))
决策树总结
- 决策树是一类具有可解释性、泛化性较好的模型
- 精度高、无需特征归一化,能够处理缺失值,共线性特征
- 适用于低维稠密数据,不适合高维稀疏数据
- 决策树类算法兼具特征选择能力
- 在金融、推荐、商业化领域用途十分广泛
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177586.html原文链接:https://javaforall.net
