机器学习——决策树

决策树:

        决策树是一种常见的机器学习方法,它易于理解、可解释性强,既可以作为分类模型,也可以作为回归模型。决策树是一种方法,它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。一棵决策树包含一个根结点、若干个内部结点和若干个叶结点。叶结点对应于决策结果,其他每个结点则对应于一个属性测试。每个结点包含的样本集合根据属性测试的结果被划分到子结点中。根结点包含样本全集。从根结点到每个叶结点的路径对应了一个判定测试序列。决策树学习的目的是为了产生一棵泛化能力强(即处理未见示例能力强)的决策树。决策树算法容易理解,适用各种数据,在解决各种问题时都有良好表现,尤其是以树模型为核心的各种集成算法,在各个行业和领域都有广泛的应用。在构建决策树的过程中,每个数据从根节点向下走,在每个结点时根据其特征选择向左或向右,直到走到最后的叶子结点,形成一个树的结构。决策树的目标就是在所有可能的树结构中选择最符合训练集数据的结构,同时能泛化到新的数据集中。

熵:

划分数据集的大原则是:将无序数据变得更加有序,但是各种方法都有各自的优缺点,信息论是量化处理信息的分支科学,在划分数据集前后信息发生的变化称为信息增益,获得信息增益最高的特征就是最好的选择,所以必须先学习如何计算信息增益,集合信息的度量方式称为香农熵,或者简称熵。熵也就是度量数据精确度的单位,熵越大,数据就越不准确,反之则数据更为的精准。

以下为计算熵的公式:

剪枝:

决策树算法很容易过拟合,剪枝算法就是用来防止决策树过拟合,提高泛华性能的方法。剪枝分为预剪枝与后剪枝。

预剪枝
预剪枝是指在决策树的生成过程中,对每个节点在划分前先进行评估,若当前的划分不能带来泛化性能的提升,则停止划分,并将当前节点标记为叶节点。

预剪枝方法有:
(1)当叶节点的实例个数小于某个阈值时停止生长;
(2)当决策树达到预定高度时停止生长;
(3)当每次拓展对系统性能的增益小于某个阈值时停止生长;

预剪枝不足就是剪枝后决策树可能会不满足需求就被过早停止决策树的生长。

后剪枝
后剪枝是指先从训练集生成一颗完整的决策树,然后自底向上对非叶节点进行考察,若将该节点对应的子树替换为叶节点,能带来泛化性能的提升,则将该子树替换为叶节点。

后剪枝决策树通常比预剪枝决策树保留了更多的分枝,一般情形下,后剪枝决策树的欠拟合风险很小,泛化能力往往优于预剪枝决策树。但后剪枝决策树是在生产完全决策树之后进行的,并且要自底向上地对所有非叶子节点进行逐一考察,因此其训练时间开销比未剪枝的决策树和预剪枝的决策树都要大很多。

决策树的特点:

优点:
容易理解,可解释性较好
可以用于小数据集
时间复杂度较小
可以处理多输入问题,可以处理不相关特征数据
对缺失值不敏感

缺点:
在处理特征关联性比较强的数据时,表现得不太好
当样本中各类别不均匀时,信息增益会偏向于那些具有更多数值的特征
对连续性的字段比较难预测
容易出现过拟合
当类别太多时,错误可能会增加得比较快

实践:

在sklearn库中提供了DecisionTreeClassifier函数来实现决策树算法,其函数原型如下:

sklearn.tree.DecisionTreeClassifier(criterion='gini',max_deepth=None,random_state=None)

代码如下:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn import tree
  
iris = load_iris()    # 数据集导入
features = iris.data    # 属性特征
labels = iris.target    # 分类标签
train_features, test_features, train_labels, test_labels = \
    train_test_split(features, labels, test_size=0.3, random_state=1)    # 训练集,测试集分类
clf = tree.DecisionTreeClassifier(criterion='entropy',max_depth=3)
clf = clf.fit(train_features, train_labels)    #X,Y分别是属性特征和分类label
test_labels_predict = clf.predict(test_features)    # 预测测试集的标签
score = accuracy_score(test_labels, test_labels_predict)    # 将预测后的结果与实际结果进行对比
print("CART分类树的准确率 %.4lf" % score)    # 输出结果
dot_data = tree.export_graphviz(clf, out_file='iris_tree.dot')    # 生成决策树可视化的dot文件

输出结果:

CART分类树的准确率 0.9556
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值