决策树: 决策树是一种在分类与回归中都有非常广泛应用的算法,它的原理是通过对一系列问题进行if/else的推导,最终实现决策。
1. 决策树的基本原理:
决策树是通过一系列规则对数据进行分类的过程。它提供一种在什么条件下会得到什么值的类似规则的方法。决策树分为分类树和回归树两种,分类树对离散变量做决策树,回归树对连续变量做决策树。
近来的调查表明决策树也是最经常使用的数据挖掘算法,它的概念非常简单。决策树算法之所以如此流行,一个很重要的原因就是使用者基本上不用了解机器学习算法,也不用深究它是如何工作的。直观看上去,决策树分类器就像判断模块和终止块组成的流程图,终止块表示分类结果(也就是树的叶子)。判断模块表示对一个特征取值的判断(该特征有几个值,判断模块就有几个分支)。
如果不考虑效率等,那么样本所有特征的判断级联起来终会将某一个样本分到一个类终止块上。实际上,样本所有特征中有一些特征在分类时起到决定性作用,决策树的构造过程就是找到这些具有决定性作用的特征,根据其决定性程度来构造一个倒立的树–决定性作用最大的那个特征作为根节点,然后递归找到各分支下子数据集中次大的决定性特征,直至子数据集中所有数据都属于同一类。所以,构造决策树的过程本质上就是根据数据特征将数据集分类的递归过程,我们需要解决的第一个问题就是,当前数据集上哪个特征在划分数据分类时起决定性作用。
2.决策树的构建
from sklearn import tree,datasets
from sklearn.model_selection import train_test_split
wine=datasets.load_wine()
#只选取数据集前2个特征
X,y=wine.data[:,:2],wine.target
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)
#设定决策树分类器的最大深度为1
clf=tree.DecisionTreeClassifier(max_depth=1)
#拟合训练数据集
clf.fit(X_train,y_train)
print('测试数据集得分:{}'.format(clf.score(X_test,y_test)))
下面我们将最大深度增加到3,看看分类器的表现。
from sklearn import tree,datasets
from sklearn.model_selection import train_test_split
wine=datasets.load_wine()
#只选取数据集前2个特征
X,y=wine.data[:,:2],wine.target
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)
#设定决策树分类器的最大深度为1
clf=tree.DecisionTreeClassifier(max_depth=3)
#拟合训练数据集
clf.fit(X_train,y_train)
print('测试数据集得分:{}'.format(clf.score(X_test,y_test)))
可以看到,分类器的表现进一步提升了。
3.决策树的工作过程展示:
from sklearn import tree,datasets
from sklearn.model_selection import train_test_split
wine=datasets.load_wine()
#只选取数据集前2个特征
X,y=wine.data[:,:2],wine.target
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)
#设定决策树分类器的最大深度为1
clf=tree.DecisionTreeClassifier(max_depth=5)
#拟合训练数据集
clf.fit(X_train,y_train)
print('测试数据集得分:{}'.format(clf.score(X_test,y_test)))
#导入graphviz工具
import graphviz
#导入决策树中输出graphviz的接口
from sklearn.tree import export_graphviz
#选择最大深度为3的分类模型
export_graphviz(clf,out_file='wine.dot',class_names=wine.target_names,feature_names=wine.feature_names[:2],impurity=False,filled=True)
#打开一个dot文件
with open('wine.dot') as f:
dot_graph=f.read()
graphviz.Source(dot_graph)
结果分析:
上图非常清晰的展示了决策树是如何进行预测的。这种展示方法非常便于我们向非专业人士来解释算法是如何工作的。
4.总结:
决策树的优势与不足:
相比于其它算法,决策树有一个非常大的优势,就是可以很容易的将模型进行可视化,另外,由于决策树算法对每个样本特征进行单独处理,因此并不需要对数据进行转换。这样以来,如果我们使用决策树算法的话,我们几乎不需要对数据进行预处理。这也是决策树算法的一个优点。
当然,决策树算法也有它的不足——即便我们在建模的时候可以使用类似max_depth或是max_leaf_nodes等参数来对决策树进行了预剪纸处理,但它还是不可避免的会出现过拟合的问题,这就也就让模型的泛化能力大打折扣。
为了避免过拟合的问题出现,可以使用集成学习的方法,也就是——随机森林算法。
我将会在下一篇文章中进行具体论述。