赞
踩
决策树属于有监督学习算法,又称为CART(Classification and Regression Trees),可以用于解决分类和回归问题。
本文主要讨论决策分类树(下文称为决策树),即通过一系列决策规则分类数据。
数据沿轴具有局部分段线性(local-piecewise linearity)。
决策树先选择数据属性,再构造决策规则。如下图所示,根据属性决策规则,划分数据类别。
决策树的数据即一系列自变量以及对应的因变量(分类标签)。
决策树的属性选择标准(criterion),旨在降低每个节点的杂质(impurity)。
其中,D为数据,n为类别数,为D中的数据数量,为D中属于第 i 个类别的数据数量,H(D)为数据D的熵值。
其中,m为划分的数据子集数,为划分后的第 j 个数据子集中数据数量,H(D|A)为D根据属性A划分后的熵值。
其中,Gain(D,A)为Information Gain。
相较于Information Gain,Gain Ratio考虑了属性划分产生的熵值,并进行调整。
其中, 为属性划分产生的熵值。
其中,GainRatio(D,A)为Gain Ratio。
其中 ,Gini(D)为数据D的基尼系数。
其中 ,Gini(D|A)为D根据属性A划分后的基尼系数。
其中,GiniGain(D,A)为Gini Gain。
决策树的构造算法,具体流程如下:
停止标准通常有三种:
根据属性选择标准不同,常用的构造算法有三种:
预剪枝即早停止,当叶节点数据数量少于阈值时停止。
后剪枝先构建一棵完整深入的树,当树出现过拟合问题(例如验证集准确度下降),再剪枝。
随机森林属于有监督学习算法,通过随机的数据子集和随机的属性选择构造多棵决策树,再汇总每棵决策树的结果产生最终结果。
以kaggle中数据集“Drugs A, B, C, X, Y for Decision Trees”为例
直接下载使用“Drugs A, B, C, X, Y for Decision Trees”数据集,并读取数据集
- import pandas as pd
-
- dataset = pd.read_csv('./drug200.csv') # 读取csv文件
特征工程,将字符型的列进行序号编码
- import category_encoders as ce
-
- encoder = ce.OrdinalEncoder(cols=['Sex', 'BP', 'Cholesterol']).fit(dataset) # 对Sex, BP, Cholesterol进行编码,并拟合
- dataset_encoded = encoder.transform(dataset) # 对dataset数据进行编码
Hold-out,划分训练集和测试集
- from sklearn.model_selection import train_test_split
-
- X = dataset_encoded.drop(['Drug'], axis=1) # 删除'Drug'列,得到特征矩阵X
- y = dataset_encoded['Drug'] # 提取'Drug'列,得到目标向量y
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33,
- random_state=23) # 将X和y按照33%的比例划分为训练集和测试集,设置随机种子为23
分别训练一个基于熵的决策树和一个基于基尼系数的决策树
- from sklearn.tree import DecisionTreeClassifier
-
- DTR_entropy = DecisionTreeClassifier(criterion='entropy', max_depth=3,
- random_state=0) # 创建一个基于熵的决策树,设置最大深度为3,随机种子为0
- DTR_gini = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=0) # 创建一个基于基尼系数的决策树,设置最大深度为3,随机种子为0
-
- DTR_entropy.fit(X_train, y_train) # 用训练集数据拟合熵决策树
- DTR_gini.fit(X_train, y_train) # 用训练集数据拟合基尼系数决策树
分别输出基于熵的决策树和基于基尼系数的决策树在训练集和测试集下的准确率
- print("Score of train-set using entropy : {:.4f}".format(DTR_entropy.score(X_train, y_train))) # 打印信息熵决策树在训练集上的准确率
- print("Score of test-set using entropy : {:.4f}".format(DTR_entropy.score(X_test, y_test))) # 打印信息熵决策树在测试集上的准确率
-
- print("Score of train-set using gini : {:.4f}".format(DTR_gini.score(X_train, y_train))) # 打印基尼系数决策树在训练集上的准确率
- print("Score of test-set using gini : {:.4f}".format(DTR_gini.score(X_test, y_test))) # 打印基尼系数决策树在测试集上的准确率
-
结果如下:
Score of train-set using entropy : 0.9254
Score of test-set using entropy : 0.9091
Score of train-set using gini : 0.9254
Score of test-set using gini : 0.9091
可视化基于熵的决策树和基于基尼系数的决策树
- import matplotlib.pyplot as plt
- from sklearn import tree
-
- plt.figure(figsize=(12, 8))
- plt.subplot(121)
- tree.plot_tree(DTR_entropy.fit(X_train, y_train)) # 绘制熵决策树的图形
- plt.title('Using entropy')
-
- plt.subplot(122)
- tree.plot_tree(DTR_entropy.fit(X_train, y_train)) # 绘制基尼系数决策树的图形
- plt.title('Using gini')
-
- plt.show()
结果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。