决策树
1.1决策树的种类
决策树算法分为ID3,C4.5,CART以及最基本的决策树算法CLS,前面三种都是CLS的优化和延深。
这里讨论的是python模块包sklearn中的分类决策树,包括ID3,C4.5,CART。
ID3使用信息增益最大值来选择分裂属性,只能实现分类算法,仅仅能够处理离散属性。
C4.5使用信息增益率最大值选择分裂属性,既可以分类也可以回归。分类选择信息增益率最大的作为最优特征,回归是先将特征取值排序,以连续两个值中间值作为划分标准。计算每一种划分后的信息增益,选择信息增益最大的分裂点作为该属性的分裂点。能进行剪枝操作,能处理空值
CART分类树中使用最小基尼值来选择分裂属性,回归树中使用平方误差最小化准则来选择分裂属性。可以分类可以回归。与ID3,C4.5不同的是CART构成的决策树必须是二叉树。
1.2ID3决策树的生成
- 根据数据集选取信息增益最大的属性作为根结点,属性里的值作为分支
- 如果根节点下所有样本属于同一类则生成一个叶子节点,中止算法
- 计算每个分支里剩余属性的信息增益,选取 信息增益 最大的属性作为分支节点
- 重复一到三步骤,直到没有属性或者剩余属性 信息增益 很小结束决策树的构建
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=['死亡', '生存'] # 类别名称
)
好了,本章的内容到这里就结束了,小伙伴们可以去试试决策树建模了。欢迎小伙伴们指出文章误点,大家相互学习,一起进步。