一、决策树解决分类问题的一般步骤
1、决策树构建的核心有两点:
(1)找出最佳的节点和最佳的分支。不纯度越低越好,不纯度基于节点计算,每个节点都有不纯度,并且子节点的不纯度低于父节点的不纯度,所以,在同一棵决策树上,叶子节点的不纯度一定是最低的。
(2)如何让决策树停止生长,防止过拟合,可以通过剪枝参数调整。
2、
在sklearn中,共有五个关于决策树的类:
Tree.DecisionTreeClassfier 分类树
Tree.DecisionTreeRegressor 回归树
Tree.export_graphviz 将生成的决策树导出为dot格式,画图专用
Tree.ExtraTreeClassifier 高随机版本的分类树
Tree.ExtraTreeRegressor 高随机版本的回归树
二、怎么使用决策树解决分类问题
from sklearn import tree
clf = tree.DecisionTreeClassifier() #实例化
clf = clf.fit(xtrain,ytrain) #训练
result = clf.score(xtest,ytest) #为测试集打分
1、重要参数
(1)Criterion
上文已经说明了决策树的核心之一就是找出最佳的节点和最佳的分支,这就涉及到不纯度的计算。此参数就决定了怎么计算不纯度,两种方式:gini:基尼系数(默认);entropy:信息熵。
i)两个的对比:
差别不大,但是信息熵会慢一些,且对不纯度会更加敏感,所以决策树会更加精细。
对于高维数据和噪音过多的数据信息熵很容易过拟合,建议基尼系数,
当然也不是绝对的。
ii)具体如何选取:
通常默认;
维度大噪音多选择基尼系数;
维度低,数据清晰都可以;
当欠拟合时可以选用信息熵;
个人建议,二者都试试,对比选择。
(2)random_state
在建树的过程中,是依靠优化节点来追求一棵优化的树,但最优的节点不一定
保证最优的树。所以,在sklearn中,会建更多的树从中取最好的。
在每次分枝时,不从全部特征中选取,而是随机从中选取一部分特征,
从中选取不纯度相关指标达到最优的作为分枝用的节点。
可以设置任意整数,目的是让指标更优秀。
(3)splitter
控制决策树的随机性。
输入值:best(选择重要性更高的特征)和 random(随机选择,可以防止过拟合)
(4) 剪枝参数
实际情况中,常常会过拟合,也就是训练集上表现非常好,而测试集上表现一般,需要剪枝。
剪枝策略对决策树的影响较大,正确的剪枝是优化决策树算法的核心。
i)max_depth:特征多,但数据少,限制树的深度可以防止过拟合,
建议从3开始尝试。
ii)min_samples_leaf 和 min_samples_split:限制叶子节点,可以整数,
也可以是浮点数(百分比),搭配max_depth使用,建议从5开始尝试,
一般情况,对于类别不多的分类问题,最佳是1。
iii)max_features:限制考虑的特征数,超过限制个数的特征会被舍弃
(不太推荐,太暴力,可以选择PCA降维或者sklearn自带的特征选择)
iv)min_impurity_decrease:限制信息增益的大小,信息增益小于设定值分枝
就不会发生。
(5)目标权重参数
Class_weight 和 Min_weight_fraction_leaf:完成样本标签平衡的参数。
默认值为None,即相同的权重。
1)样本标签不平衡,指的是在一个数据集中,某一类样本占有大多数,
比如银行贷款违约的人数,大概百分之97的人不会违约,但是这样的数据集
会导致最终模型的预测只要预测为不会违约,也会有97%的正确率,因此
需要Class_weight参数对样本标签进行一定的衡量,给少量的标签更多的权重,
让模型偏向于样本较少的那一类。
2、重要接口
fit(xtrain,ytrain) 训练模型
score(xtest,ytest) 得分
predict(xtest) 返回每个测试样本的分类或者回归的结果
apply(xtest) 返回每个测试样本所在的叶子的索引
predict_proba(xtest) 预测的分类结果属于每个标签的概率值
输入的xtrain和xtest必须是二维矩阵,不接受任何一维特征矩阵,如果是一维,
需要reshape(-1,1)转换。
3、重要属性
feature_importances_ :特征重要性
#重要性
importance = clf.feature_importances_
feature_importance = [(feature,importance.round(3)) for feature,importance in zip(feature_name,importance)]
#排序
feature_importance = sorted(feature_importance,key=lambda x :x[1],reverse=True)
#对应进行打印
[print('variable:{:20} importance: {}'.format(*pair)) for pair in feature_importance]
三、决策树的优缺点以及适用场景
决策树的一些优点:
1)易于理解和解释。树可以被可视化。
2)几乎不需要数据准备。其他算法通常需要数据标准化,需要创建虚拟变量并删除
3)缺失值。但是,请注意,此模块不支持缺失值。
使用树的成本(即预测数据)是用于训练树的数据点数的对数。
4)能够处理数值型和分类型数据。其他技术通常专门分析只有一种类型变量的数据集。
5)能够处理多输出问题。
6)使用白盒模型。如果给定的情况在模型中是可以观察到的,那么对条件的解释就很容易用布尔逻辑来解释。相反,在黑箱模型中(例如,在人工神经网络中),结果可能很难解释。
7)可以使用统计测试验证模型。这样就有可能对模型的可靠性作出解释。
即使它的假设在某种程度上被生成数据的真实模型所违背,它也表现得很好。
决策树的缺点包括:
1)决策树学习器可以创建过于复杂的树,不能很好地概括数据。这就是所谓的过拟合。为了避免这个问题,必须设置剪枝、设置叶节点所需的最小样本数或设置树的最大深度等机制。
2)决策树可能是不稳定的,因为数据中的小变化可能导致生成完全不同的树。通过集成决策树来缓解这个问题。
3)学习最优决策树的问题在最优性的几个方面都是NP-complete的,甚至对于简单的概念也是如此。因此,实际的决策树学习算法是基于启发式算法,如贪婪算法,
在每个节点上进行局部最优决策。这种算法不能保证返回全局最优决策树。这可以通过训练多棵树再集成一个学习器来缓解,其中特征和样本被随机抽取并替换。有些概念很难学习,因为决策树不能很容易地表达它们,例如异或、奇偶校验或多路复用器问题。
4)如果某些类占主导地位,则决策树学习者会创建有偏见的树。因此,建议
在拟合决策树之前平衡数据集。
适用场景
1)对于决策树分类而言,它更擅长分月亮型和半分型的数据,
对于环状分布的数据效果并不是太好。
2)最擅长月亮型数据的是最近邻算法,RBF支持向量机和高斯过程。
3)最擅长环形数据的是最近邻算法和高斯过程。
4)最擅长半分的是朴素贝叶斯、神经网络和随机森林。