热线电话:13121318867

登录
2020-08-26 阅读量: 917
机器学习——决策树

决策树

决策树(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)


47.4768
0
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子