发现帮助新手入门机器学习的一篇好文,首先感谢博主!:用Python开始机器学习(2:决策树分类算法)

J. Ross Quinlan在1975提出将信息熵的概念引入决策树的构建,这就是鼎鼎大名的ID3算法。后续的C4.5, C5.0, CART等都是该方法的改进。

熵就是“无序,混乱”的程度。刚接触这个概念可能会有些迷惑。想快速了解如何用信息熵增益划分属性,可以参考这位兄弟的文章:http://blog.csdn.net/alvine008/article/details/37760639

数据集中信息熵的计算:

H(x) = E[I(xi)] = E[ log(2,1/p(xi)) ] = -∑p(xi)log(2,p(xi)) (i=1,2,..n)

以博主例子为例,直接上代码:

1. 数据集:

 more fat.txt
1.5 thin
1.5 fat
1.6 thin
1.6 fat
1.7 thin
1.7 fat
1.8 thin
1.8 fat
1.9 thin
1.9 fat

2. 读入数据集

#!/usr/bin/env python
# coding=utf- import numpy as np
from sklearn import tree
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import classification_report
from sklearn.cross_validation import train_test_split def loadDataSet():
data =[]
label= []
with open('./data/fat.txt') as file:
for line in file:
tokens = line.strip().split(' ')
data.append([float(tk) for tk in tokens[:-]])
label.append(tokens[-])
x = np.array(data)
label = np.array(label)
y = np.zeros(label.shape)
y[label=='fat']=
return x,y

3. 使用sklearn 中的现成库进行分类,简单而优雅

def decisionTreeClf():
x,y = loadDataSet() # 拆分数据集和训练集
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2) # 使用信息熵作为划分标准
clf = tree.DecisionTreeClassifier(criterion='entropy')
print(clf)
clf.fit(x_train,y_train) # 将决策树写入文件
with open("tree.dot","w") as f:
f = tree.export_graphviz(clf,out_file=f) # 打印特征在分类起到的作用性
print(clf.feature_importances_) # 打印测试结果
answer = clf.predict(x_train)
print(x_train)
print(answer)
print(y_train)
print(np.mean(answer==y_train)) # 准确率与召回率
precision,recall,thresholds = precision_recall_curve(y_train,clf.predict(x_train)
)
answer = clf.predict_proba(x)[:,]
print(classification_report(y,answer,target_names=['thin','fat']))

结果显示:

>>> bayesDt.decisionTreeClf()
DecisionTreeClassifier(class_weight=None, criterion='entropy', max_depth=None,
max_features=None, max_leaf_nodes=None, min_samples_leaf=,
min_samples_split=, min_weight_fraction_leaf=0.0,
random_state=None, splitter='best')
[ 0.2488562 0.7511438]
[[ 1.9 . ]
[ 1.5 . ]
[ 1.5 . ]
[ 1.7 . ]
[ 1.9 . ]
[ 1.6 . ]
[ 1.8 . ]
[ 1.8 . ]]
[ . . . . . . . .]
[ . . . . . . . .]
1.0
precision recall f1-score support thin 0.83 1.00 0.91
fat 1.00 0.80 0.89 avg / total 0.92 0.90 0.90 >>>

这里有3点需要说明,这在以后的机器学习中都会用到。

1、拆分训练数据与测试数据

这样做是为了方便做交叉检验。交叉检验是为了充分测试分类器的稳定性。代码中的0.2表示随机取20%的数据作为测试用。其余80%用于训练决策树。

也就是说10个样本中随机取8个训练。本文数据集小,多运行几次,可以看到由于取的训练数据随机,每次构建的决策树都不一样。

2、特征的不同影响因子。

样本的不同特征对分类的影响权重差异会很大。分类结束后看看每个样本对分类的影响度也是很重要的。

在本例中,身高的权重为0.25,体重为0.75,可以看到重量的重要性远远高于身高。对于胖瘦的判定而言,这也是相当符合逻辑的。

3、准确率与召回率

这2个值是评判分类准确率的一个重要标准。比如代码的最后将所有10个样本输入分类器进行测试的结果:

测试结果:array([ 0.,  1.,  0.,  1.,  0.,  1.,  0.,  1.,  0.,  0.])
真实结果:array([ 0.,  1.,  0.,  1.,  0.,  1.,  0.,  1.,  0.,  1.])

分为thin的准确率为0.83。是因为分类器分出了6个thin,其中正确的有5个,因此分为thin的准确率为5/6=0.83。

分为thin的召回率为1.00。是因为数据集中共有5个thin,而分类器把他们都分对了(虽然把一个fat分成了thin!),召回率5/5=1。

分为fat的准确率为1.00,召回率为0.80。是因为数据集中共有5个fat,而分类器只分出了4个(把一个fat分成了thin!),召回率4/5=0.80。

很多时候,尤其是数据分类难度较大的情况,准确率与召回率往往是矛盾的。你可能需要根据你的需要找到最佳的一个平衡点。

比如本例中,你的目标是尽可能保证找出来的胖子是真胖子(准确率),还是保证尽可能找到更多的胖子(召回率)。

