决策树-分类算法

                                         决策树-分类算法

1 认识决策树

决策树是一种基本的分类方法,也可以用于回归。我们一般只讨论用于分类的决策树。决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程,它可以认为是if-then规则的集合。在决策树的结构中,每一个实例都被一条路径或者一条规则所覆盖。

2 特征选择

特征选择在于选取对训练数据具有分类能力的特征。这样可以提高决策树学习的效率,如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的,经验上扔掉这样的特征对决策树学习的影响不大。

首先举个例子,

母亲要给你介绍男朋友的对话:

女儿:多大了?    母亲:26。

女儿:长的帅不?   母亲:挺帅的。

女儿:有房不?     母亲:有的。

女儿:那好,我去见见。

上图中,长相和是否有房为什么放在年龄后面,不把他们放在前面呢,这是因为女儿把年龄看得比较重要,那么年龄就更具有分类的能力。回到特征选择中,如果一个特征具有更好的分类能力,是在当前的条件下有最好的分类,那么就更应该选择这个特征。

2.1 信息度量

某个信息有用,那么它的作用如何客观、定量地体现出来呢,1948年,香农在他的论文“通信的数学原理”中提到了“信息熵”的概念,解决了信息的度量问题,并量化出信息的作用。

一条信息的信息量与其不确定性有着直接的关系,比如我们要搞清一件非常不确定的事,就需要大量的信息。相反如果对某件事了解较多,则不需要太多的信息就能把它搞清楚 。所以从这个角度看,可以认为,信息量就等于不确定的多少。

那么如何量化信息量的度量,假设某次世界杯上有32支球队,谁会赢呢,每猜一次给一块钱,告诉我是否猜对了,那么我需要掏多少钱才能知道谁是冠军?我可以把球编上号,从1到32,然后提问:冠 军在1-16号吗?依次询问,只需要五次,就可以知道结果,以谁是世界杯冠军这条消息只值五块钱。香农用“比特”这个概念来度量信息量。一个比特是 一位二进制数,在计算机中一个字节是8比特。

如果有一天有64支球队进行决赛阶段的比赛,那么“谁是世界杯冠军”的信息量就是6比特,因为要多猜一次,信息量的比特数和所有可能情况的对数函数log有关,(log32=5,log64=6)

实际上不需要猜五次就能才出冠军,因为像西班牙、巴西、德国这样的球队夺得冠军的可能性比南非、尼日利亚等球队大得多,因此第一次猜测时不需要把32支球队等分成两个组,而可以把少数几支最有可能的球队分成一组,把其他球队分成一组。然后才冠军球队是否在那几支热门队中。这样,也许三次就猜出结果。因此,当每支球队夺冠的可能性不等时,“谁是世界杯冠军”的信息量比5比特少。香农指出,它的准确信息量应该是:

H = -(p1logp1 + p2logp2 + ... + p32log32)

其中,p1...p32为这三支球队夺冠的概率。H的专业术语称之为信息熵,单位为比特。当这32支球队夺冠的几率相同时,对应的信息熵等于5比特,这个可以通过计算得出。有一个特性就是,5比特是公式的最大值。那么信息熵(经验熵)的具体定义可以为如下:

H(X)=∑​x∈X​​P(x)logP(x)

2.2 信息增益

信息和消除不确定性是相联系的。所以决策树的过程其实是在寻找某一个特征对整个分类结果的不确定减少的过程。那么这样就有一个概念叫做信息增益(information gain)。

信息增益表示得知特征X的信息而使得Y的信息的不确定性减少的程度,所以对于选择特征进行分类的时候,要选择信息增益较大的特征,这样具有较强的分类能力。特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即公式为:

根据信息增益的准则的特征选择方法是:对于训练数据集D,计算其每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征。

2.3 信息增益的计算

假设训练数据集为D,|D|表示样本个数。设有K个类C​k​​,k=1,2,3,4...k,∣C​k​​∣为属于类C​k​​的样本个数,=∣D∣.设特征A有n个不同的取值{a1,a2,...,an},根据特征A的取值将D划分为n个子集D1,D2,...,Dn,∣Di∣为样本个数,其中Di中属于Ck类的样本的集合为D​i​​k

信息熵的计算如下:

条件熵的计算如下:

 

3 常见决策树使用的算法

ID3:信息增益 最大的准则

C4.5:信息增益比 最大的准则

CART :回归树: 平方误差 最小

             分类树: 基尼系数   最小的准则,在sklearn中默认划分的原则

基尼系数划分比信息增益划分更加仔细

4 sklearn决策树API

class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None) 决策树分类器

常用参数:

criterion:默认是’gini’系数,也可以选择信息增益的熵’entropy’

max_depth:树的深度大小

random_state:随机数种子

常用方法::

apply 返回每个样本被预测的叶子的索引

decision_path:返回决策树的路径

fit_transform(X,y=None,fit_params)** 输入数据,然后转换

