【持续更新】基于Python的机器学习——决策树

决策树简介:

决策树(DT)是用于分类回归的非参数监督学习方法。目标是创建一个模型,通过学习从数据特征推断出的简单决策规则来预测目标变量的值。

决策树算法在机器学习中算是很经典的一个算法系列了。它既可以作为分类算法,也可以作为回归算法,同时也特别适合集成学习比如随机森林。

决策树的一些优点是:

  • 简单易懂和解释。树木可以看到。
  • 需要很少的数据准备。其他技术通常需要数据规范化,需要创建虚拟变量并删除空值。但请注意,此模块不支持缺失值。
  • 使用树的成本(即,预测数据)是用于训练树的数据点的数量的对数。
  • 能够处理数字和分类数据(能处理非数值的数据)。其他技术通常专门用于分析仅具有一种变量类型的数据集。
  • 使用白盒模型。如果在模型中可以观察到给定的情况,则可以通过布尔逻辑轻松解释条件。相反,在黑盒模型中(例如,在人工神经网络中),结果可能更难以解释。
  • 可以使用统计测试验证模型。这使得可以考虑模型的可靠性。
  • 即使其假设在某种程度上违反了生成数据的真实模型,也表现良好。

决策树的缺点包括:

  • 决策树学习者可以创建过于复杂的树,这些树不能很好地推广数据。这称为过度拟合。修剪(当前不支持),设置叶节点所需的最小样本数或设置树的最大深度等机制是避免此问题所必需的。
  • 决策树可能不稳定,因为数据中的小变化可能导致生成完全不同的树。通过在集合内使用决策树来减轻此问题。
  • 已知在最优性的几个方面甚至对于简单的概念,学习最优决策树的问题是NP完全的。因此,实际的决策树学习算法基于启发式算法,例如贪婪算法,其中在每个节点处进行局部最优决策。这种算法不能保证返回全局最优决策树。这可以通过在集合学习器中训练多个树来减轻,其中特征和样本随替换而被随机采样。
  • 有些概念很难学习,因为决策树不容易表达它们,例如XOR,奇偶校验或多路复用器问题。
  • 如果某些类占主导地位,决策树学习者会创建偏向的树。因此,建议在拟合决策树之前平衡数据集。

【主要针对分类的决策树进行讨论】

决策树通常有三个步骤:特征选择、决策树的生成、决策树的修剪。

决策树节点的构成:根节点,子节点,叶子节点(决策树是只有一个根节点的)

决策树分类的思想:从根节点开始,对实例的某一特征进行测试(对于特征的选择很重要),根据测试结果将实例分配到其子节点,此时每个子节点对应着该特征的一个取值,如此递归的对实例进行测试并分配,直到到达叶节点,最后将实例分到叶节点的类中。具体过程为:

1) 开始:构建根节点,将所有训练数据都放在根节点,选择一个最优特征,按着这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类。

2) 如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到所对应的叶节点去。也即是决策树构建完成。反之,转3)

3)如果还有子集不能够被正确的分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的节点。这样递归进行,直至所有训练数据子集被基本正确的分类,或者没有合适的特征为止。

4)如果每个子集都被分到叶节点上,即都有了明确的类,这样就生成了一颗决策树。


决策树算法:

决策树思想,实际上就是寻找最纯净(纯度)的划分方法,这个最纯净在数学上叫纯度,纯度通俗点理解就是目标变量要分得足够开(y=1的和y=0的混到一起就会不纯)。另一种理解是分类误差率的一种衡量。实际决策树算法往往用到的是,纯度的另一面也即不纯度,下面是不纯度的公式。不纯度的选取有多种方法,每种方法也就形成了不同的决策树方法,比如ID3算法使用信息增益作为不纯度;C4.5算法使用信息增益率作为不纯度;CART算法使用基尼系数作为不纯度。

 

决策树剪枝策略:

 

基于Python的决策树的构建构成过程:

# 决策树

from sklearn import tree
# 数据集
from sklearn.datasets import load_wine
# 切分数据集
from sklearn.model_selection import train_test_split

# 导入数据
wine=load_wine()
wine.data.shape

在此使用的是红酒数据集,查看它的数据是这样的:

port pandas as pd
pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1).head()

 

【持续更新】基于Python的机器学习——决策树

wine.feature_names
# wine.target_names

 

【持续更新】基于Python的机器学习——决策树

# 切分训练集与测试集
Xtrain,Xtest,Ytrain,Ytest=train_test_split(wine.data,wine.target,test_size=0.3)
Xtrain.shape

决策树构造:

# 建立决策分类树模型

clf=tree.DecisionTreeClassifier(criterion="entropy") #entropy:信息熵
clf=clf.fit(Xtrain,Ytrain)
# 预测的准确度
score=clf.score(Xtest,Ytest) 
score

# 原始数据拟合的准确度
clf.score(Xtrain,Ytrain) 

决策树可视化:

# 画出树


import graphviz

# 自定义特征名字
feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜 色强度','色调','od280/od315稀释葡萄酒','脯氨酸']

dot_data = tree.export_graphviz(clf,feature_names= feature_name,class_names=["琴酒","雪莉","贝尔摩德"],filled=True,rounded=True) 
# filled=True 填充颜色
# rounded=True  圆弧矩形

graph=graphviz.Source(dot_data)
graph

这样的一棵树就生成了:

【持续更新】基于Python的机器学习——决策树