决策树
决策树(decision tree)是一种基本的分类与回归方法
决策树由结点(node)和有向边(directed edge)组成
结点类型:根结点(root node),内部结点(internal node)和叶结 点(leaf node)
决策树:可以把决策树看成一个if-else规则的集合
由决策树的根结点到叶结点的每一条路径构建一条规则
路径上内部结点的特征对应着规则的条件,而叶结点的类对应着规则的结论
规则集合性质:互斥并且完备(每一个实例都被一条路径或一条规 则所覆盖,而且只被一条路径或一条规则所覆盖)
使用决策树做预测的过程:
收集数据
准备数据:将收集的信息按照一定规则整理出来,方便后续处理
分析数据
训练算法:构造决策树,也可以说是决策树学习
测试算法:使用经验树计算错误率。当错误率达到了可接收范围, 这个决策树就可以投放使用了
使用算法:决策树可以更好地理解数据的内在含义
使用决策树做预测的每一步骤都很重要,数据收集不到位,将会导致没有足够的特征让我们构建错误率低的决策树
数据特征充足,但是不知道用哪些特征好,将会导致无法构建出分类效果好的决策树模型。从算法方面看,决策树的构建是我们的核心内容
决策树的构建:
特征选择:
特征选择在于选取对训练数据具有分类能力的特征
特征选择的标准是信息增益(information gain):
在划分数据集之后信息发生的变化称为信息增益
通过计算每个特征值划分数据集获得的信息增益,获得信息增益最高的特征就是最好的选择
决策树的生成:
第一次划分之后,数据集被向下传递到树的分支的下一 个结点。在这个结点上,我们可以再次划分数据。因此 我们可以采用递归的原则处理数据集
构建决策树的方法:ID3、C4.5和CART
ID3:解决分类问题,要求特征离散,信息增益最大选择特征,无减枝策略,不能处理缺失值
C4.5:解决分类问题,特征可以离散或连续(二分裂处理),信息增益率最大选择特征,剪枝策略,可以处理缺失值
CART(主要用):特征可以离散可以连续,剪枝策略,可以处理缺失值。分类问题:基尼系数最小选择特征;回归问题:平方误差最小选择特征
使用决策树执行分类:
依靠训练数据构造了决策树之后,我们可以将它用于实 际数据的分类。在执行数据分类时,需要决策树以及用 于构造树的标签向量。然后,程序比较测试数据与决策树上的数值,递归执行该过程直到进入叶子结点;最后将测试数据定义为叶子结点所属的类型
决策树的修剪(C4.5)
决策树的总结
优点:
白盒模型,易于理解和解释
模型建立所需数据量较少
可同时用于分类和回归
缺点:
容易过拟合,需要多参数调节
对数据敏感,可通过集成算法进行优化
优化过程是局部优化,未必能到全局最优
代码实现:
分类:
from sklearn.datasets import load_iris
from sklearn import tree
import graphviz
import os
#引入数据
iris=load_iris()
X=iris.data
y=iris.target
clf=tree.DecisionTreeClassifier(max_depth=3,random_state=10)
clf=clf.fit(X,y)
#引入graphviz模块用来导出图,结果图如下所示
import graphviz
dot_data=tree.export_graphviz(clf,out_file=None,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True,rounded=True,
special_characters=True)
os.chdir(r'G:\graphviz-2.38\release\bin')
graph=graphviz.Source(dot_data)
graph.view()
回归:
from sklearn.datasets import load_boston
import graphviz
import numpy as np
from sklearn import tree
# 加载boston数据函数
boston = load_boston()
X = boston.data
y = boston.target
from sklearn.model_selection import train_test_split
data_train, data_test, target_train, target_test =train_test_split(X, y, test_size = 0.2, random_state = 42)
dtr = tree.DecisionTreeRegressor()
dtr.fit(data_train, target_train)
dtr.score(data_test, target_test)
参数调优
from sklearn.model_selection import GridSearchCV
# 加载调优函数
# 设置参数可取值
data_train, data_test, target_train, target_test =train_test_split(X, y, test_size = 0.2, random_state = 42)
gini_impure = np.linspace(0,0.01,10)
param_grid = {"min_impurity_decrease":gini_impure,"max_depth":range(6,15),"min_samples_split":range(2,50,2)}
# 设置参数网格
reg = GridSearchCV(tree.DecisionTreeRegressor(),param_grid=param_grid,cv=10,verbose=2,n_jobs=-1)
# 建模
reg.fit(data_train,target_train)
# 拟合训练集数据
print(reg.best_params_)
#print(reg.score(X,y))
# 打印结果
reg.score(data_test,target_test)#模型的得分
重新建模
reg = tree.DecisionTreeRegressor(min_impurity_decrease=0,max_depth=8,min_samples_split=28,random_state=10)
# 加载模型
reg.fit(data_train,target_train)
reg.score(data_test,target_test)
暂无数据