决策树的简单原理(简明易懂)

决策树

1.1决策树的种类

决策树算法分为ID3,C4.5,CART以及最基本的决策树算法CLS,前面三种都是CLS的优化和延深。
这里讨论的是python模块包sklearn中的分类决策树,包括ID3,C4.5,CART。
ID3使用信息增益最大值来选择分裂属性,只能实现分类算法,仅仅能够处理离散属性。
C4.5使用信息增益率最大值选择分裂属性,既可以分类也可以回归。分类选择信息增益率最大的作为最优特征,回归是先将特征取值排序,以连续两个值中间值作为划分标准。计算每一种划分后的信息增益,选择信息增益最大的分裂点作为该属性的分裂点。能进行剪枝操作,能处理空值
CART分类树中使用最小基尼值来选择分裂属性,回归树中使用平方误差最小化准则来选择分裂属性。可以分类可以回归。与ID3,C4.5不同的是CART构成的决策树必须是二叉树。

1.2ID3决策树的生成

在这里插入图片描述

  1. 根据数据集选取信息增益最大的属性作为根结点,属性里的值作为分支
  2. 如果根节点下所有样本属于同一类则生成一个叶子节点,中止算法
  3. 计算每个分支里剩余属性的信息增益,选取 信息增益 最大的属性作为分支节点
  4. 重复一到三步骤,直到没有属性或者剩余属性 信息增益 很小结束决策树的构建

2.1信息增益的解释

信息增益=熵-条件熵(分裂前熵-分裂后熵)
信息增益代表给定一个变量的条件下,原始变量不确定性的减小程度。
信息增益值大小相对于训练数据集而言, 没有绝对的意义。当分类问题困难时,熵就会偏大,导致信息增益偏大,反之偏小

2.2熵

熵定义为信息的期望值,为了计算熵,我们需要计算所有类别所有可能值所包含的信息期望值,计算公式如下
请添加图片描述
Ck代表一种类别的类别个数,D代表全部的样本个数

2.3条件熵

条件熵 H(D|A) 表示在已知随机变量A的条件下随机变量D的不确定性,即分裂后熵。
请添加图片描述
P(A)为事件A的概率,D1代表D中一种类别的概率,P(D1|A)代表A和D1同时发生的概率。

2.4信息增益公式

请添加图片描述

2.5信息增益比公式

请添加图片描述

2.6基尼指数公式

集合D的基尼基尼指数

请添加图片描述
Ck代表样本为Ck的个数D代表样本总个数。

在A的条件下集合D的基尼指数

请添加图片描述
D1,D2为D中的为D1,D2分类的样本数,D为总样本数。

3.1决策树参数说明

class sklearn.tree.DecisionTreeClassifier (criterion=’gini’,splitter=’best’,max_depth=None,max_features=None, max_leaf_nodes=None,random_state=None,min_impurity_split=None )
criterion:默认gini,特征选择标准,gini代表CART算法,entropy代表ID3算法。
splitter:默认best,可选择random,当数据量非常大建议使用random。
max_depth:默认None,树的深度。如果样本数量多,特征多建议使用,常用10-100。
max_features:默认None,样本特征数,当样本特征低于五十建议不做修改。
max_leaf_nodes:默认None,最大叶子数,如果特征较多建议加以限制。算法会建立在最大叶子节点数内最优决策树。
random_state:随机种子,如果数据不做改变保证下次运行和这次结果相同。
min_impurity_split:默认None,最小阈值,当节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点,为叶子节点 。

完整版代码展示

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz  # 保存树模型图片
titan = pd.read_csv("titanic.csv", index_col=0)
titan.dropna(subset=["age"], axis=0, inplace=True)  # 删除年龄为空
X = titan[["pclass", "age", "sex"]].copy()  # 筛选特征和标签
y = titan["survived"]
X["pclass"] = X["pclass"].str[0].astype(int)
X["sex"] = (X["sex"] == 'male').astype(int)  # 男为1  女为0

X_train, X_test, y_train, y_test = train_test_split(   # 拆分数据集
    X,
    y,
    random_state=1,
    test_size=0.2,
    stratify=y
)
dt = DecisionTreeClassifier(max_depth=5)  # 决策树不需要进行数据标准化
dt.fit(X_train, y_train)
acc = dt.score(X_test, y_test)
print("在测试集上的准确率", acc)
print("在训练集上的准确率", dt.score(X_train, y_train))
export_graphviz(dt, 'titanic.dot',  # 将算法模型dt 导出到 dot文件中
                # feature_names=["pclass", "age", "sex"],
                feature_names=["舱位", "年龄", "性别"],
                # max_depth=5,  # 树的深度
                class_names=['死亡', '生存']  # 类别名称
                )

好了,本章的内容到这里就结束了,小伙伴们可以去试试决策树建模了。欢迎小伙伴们指出文章误点,大家相互学习,一起进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值