predict(X) 预测输入数据的类型,完整代码

score(X,y,sample_weight=None) 返回给定测试数据的准确精度

 

决策树的结构、本地保存。

①sklearn.tree.export_graphviz() 该函数能导出DOT格式

           tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])

②工具:(能够将dot文件转换为pdf、png)

           安卓:https://graphviz.gitlab.io/_pages/Download/Download_windows.html(下载解压后需要添加到环境变量中)

           安装graphviz ubuntu:sudo apt-get install graphviz                    Mac:brew install graphviz

③运行命令 然后我们运行这个命令

           $ dot -Tpng tree.dot -o tree.png

如果我们安装了Python模块pydotplus,我们可以直接在Python中生成PDF文件,通过pip install pydotplus,还需要安装好graphviz,然后运行

import pydotplus
from sklearn import tree
from sklearn.datasets import load_iris
clf = tree.DecisionTreeClassifier()
iris = load_iris()
clf = clf.fit(iris.data, iris.target)
dot_data = tree.export_graphviz(clf, out_file=None)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf("iris.pdf")

5 案例

决策树对泰坦尼克号预测生死:数据来源http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt

泰坦尼克号数据,数据集中的特征是票的类别,存活,乘坐班,年龄,登陆,home.dest,房间,票,船和性别。乘坐班是指乘客班(1,2,3),是社会经济阶层的代表。 其中age数据存在缺失。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier,export_graphviz
# 1.加载数据
datas = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")# 2.处理数据,找出目标值和特征值
x = datas[['pclass','age','sex']]
y = datas['survived']# 2.1利用pandas.DataFrame.fillna方法处理缺失数据,inplace=True直接修改原对象
x['age'].fillna(x['age'].mean(),inplace=True)# 3 分割数据集为训练集合测试集
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)# 4.特征工程的抽取 特征->类别->one_hot编码
# 当特征里面是类别的信息,应该要one-hot编码,否则计算机不知道怎么去计算
dict = DictVectorizer(sparse=False)
# 将x_train(DataFrame类型)转换为字典,关键字orient='records' 时形成[{column -> value}, … , {column -> value}]的结构
# 整体构成一个列表,内层是将原始数据的每行提取出来形成字典
x_train = dict.fit_transform(x_train.to_dict(orient='records'))
print(dict.get_feature_names())
x_test = dict.transform(x_test.to_dict(orient='records'))# 5.决策树进行预测
dec = DecisionTreeClassifier()
dec.fit(x_train,y_train)
# 预测准确率
print("预测准确率:", dec.score(x_test, y_test))
# 导出决策树的结构
export_graphviz(dec, out_file="./tree.dot", feature_names=['年龄', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])

 

6 决策树的优缺点

优点: 简单的理解和解释,树木可视化;需要很少的数据准备,其他技术通常需要数据归一化 

缺点: 决策树学习者可以创建,不能很好地推广数据过于复杂的树,这被称为过拟合; 决策树可能不稳定,因为数据的小变化可能会导致完全不同的树被生成

改进: 减枝cart算法,随机森林

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Visual Studio中利用NTVS创建Pomelo项目

刚看新闻,才知道微软发布了Node.js Tools for Visual Studio(NTVS),受够了WebStorm输入法Bug的困扰,这下终于可以解脱了。以Pomelo为例,运行命令:pomelo init pomelo_test,生成一个默…

LeetCode 834. 树中距离之和(树上DP)*

