一、什么是决策树

决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。
本文主要介绍分类树。

划分选择

决策树的关键在于如何选择最优划分属性。随着划分过程不断进行,我们希望决策树的分支节点所包含的样本尽可能属于同一类别,即节点的**“纯度”**越来越高(纯度高代表混合的数据少)。

划分准则:
(一)信息增益
“信息熵”是度量样本纯度最常用的准则,信息熵的定义公式为:

D:样本集合,共有n类样本。
P(xi):第i类样本的所占比。标签为i的样本数/总样本数
Ent(D)越小,D的纯度越高。

信息增益(Information Gain)的是父节点的信息熵与其下所有子节点总信息熵之差。但这里要注意的是,此时计算子节点的总信息熵不能简单求和,而要在求和汇总之前进行修正(对不同子节点赋予不同的权重)。
信息增益的公式:

a:属性
V:属性a共有V个可能得取值,若用a对D进行划分,会产生V个子节点。
Dv:在属性a上取值为av的样本数。
权重:分支节点的样本数/总样本数
划分数据集的准则是:选取最大的信息增益,即信息下降最快的方向。

计算信息熵的Python实现:

#计算信息熵函数,返回信息熵
def calEnt(dataSet):n=dataSet.shape[0]  #计算总行数iset=dataSet.iloc[:,-1].value_counts()   #计算标签个数p=iset/n                 #每类标签的所占比ent=(-p*np.log2(p)).sum()return ent

选择最优划分属性:

#根据信息增益选择最佳数据集切分的列   返回:数据集最佳切分列的索引
def bestSplite(dataSet):baseEnt=calEnt(dataSet)     #原始信息熵bestGain=0                  #初始化信息增益axis=-1    #初始化最佳切分列for i in range(dataSet.shape[1]-1):  #对特征的每列循环,去除标签列levels=dataSet.iloc[:,i].value_counts().index  #取出当前列所有取值ents=0  #初始化子节点信息熵for j in levels:  #对每列的每个取值循环childSet=dataSet[dataSet.iloc[:,i]==j]   #某个子节点ent=calEnt(childSet)     #子节点信息熵ents+=(childSet.shape[0]/dataSet.shape[0])*ent   #当前列的信息熵infoGain=baseEnt-ents    #当前列的信息增益if(infoGain>bestGain):bestGain=infoGain   #选取信息增益最大的axis=ireturn axis

(二)增益率
(三)基尼指数

决策树的基本流程

  1. 计算全部特征的不纯度指标
  2. 选取不纯度指标最优的特征进行分支
  3. 在第一个特征的分支下,计算全部特征的不纯度指标
  4. 选取不纯度指标最优的特征进行分支

重要参数

  • Criterion:用来决定不纯度的计算方法。
    1)输入”entropy“,使用信息熵(Entropy)
    2)输入”gini“,使用基尼系数(Gini Impurity)

  • random_state:用来设置分枝中的随机模式的参数。默认为None。输入任意整数,会一直长出同一棵树,让模型稳定下来。

  • splitter:也是用来控制决策树中的随机选项的。有两种输入值,输入”best",决策树在分枝时虽然随机,但是还是会优先选择更重要的特征进行分枝(重要性可以通过属性feature_importances_查看);输入“random",决策树在分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合。这 也是防止过拟合的一种方式。

  • 剪枝参数:为了防止过拟合,提高决策树的泛化性,要对决策树进行剪枝。剪枝策略对决策树的影响巨大,正确的剪枝策略是优化决策树算法的核心。
    max_depth:限制树的最大深度,超过设定深度的树枝全部剪掉。
    min_samples_leaf:限定,一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生,或者,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生 。
    min_samples_splite:限定,一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则 分枝就不会发生。
    max_features:限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。
    min_impurity_decrease:限制信息增益的大小,信息增益小于设定数值的分枝不会发生。

  • 目标权重参数
    class_weight:对样本标签进行少量的均衡,给少量标签更多的权重,让模型更偏向少数标签,向捕获少数类的方向建模。默认值为None,表示给各类标签相同的权重。
    min_weight_fraction_leaf:当有了权重后需要搭配这个基于权重的剪枝参数来进行剪枝。

属性

feature_importances_:能够查看各个特征的重要性。

接口

fit:拟合数据。
score:对模型进行评估。
apply:输入测试集,返回测试样本所在叶子节点的索引。
predict:输入测试集返回每个测试样本的标签。

决策树示例

通过训练红酒数据集预测红酒的种类。
step1: 导入需要的算法库和模块

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split

step2:探索数据

wine=load_wine()import pandas as pd
pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)


step4 :分训练集和测试集

#70%训练集,30%测试集
Xtrian,Xtest,Ytrain,Ytest=train_test_split(wine.data,wine.target,test_size=0.3)

step5:创建模型(关键步骤)