python 之 决策树分类算法的更多相关文章

  1. 用Python开始机器学习(2:决策树分类算法)

    http://blog.csdn.net/lsldd/article/details/41223147 从这一章开始进入正式的算法学习. 首先我们学习经典而有效的分类算法:决策树分类算法. 1.决策树 ...

  2. 决策树分类算法及python代码实现案例

    决策树分类算法 1.概述 决策树(decision tree)——是一种被广泛使用的分类算法. 相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置 在实际应用中,对于探测式的知识发现 ...

  3. spark 决策树分类算法demo

    分类(Classification) 下面的例子说明了怎样导入LIBSVM 数据文件,解析成RDD[LabeledPoint],然后使用决策树进行分类.GINI不纯度作为不纯度衡量标准并且树的最大深度 ...

  4. Python实现决策树ID3算法

    主要思想: 0.训练集格式:特征1,特征2,...特征n,类别 1.采用Python自带的数据结构字典递归的表示数据 2.ID3计算的信息增益是指类别的信息增益,因此每次都是计算类别的熵 3.ID3每 ...

  5. DNS通道检测 国内学术界研究情况——研究方法:基于特征或者流量,使用机器学习决策树分类算法居多

    http://xuewen.cnki.net/DownloadArticle.aspx?filename=BMKJ201104017&dbtype=CJFD<浅析基于DNS协议的隐蔽通道 ...

  6. day-7 一个简单的决策树归纳算法(ID3)python编程实现

    本文介绍如何利用决策树/判定树(decision tree)中决策树归纳算法(ID3)解决机器学习中的回归问题.文中介绍基于有监督的学习方式,如何利用年龄.收入.身份.收入.信用等级等特征值来判定用户 ...

  7. 决策树ID3算法--python实现

    参考: 统计学习方法>第五章决策树]   http://pan.baidu.com/s/1hrTscza 决策树的python实现     有完整程序     决策树(ID3.C4.5.CART ...

  8. R语言学习笔记—决策树分类

    一.简介 决策树分类算法(decision tree)通过树状结构对具有某特征属性的样本进行分类.其典型算法包括ID3算法.C4.5算法.C5.0算法.CART算法等.每一个决策树包括根节点(root ...

  9. 数据挖掘领域经典分类算法 —— C4.5算法(附python实现代码)

    目录 理论介绍 什么是分类 分类的步骤 什么是决策树 决策树归纳 信息增益 相关理论基础 计算公式 ID3 C4.5 python实现 参考资料 理论介绍 什么是分类 分类属于机器学习中监督学习的一种 ...

随机推荐

  1. 玩转X-CTR100 l STM32F4 l CAN通信

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] X-CTR100控制器STM32F4处理器内置CAN ...

  2. 用MyEclipse JPA创建项目(一)

    MyEclipse 3.15 Style——在线购买低至75折!火爆开抢>> [MyEclipse最新版下载] 本教程介绍了MyEclipse中的一些基于JPA的功能. 阅读本教程时,了解 ...

  3. 使用MyEclipse开发Java EE应用:用XDoclet创建EJB 2 Session Bean项目(四)

    MyEclipse限时秒杀!活动火热开启中>> [MyEclipse最新版下载] 四.运行XDoclet代码生成 通常每次更改XDoclet EJB配置.应用程序服务器设置或修改任何EJB ...

  4. phpstorm 破解方法

    前提概要:我收到博友:3102009292 的消息,发给我另一个破解PHPstorm的方法,我亲测有效,方便快捷,在和博友商量后,决定加入我的本文章中,供更多的开发者参考,话不多说,重点来了. 按照P ...

  5. Swift3 中文手册.CHM版

    根据官方翻译制作Swift3 中文手册.CHM版已完成. Swift3 中文手册.CHM版下载地址

  6. 关于CGI和FastCGI的理解

    在搭建 LAMP/LNMP 服务器时,会经常遇到 PHP-FPM.FastCGI和CGI 这几个概念.如果对它们一知半解,很难搭建出高性能的服务器. 0.CGI的引入 在网站的整体架构中,Web Se ...

  7. C++ 泛型 编写的 数据结构 栈

    平时编程里经常需要用到数据结构,比如  栈和队列 等,  为了避免每次用到都需要重新编写的麻烦现将  C++ 编写的 数据结构   栈   记录下来,以备后用. 将 数据结构  栈   用头文件的形式 ...

  8. .NET/C# 项目如何优雅地设置条件编译符号?

    条件编译符号指的是 Conditional Compilation Symbols.你可以在 Visual Studio 的项目属性中设置,也可以直接在项目文件中写入 DefineConstants ...

  9. (4)logging(日志模块)

    日志分成几个常用的级别 debug 10 代表程序调试过程中的信息 info 20 代表普通日志信息,用户的访问等等 warning 30 警告日志,有可能出错,但是目前还没出错的 error 40 ...

  10. 【转】每天一个linux命令(18):locate 命令

    原文网址:http://www.cnblogs.com/peida/archive/2012/11/12/2765750.html locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案.其 ...