文章目录1. 题目2. 解题1. 题目 给定一个无向、连通的树。树中有 N 个标记为 0...N-1 的节点以及 N-1 条边 。 第 i 条边连接节点 edges[i][0] 和 edges[i][1] 。 返回一个表示节点 i 与其他所有节点距离之和的列表 ans。 示例 1: 输入: N 6, edges [[0,1],[0,2],[2,3],[…

随机森林-集成学习方法(分类)

随机森林-集成学习方法(分类) 1 集成学习方法 集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测…

05.序列模型 W3.序列模型和注意力机制(作业:机器翻译+触发词检测)

文章目录作业1:机器翻译1. 日期转换1.1 数据集2. 用注意力模型进行机器翻译2.1 注意力机制3. 可视化注意力作业2:触发词检测1. 数据合成:创建语音数据集1.1 听一下数据1.2 音频转频谱1.3 生成一个训练样本1.4 全部训练集1.5 开发集2. 模型2.1…

线性回归分析-回归算法

线性回归分析-回归算法 1 回归算法 机器学习中监督学习算法分为分类算法和回归算法两种,其实就是根据类别标签分布类型为离散型、连续性而定义的。回归算法用于目标是连续的,在指定区间内可以是任意一个数值,针对的是数值型的样本&#xff0…

拟合与岭回归

目录 拟合与岭回归 1 什么是过拟合与欠拟合 2 模型复杂度 3 鉴别欠拟合与过拟合 4 过拟合解决方法 5 岭回归(Ridge) 6 模型的保存与加载 拟合与岭回归 1 什么是过拟合与欠拟合 通过下面两张图来解释过拟合和欠拟合: 左图中机器通过这…

LeetCode 778. 水位上升的泳池中游泳(二分查找+dfs)

文章目录1. 题目2. 解题1. 题目 在一个 N x N 的坐标方格 grid 中,每一个方格的值 grid[i][j] 表示在位置 (i,j) 的平台高度。 现在开始下雨了。当时间为 t 时,此时雨水导致水池中任意位置的水位为 t 。 你可以从一个平台游向四周相邻的任意一个平台&a…

pycharm快捷键、常用设置、配置管理

内容包含: pycharm学习技巧 Learning tips PyCharm3.0默认快捷键(翻译的) pycharm常用设置 pycharm环境和路径配置 Pycharm实用拓展功能:pycharm中清除已编译.pyc中间文件 python2转python3最快方式 [pycharm版本控制和数据库管理][PyCharm中的那些实用功…

逻辑回归-分类算法

目录 逻辑回归-分类算法 1 概述 2 sigmoid函数 3 逻辑回归公式 4 逻辑回归的损失函数 5 均方误差与对数自然损失对比 6 sklearn逻辑回归API 7 案例 8 总结 逻辑回归-分类算法 1 概述 逻辑回归(Logistic Regression),简称LR。它的特…

LeetCode 1220. 统计元音字母序列的数目(DP)

文章目录1. 题目2. 解题1. 题目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: - 字符串中的每个字符都应当是小写元音字母(a, e, i, o, u) - 每个元音 a 后面都只能跟着 e - 每个元音 e 后面…

Django视图(python函数)

1.视图 视图负责接受Web请求HttpRequest,进行逻辑处理,返回Web响应HttpResponse给请求者响应可以是一张网页的HTML内容,一个重定向,一个404错误等 视图就是python中的函数视图一般被定义在“应用/views.py”文件中 视图的第一个…

非监督学习

非监督学习 1 什么是非监(unsupervised learning)督学习 无监督学习,就是不受监督的学习,一种自由的学习方式。该学习方式不需要先验知识进行指导,而是不断地自我认知,自我巩固,最后进行自我归纳,在机器学…

LeetCode 1250. 检查「好数组」(set / 最大公约数)

文章目录1. 题目2. 解题1. 题目 给你一个正整数数组 nums,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。 假如该和结果为 1,那么原数组就是一个「好数组」,则返回 True&#xff1…

用户画像系统

用户画像系统 1 用户画像概述 1.1 什么是用户画像 用户画像就是对现实世界中用户的数学建模。现实世界的用户通过自己各种各样的行为,浏览购买,或者收藏,等等这些行为会把自己的兴趣爱好等体现在这些行为中,比如喜欢看书就会有…

编程思想:面向对象和面向过程

何谓面向对象?何谓面向过程?对于这编程界的两大思想,一直贯穿在我们学习和工作当中。我们知道面向过程和面向对象,但要让我们讲出来个所以然,又感觉是不知从何说起,最后可能也只会说出一句就是那样啦&#…

LeetCode 1210. 穿过迷宫的最少移动次数(状态压缩BFS)

文章目录1. 题目2. 解题1. 题目 你还记得那条风靡全球的贪吃蛇吗? 我们在一个 n*n 的网格上构建了新的迷宫地图,蛇的长度为 2,也就是说它会占去两个单元格。 蛇会从左上角((0, 0) 和 (0, 1))开始移动。 我们用 0 表示…

Django模板(编写html代码

1.模板 用于编写html代码,还可以嵌入模板代码更快更方便的完成页面开发,再通过在视图中渲染模板,将生成最终的html字符串返回给客户端浏览器 模版致力于表达外观,一个视图可以使用任意一个模板,一个模板可以供多个视图…

用户画像之Spark ML实现

用户画像之Spark ML实现 1 Spark ML简单介绍 Spark ML是面向DataFrame编程的。Spark的核心开发是基于RDD(弹性分布式数据集),但是RDD,但是RDD的处理并不是非常灵活,如果要做一些结构化的处理,将RDD转换成…

[Kaggle] Digit Recognizer 手写数字识别(神经网络)

文章目录1. baseline2. 改进2.1 增加训练时间2.2 更改网络结构Digit Recognizer 练习地址 相关博文: [Hands On ML] 3. 分类(MNIST手写数字预测) [Kaggle] Digit Recognizer 手写数字识别 1. baseline 导入包 import tensorflow as tf fr…

逻辑回归原理

逻辑回归原理 1 逻辑回归简介 logistic回归(LR),是一种广义的线性回归分析模型,常用于数据挖掘,疾病预测,经济预测等方面。 优点:计算代价低,思路清晰易于理解和实现;…