决议计划树算法浅析
决议计划树的介绍
决议计划树的界说: 决议计划树是一种逼近离散值目标函数的方法,学习到的函数运用树结构进行表明,完结决议计划使命。这儿决议计划树可所以分类树,也可所以回归树。
树结构的运用: 一个决议计划树一般由根节点、若干内部节点、若干叶子节点构成。叶子节点就是决议计划成果;每个内部节点对应一个特点测验,每个内部节点包括的样本集合,依据特点测验结构进一步区别,进入该内部节点的子节点;根节点包括悉数的练习样本,从根节点到每个叶子节点,对应了一条决议计划规矩。
决议计划进程的了解: 先以一个简单的动物分类使命为例,怎么区别鸡和鸭两类动物。咱们决议计划进程应该是考虑,鸡和鸭两种动物较为显着的区别特征。例如,嘴部结构特征,依据该特征(特点)拟定决议计划进程,如果尖嘴就是鸡,如果是扁形嘴就是鸭。
再拓展到复杂的动物分类使命,从多个动物样本数据中,区别哺乳动物和非哺乳动物。观察表格样本数据,显着发现仅运用一个特征无法正确完结分类使命。此时,咱们能够同时考虑其他特征,增加决议计划规矩。
另一个角度去了解,决议计划树构建的进程,类似与运用python语言编写了若干if-else分支去解决问题。
动物 | 饮食习性 | 胎生动物 | 水生动物 | 会飞 | 哺乳动物 |
---|---|---|---|---|---|
人类 | 杂食动物 | 是 | 否 | 否 | 是 |
野猪 | 杂食动物 | 是 | 否 | 否 | 是 |
狮子 | 肉食动物 | 是 | 否 | 否 | 是 |
苍鹰 | 肉食动物 | 否 | 否 | 是 | 否 |
鳄鱼 | 肉食动物 | 否 | 是 | 否 | 否 |
巨蜥 | 肉食动物 | 否 | 否 | 否 | 否 |
蝙蝠 | 杂食动物 | 是 | 否 | 是 | 是 |
野牛 | 草食动物 | 是 | 否 | 否 | 是 |
麻雀 | 杂食动物 | 否 | 否 | 是 | 否 |
鲨鱼 | 肉食动物 | 否 | 是 | 否 | 否 |
海豚 | 肉食动物 | 是 | 是 | 否 | 是 |
鸭嘴兽 | 肉食动物 | 否 | 否 | 否 | 是 |
袋鼠 | 草食动物 | 是 | 否 | 否 | 是 |
蟒蛇 | 肉食动物 | 否 | 否 | 否 | 否 |
不断寻找特征,增加规矩的进程,实际上就是构建决议计划树的进程,咱们总能得到一个决议计划树能够较好的完结分类使命。 这儿咱们需求考虑以下内容:
- 1.数据方面,运用的是离散化数据特征,连续数值类型需求进行离散化。
- 2.过拟合问题,或许存在数据样本需求复杂的特点测验,拟定很多规矩才干完结分类,导致过拟合的发生。
- 3.建模方面,尽或许构建简单的决议计划树,少进行特点测验。这也是决议计划树算法的关键问题。
决议计划树最佳区别的衡量问题
咱们总想先找到关键特征,依据关键特征进行特点测验,将无序数据变得愈加有序,或者说将区别后的数据样本的“不纯度”不断下降。
怎么对节点进行不纯度的衡量?能够运用以下方式衡量:
- 熵:无序化程度的衡量,熵越大则表明越混乱。
- 误分类率:错误分类概率
- 基尼指数:表明在样本集合中一个随机选中的样本被分错的概率。
有了衡量规范后,咱们就能够寻找,从父节点到子节点特点测验时,熵减最大、误分类率下降最大或基尼指数减最大的特征,循环该进程使得决议计划树不断生长。
我们能够测验依据上述表格中的数据进行衡量计算。
决议计划树python事例
wine葡萄酒数据集
- 数据记载178条
- 数据特征13个’酒精’,’苹果酸’,’灰’,’灰的碱性’,’镁’,’总酚’,’类黄酮’,’非黄烷类酚类’,’花青素’,’色彩强度’,’色调’,’od280/od315稀释葡萄酒’,’脯氨酸’
- 目标类别3类:’琴酒’,’雪莉’,’贝尔摩德’
决议计划树结构可视化 特征贡献的排序可视化
# 导入所需求的模块
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)