机器学习-决策树

一、决策树定义

  • 决策树概念

        决策树是一种机器学习的方法,是一种对实例进行分类的树形结构。决策树由结点和有向边组成。结点有两种类型:内部结点叶节点。内部结点表示一个特征或属性,叶节点表示一个类。每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。决策树是一种十分常用的有监督学习分类方法。

        如下图,红色为内部节点,其余为叶节点。

  • 决策树基本流程

(1)当前节点包含的样本全部属于同一类别,无需继续划分;
(2)当前属性集为空或者所有样本在某个属性上的取值相同,无法继续划分;
(3)当前节点包含的样本集合为空,无法划分。

  • 划分选择

        我们知道决策树算法的核心是如何选择最优的划分特征,我们经过每次划分后的分支节点所包含的样本尽可能的属于同一类别,也就是节点中所包含的样本纯度越来越高。从而,我们引入信息熵这个衡量标准。

信息熵

        “信息熵”是度量样本集合纯度最常用的一种指标,假定当前样本集合D中第k类样本所占的比例为 pk (K=1, 2, ..., |y|) ,则D的信息熵定义为

  •         Ent(D)的值越小,则D的纯度越高,计算信息熵时约定:若p = 0,则plog2p=0,Ent(D)的最小值为0,最大值为log2|y|。

信息增益

        我们假设特征集中有一个离散特征a,它有V个可能的取值(a1,a2,…,aV),如果使用特征a来对样本D进行划分,那么会产V个分支节点,其中第v个分支节点中包含的样本集。我们记为Dv。我们可计算出特征a对样本集D进行划分所获得的信息增益为:

        一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的“纯度提升”越大。

增益率

        信息增益不具备任何泛化能力,也就是信息增益准则的一个缺点,它在选择最优划分特征时,对可取数目比较多的特征有所偏好,如何避免这个问题呢,我们引入增益率这个概念,改为使用增益率来作为最优划分特征的标准。

        

  • 剪枝操作

        决策树,非常容易出现过拟合问题。为了避免这个问题,提供决策树的泛化能力,我们需要进行剪枝操作。一般有两种剪枝操作,“预剪枝”和“后剪枝”。

        由于预剪枝是在构建决策树的同时进行剪枝处理,所以其训练时间开销较少,同时可以有效的降低过拟合的风险,但是,预剪枝有一个问题,会给决策树带来欠拟合的风险。后剪枝则是先根据训练集生成一颗完整的决策树,然后根据相关方法进行剪枝。常用的一种方法是,自底向上,对非叶子节点进行考察,同样拿验证集中的数据,来根据精度进行考察。看该节点划分前和划分后,精度是否有提高,如果划分后精度没有提高,则剪掉此子树,将其替换为叶子节点。相对于预剪枝来说,后剪枝的欠拟合风险很小,同时,泛化能力往往要优于预剪枝,但是,因为后剪枝先要生成整个决策树后,然后才自底向上依次考察每个非叶子节点,所以训练时间长。

二、实例操作

        下列代码是关于通过决策树来实现泰坦尼克号生存预测的实例展示:

# author: baiCai
# 导入模块
import  numpy as np
import pandas as pd
from sklearn import tree
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import export_graphviz
import matplotlib.pyplot as plt

# 加载数据
data = pd.read_csv('./data/train.csv')
# print(data.head())
# print(data.shape) # (891, 12)
# 获取数据
x = data[['Pclass','Age','Sex']]
y = data['Survived']
# print(x.head())
# print(y.head())
# 缺失值处理
x['Age'].fillna(x['Age'].mean(),inplace=True)
# 特征处理
x['Sex'] = np.array([0 if i == 'male' else 1 for i in x['Sex']]).T
# 打印查看是否替换成功
# print(x.head())
# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2,random_state=22)


# 创建模型
model = DecisionTreeClassifier(criterion='entropy',max_depth=3)

model.fit(x_train,y_train)
# 评估
score = model.score(x_test,y_test)
pred = model.predict(x_test)
print('准确率:',score)
print('预测值:',pred)
# 可视化方法一:
# export_graphviz(model, out_file="./data/tree.dot", feature_names=['pclass','age','sex'])
# 更简单的方法:
plt.figure(figsize=(20,20))
feature_name = ['pclass','age','sex']
class_name = ['survived','death']
tree.plot_tree(model,feature_names=feature_name,class_names=class_name)
plt.savefig('./data/tree.png')

    结果展示:

  

        实例分析:上述代码我们通过获取数据集之后对数据进行处理,划分数据集之后进行模型的创建、训练与评估。最后将结果进行可视化展示。

三、总结

        通过上述原理的说明,我们知道了机器学习决策树的概念以及如何通过信息熵、信息增益、信息增益率来进行划分选择,还有这决策树的含义,并且我们通过获取数据集之后对数据进行预处理,再通过对数据集的划分选择,对模型进行创建、训练与评估之后,得出最后的预测结果。通过,我们可以绘制出决策树的大致流程,并且我们也知道了决策树是一种十分常用的有监督学习分类方法,这对算法的检验来说,是具有重要意义。
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值