#建模并进行探索
clf=tree.DecisionTreeClassifier(criterion='entropy')  #实例化,采用信息增益的方式
clf=clf.fit(Xtrian,Ytrain)  #拟合数据
score=clf.score(Xtest,Ytest) #评估,相当于accuracy
score


step6 画出决策树

feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
import graphviz
dot_data=tree.export_graphviz(clf,feature_names=feature_name,class_names=["琴酒","雪莉","贝尔摩德"],filled=True,rounded=True)
graph=graphviz.Source(dot_data)
graph



step7:探索决策树

#特征重要性
clf.feature_importances_[*zip(feature_name,clf.feature_importances_)]

机器学习笔记——决策树之分类树相关推荐

  1. 机器学习笔记——决策树之回归树

    (参考资料:菜菜的sklearn) 重要参数,属性及接口 criterion 1)输入"mse"使用均方误差mean squared error(MSE),父节点和叶子节点之间的均 ...

  2. sklearn实现决策树(分类树)

    阿喽哈~小伙伴们,今天我们来唠一唠决策树 ♣ ♣ ♣ 决策树应该是很多小伙伴入门机器学习的时候最先接触到的分类算法之一,决策树分为分类树和回归树,今天我们只说分类树~ 简单回顾一下分类树的算法原理:分 ...

  3. Scikit-Learn 机器学习笔记 -- 决策树

    Scikit-Learn 机器学习笔记 – 决策树 参考文档: handson-ml import numpy as np# 加载鸢尾花数据集 def load_dataset():from skle ...

  4. [机器学习算法]决策树和CART树

    决策树综述 决策树的工作原理 决策树(decision tree)分类法是一种简单但广泛使用的分类技术.以是否贷款违约的二分类问题为例,当我们希望根据给定的训练集习得一个模型对新出现的贷款人进行分类时 ...

  5. 机器学习笔记——决策树(Decision Tree)(1)

    决策树 1.引入   1.1定义 决策树,顾名思义,就是帮我们做出决策的树.现实生活中我们往往会遇到各种各样的抉择,把我们的决策过程整理一下,就可以发现,该过程实际上就是一个树的模型.比如相亲的时候: ...

  6. 【sklearn学习】决策树、分类树、剪枝策略

    模块sklarn.tree sklearn中决策树的类都在"tree"这个模块之下,这个模块总共包含五个类: tree.DecisionTreeClassifier 分类树 tre ...

  7. python决策树分类 导入数据集_python+sklearn实现决策树(分类树)

    整理今天的代码-- 采用的是150条鸢尾花的数据集fishiris.csv # 读入数据,把Name列取出来作为标签(groundtruth) import pandas as pd data = p ...

  8. 决策树对鸢尾花数据两特征组合分类python代码的结果_机器学习笔记-决策树

    在看决策树之前,先看下之前说过的逻辑回归 上图为判断是否要交往的逻辑回归算法图 把身高,财富,颜值分别与w1,w2,w3相乘求和得到一个结果. (其中w1为高的权重,如果比较在意身高,那么w1就会偏大 ...

  9. 【机器学习】决策树——CART分类回归树(理论+图解+公式)

最新文章

  1. 小希的迷宫(并查集)
  2. Docker 容器技术 — Compose 编排
  3. 曾经案例中问题 与 工厂模式解耦
  4. CentOS 7 源码编译MariaDB 5.5.46
  5. Cloudflare的HTTP/2优化策略
  6. 文献学习(part89)--Diversity-induced Multi-view Subspace Clustering
  7. 一个在线编写前端代码的好玩的工具
  8. Java:关于main方法的10道面试题
  9. android studio yasea,yasea: RTMP streaming client for Android.
  10. 判定是否过拟合、欠拟合的一种方式
  11. Debian下措置惩罚上网慢的成绩
  12. ctfd的mysql导入_centos7 CTFd平台搭建过程
  13. 【语言模型系列】原理篇二:从ELMo到ALBERT
  14. 学习vim: vim cheat sheet
  15. HTML语言的三要素,web前端基础技术三要素HTML、CSS、JavaScript
  16. 一名大学毕业生的反思《上》
  17. win10重启不能上网(只能QQ上网,打不开浏览器网页)
  18. vivo s12参数
  19. 8寸ndows平板,三款8英寸Windows平板对比体验
  20. 正向动力学与反向动力学

热门文章

  1. 解析windows已从异常关机中恢复
  2. [cerc2012][Gym100624A]20181013
  3. Struts2的声明式异常处理
  4. 定时关机 v1.0(autoshut v1.0)
  5. Java——链表的增删查改
  6. ESXi主机下的常用日志
  7. 把CheckBox的方块换成图片或其他
  8. JUnit5 @Disabled测试示例
  9. 02-08 Python库-yaml
  10. ggspatial | ggplot2的地图制作拓展包(1):如何添加指北针和比例尺