决议计划树算法浅析

决议计划树的介绍

决议计划树的界说: 决议计划树是一种逼近离散值目标函数的方法,学习到的函数运用树结构进行表明,完结决议计划使命。这儿决议计划树可所以分类树,也可所以回归树。

树结构的运用: 一个决议计划树一般由根节点、若干内部节点、若干叶子节点构成。叶子节点就是决议计划成果;每个内部节点对应一个特点测验,每个内部节点包括的样本集合,依据特点测验结构进一步区别,进入该内部节点的子节点;根节点包括悉数的练习样本,从根节点到每个叶子节点,对应了一条决议计划规矩。

决策树算法:原理与python实现案例

决议计划进程的了解: 先以一个简单的动物分类使命为例,怎么区别鸡和鸭两类动物。咱们决议计划进程应该是考虑,鸡和鸭两种动物较为显着的区别特征。例如,嘴部结构特征,依据该特征(特点)拟定决议计划进程,如果尖嘴就是鸡,如果是扁形嘴就是鸭。

再拓展到复杂的动物分类使命,从多个动物样本数据中,区别哺乳动物和非哺乳动物。观察表格样本数据,显着发现仅运用一个特征无法正确完结分类使命。此时,咱们能够同时考虑其他特征,增加决议计划规矩。

另一个角度去了解,决议计划树构建的进程,类似与运用python语言编写了若干if-else分支去解决问题。

动物 饮食习性 胎生动物 水生动物 会飞 哺乳动物
人类 杂食动物
野猪 杂食动物
狮子 肉食动物
苍鹰 肉食动物
鳄鱼 肉食动物
巨蜥 肉食动物
蝙蝠 杂食动物
野牛 草食动物
麻雀 杂食动物
鲨鱼 肉食动物
海豚 肉食动物
鸭嘴兽 肉食动物
袋鼠 草食动物
蟒蛇 肉食动物

不断寻找特征,增加规矩的进程,实际上就是构建决议计划树的进程,咱们总能得到一个决议计划树能够较好的完结分类使命。 这儿咱们需求考虑以下内容:

  • 1.数据方面,运用的是离散化数据特征,连续数值类型需求进行离散化。
  • 2.过拟合问题,或许存在数据样本需求复杂的特点测验,拟定很多规矩才干完结分类,导致过拟合的发生。
  • 3.建模方面,尽或许构建简单的决议计划树,少进行特点测验。这也是决议计划树算法的关键问题。

决议计划树最佳区别的衡量问题

咱们总想先找到关键特征,依据关键特征进行特点测验,将无序数据变得愈加有序,或者说将区别后的数据样本的“不纯度”不断下降。

怎么对节点进行不纯度的衡量?能够运用以下方式衡量:

  • 熵:无序化程度的衡量,熵越大则表明越混乱。
  • 误分类率:错误分类概率
  • 基尼指数:表明在样本集合中一个随机选中的样本被分错的概率。

有了衡量规范后,咱们就能够寻找,从父节点到子节点特点测验时,熵减最大、误分类率下降最大或基尼指数减最大的特征,循环该进程使得决议计划树不断生长。

决策树算法:原理与python实现案例

我们能够测验依据上述表格中的数据进行衡量计算。

决议计划树python事例

wine葡萄酒数据集

  • 数据记载178条
  • 数据特征13个’酒精’,’苹果酸’,’灰’,’灰的碱性’,’镁’,’总酚’,’类黄酮’,’非黄烷类酚类’,’花青素’,’色彩强度’,’色调’,’od280/od315稀释葡萄酒’,’脯氨酸’
  • 目标类别3类:’琴酒’,’雪莉’,’贝尔摩德’

决议计划树结构可视化

决策树算法:原理与python实现案例
特征贡献的排序可视化
决策树算法:原理与python实现案例
决策树算法:原理与python实现案例

# 导入所需求的模块
import matplotlib.pyplot as plt
import pandas as pd           #读取数据
from sklearn import tree #树的模块
from sklearn.datasets import load_wine #导入红酒数据集
from sklearn.model_selection import train_test_split # 区别数据集的模块
plt.rcParams['font.sans-serif']=['SimHei']
# 探索数据
wine = load_wine()
# 数据有178个样本,13个特征
pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)
# 区别数据为练习集和测验集,test_size标示测验集数据占的百分比
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
# 建立模型
clf = tree.DecisionTreeClassifier(criterion="entropy")# 实例化模型,增加criterion参数
clf = clf.fit(Xtrain, Ytrain)# 运用实例化好的模型进行拟合操作
score = clf.score(Xtest, Ytest) #回来预测的准确度
#对数结构进行可视化
tree.plot_tree(clf)
# 对特征重要度数据进行可视化
importances = list(clf.feature_importances_)      #辛烷值RON影响因素的重要性
feature_importances = [(feature, round(importance, 2)) for feature, importance in zip(feature_name,importances)]     #将相关变量名称与重要性对应
feature_importances = sorted(feature_importances, key = lambda x: x[1], reverse = True)                #排序
print(*feature_importances)
feature_importances_df =pd.DataFrame(feature_importances)
print(df)
[print('Variable: {:12} Importance: {}'.format(*pair)) for pair in feature_importances]            #输出特征影响程度具体数据
#绘图
f,ax = plt.subplots(figsize = (13,8))    #设置图片大小
x_values = list(range(len(importances)))     
plt.bar(x_values,feature_importances_df[1], orientation = 'vertical', color = 'r',edgecolor = 'k',linewidth =0.2)    #制作柱形图
# Tick labels for x axis
plt.xticks(x_values, feature_importances_df[0], rotation='vertical',fontsize=8)      
# Axis labels and title
plt.ylabel('Importance'); plt.xlabel('Variable'); plt.title('Variable Importances');
#特征重要性
print(clf.feature_importances_)# 查看每一个特征对分类的贡献率
print([*zip(feature_name,clf.feature_importances_)])
tree.DecisionTreeClassifier(criterion="entropy",random_state=30)
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest) #回来预测的准确度
print(score)