决策树算法-Decision Tree,有监督的学习算法,模仿的是人类做决策的过程。
定义:
从根节点开始一步一步走到叶子节点(决策),所有数据最终都会落到叶子节点,即可以做分类,也可以做回归。它适用于类别和连续输入(特征)和输出(预测)变量。基于树的方法把特征空间划分成一系列矩形,然后给每一个矩形安置一个简单的模型(像一个常数)。从概念上来讲,它们是简单且有效的。决策树越深入,决策规则就越复杂并且对数据的拟合越好。
根节点:最重要的节点(初始节点)
叶子节点:最终节点(最终的决策结果)
优点:便于理解和解释。树的结构可以可视化出来
由于训练决策树的数据点的数量导致了决策树的使用开销呈指数分布
能够处理数值型数据和分类数据
能够处理多路输出的问题
使用白盒模型。如果某种给定的情况在该模型中是可以观察的,那么就可以轻易的通过布尔逻辑来解释这种情况。相比之下,在黑盒模型中的结果就是很难说明清楚地。
可以通过数值统计测试来验证该模型
使该模型假设的结果与真实模型所提供的数据有些违反,其表现依旧良好
缺点:决策树模型容易产生一个过于复杂的模型,这样的模型对数据的泛化性能会很差。这就是所谓的过拟合.一些策略像剪枝、设置叶节点所需的最小样本数或设置数的最大深度是避免出现 该问题最为有效地方法。
决策树可能是不稳定的,因为数据中的微小变化可能会导致完全不同的树生成。这个问题可以通过决策树的集成来得到缓解
在多方面性能最优和简单化概念的要求下,学习一棵最优决策树通常是一个NP完全问题。因此,实际的决策树学习算法是基于启发式算法,例如在每个节点进行局部最优决策的贪心算法。这样的算法不能保证返回全局最优决策树。这个问题可以通过集成学习来训练多棵决策树来缓解,这多棵决策树一般通过对特征和样本有放回的随机采样来生成。
有些概念很难被决策树学习到,因为决策树很难清楚的表述这些概念。例如XOR,奇偶或者复用器的问题。
如果某些类在问题中占主导地位会使得创建的决策树有偏差。因此,我们建议在拟合前先对数据集进行平衡。
(优点缺点 from:1.10. 决策树 - scikit-learn 0.19.0 中文文档 - ApacheCNsklearn.apachecn.org
)
根节点的选择:根节点是要非常有用的,分类效果要好,相当于是一个老大位置的特征,接着再去选择其次的特征。需要有一个衡量标准来选择根节点,就是熵值。
熵值:表示随机变量中不确定性的度量,也就是物体内部的混乱程度。数据的不确定性越大,熵值也就越大。A = [1,1,1,1,1,1,1,1,2,2],B = [1,2,3,4,5,6,7,8,9,1]。显然,A集合的熵要低,因为A只有2个类别,而B有9个类别,因此熵值会大很多。
信息增益:表示特征X使得类Y的不确定性减少的程度。增益是指熵值下降了多少。比如原始熵值10,经过决策后,熵值变为8了,因此增益就是10-8=2。看下哪个特征能够使得信息增益最大,这个特征就当做根节点。在剩下的当中再去找信息增益最大的,当做第二当家,以下下去做决策。
决策树算法计算策略:ID3:信息增益,拿ID来算信息增益时,会是最大的,而ID只是编号,对最终结果没有影响,但是我们却把它当作根节点的问题
C4.5:信息增益率(解决ID3问题,考虑自身熵)
CART(现在应用比较广):使用GINI系数来当衡量标准,公式
决策树剪枝策略:剪枝原因: 决策树过拟合风险很大
剪枝策略:预剪枝,后剪枝
预剪枝,边建立决策树边进行剪枝的操作(更实用). 限制 深度、叶子节点个数、叶子节点样本数、信息增益量等
后剪枝,当建立决策树后来进行剪枝。通过一定的衡量标准,叶子节点越多,损失越大Cα(T)=C(T)+α|T|,其中,C(T)即是该 Node 和不确定性相关的损失、|T|则是该 Node 下属叶节点的个数。不妨设第 t 个叶节点含有Nt个样本且这Nt个样本的不确定性为Ht(T),那么新损失一般可以直接定义为加权不确定性:C(T)=|T|∑t=1NtHt(T)。 决策树的剪枝算法 | Python 与机器学习决策树的剪枝算法www.carefree0910.com
练习代码
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 13 21:49:57 2018
@author: Administrator
"""
import matplotlib.pyplot as plt
import pandas as pd
from sklearn import tree
from sklearn.datasets.california_housing import fetch_california_housing
from sklearn.model_selection import train_test_split
housing = fetch_california_housing()
print(housing.DESCR)
print('-'*20)
print(housing.data.shape)
print('-'*20)
print(housing.data[0])
print('-'*20)
print(housing.target[0])
print('-'*20)
print(housing.feature_names)
#from sklearn import tree
dtr = tree.DecisionTreeRegressor(max_depth = 2)
dtr.fit(housing.data[:, [6, 7]], housing.target)
#要可视化显示 首先需要安装 graphviz,可以直接conda 安装
#conda install python-graphviz
#或者到官网下载:http://www.graphviz.org/Download..php
dot_data = \
tree.export_graphviz(
dtr,
out_file = None,
feature_names = housing.feature_names[6:8],
filled = True,
impurity = False,
rounded = True
)
#pip install pydotplus
import pydotplus
graph = pydotplus.graph_from_dot_data(dot_data)
graph.get_nodes()[7].set_fillcolor("#FFF2DD")
from IPython.display import Image
Image(graph.create_png()) #有问题
#把数据集进行切分
#from sklearn.model_selection import train_test_split
data_train, data_test, target_train, target_test = \
train_test_split(housing.data, housing.target, test_size = 0.1, random_state = 42)
dtr = tree.DecisionTreeRegressor(random_state = 42)
dtr.fit(data_train, target_train)
dtr.score(data_test, target_test)
print(dtr.score(data_test, target_test))
决策树模型有以下几个特点。训练过程比较简单,也就是在实际使用中比较好实现。
在对一个新的样本进行预测时,时间复杂度是 O(k),这个k是树的深度,也就是树有多少层。因此决策树的预测过程的非常快速而简单。
决策树在训练过程中也能算出每个特征(feature)的重要程度。
想比于其它分类算法,比如SVM和逻辑回归,决策树更能简单地应用到多元分类的问题上。
如不加限制,决策树模型很容易出现过拟合(overfitting)。
针对决策树模型容易过拟合的特点,目前常见的有以下几个性质来进行控制。树的深度,也就是树有多少层。
一个节点能被继续拆分出子节点所需要的包含最少的样本个数。
最底层节点所需要包含的最少样本个数。
以上三个决策树都相当于它的超参数(hyper-parameter), 也就是我们在训练过程中需要去调整的。但是如果采用随机森林模型,它能够已集成(ensemble) 的方法解决过拟合的问题,因此可以作为实际应用的决策树的很好的替代算法。