Scikit-learn决策树应用篇

写在之前

之前的博文较为详细介绍了scikit的参数和说明:http://www.jianshu.com/p/59b510bafb4d
本文是在此基础上做的一个应用,涉及的数据和程序可以在下面的连接中下载:http://pan.baidu.com/s/1o8rW4m2
如需转载,请注明出处。如有错误,烦请指正。

关于决策树

决策树是一种典型的分类方法,功能强大且容易提取规则,利用归纳算法生成决策树,树中每一条路径代表一个规则,所以比较适合用于数据挖掘中的分类。

ID3

ID3算法主要针对属性选择问题。是决策树学习方法中最具影响和最为典型的算法。该算法是在树的各个内部节点处寻找一个属性,该属性能最好地将训练集进行分类。依据贪婪算法,为了使下一步所需的信息量最小,要求每一次都选择其信息增益最大的属性作为决策树的新节点。
算法步骤

  1. 如果数据库中的数据都属于同一个类,N就是树叶,在树叶上 标出所属的类;如果数据表中没有其他属性可以考虑,则N也是树叶,按照少
    数服从多数的原则在树叶上标出所属类别。否则,根据平均信息期望值E或GAIN值选出一个最佳属性作为节点N的测试属性
  2. 节点属性选定后,对于该属性中的每个值:从N生成一个分支,并将数据表中与该分支有关的数据收集形成分支节点的数据表,如果分支数据表非空,则运用以上方法从该节点进一步建立子树。

C4.5

在应用连续属性值时,在一个树结点可以将属性Ai的值划分为几个区间。然后信息增益的计算就可以采用和离散值处理一样的方法。原则上可以将Ai的属性划分为任意数目的空间。C4.5一般包含3种类型的检验结构:

  1. 离散属性的“标准检验”,对属性的每个可能值有一个分支和输出
  2. 如果Y有连续的数值,则比较该值和阈值,来定义输出为Y<=Z和Y>Z的二元检验
  3. 更复杂的检验也基于离散值,属性的每个可能值都分配到数量可变的组中,每组都有一个输出和分支

检验连续属性可以根据算法计算出最右的阈值:首先根据属性值Y移除重复值并对训练样本排序,结果用{V_1, V_2,···,V_m}表示。介于V_i和V_i+1之间阈值将样本划分成{V_1, ···V_i}和{V_{i+1},···V_m}两个区间。系统检查所有分区,分别求用每个数字拆分的信息增益,然后找出使信息增益获得最大的拆分值,以求得最优分区。通常选择(V_i+V_{i+1})/2作为阈值。C4.5一般选择V_i作为阈值。这确保了决策树实际的阈值存在于数据库中。

过度拟合

实际应用中,当数据中有噪声或训练样例的数量太少以至于不能产生目标函数的有代表性的采样时,产生的树会过度拟合。简单的表现为:训练集的误差会比测试集的误差高。
解决过度拟合

  1. 及早停止树增长;
  2. 后修剪法。

后修剪法

将决策树规则化按决策树从左往右的顺序,用if-then写出各个规则,并计算各个规则的精度,对于准确率为100%的规则进行保留,否则需要将if中的条件重新,找到能够使得准确率最高的一组组合,代替原来的规则。

实验部分


数据分析:影响因素有天气、温度、风况、运动。需要根据这四个决定是否运动。其中温度和湿度是连续数据,所以不能用ID3的算法,而天气、风况、运动需要转换成数值型的数据,以便于计算机进行分类。
实现方法:本着不重复造轮子的原则,如果需要快速实现,只需要使用sklearn中的DecisionTreeClassifier就能快速实现,并利用pydotplus快速实现决策树的可视化

程序部分

import pandas as pd
from pandas import Series
import numpy as np
import pydotplus
from sklearn import tree
from sklearn.externals.six import StringIO

# load data
datadic = 'data/data1.xls'
mydata = pd.read_excel(datadic)

# prepare
whetherlist = []
windlist =[]
resultlist = []
for i in range(len(mydata)):
    if mydata.ix[i][u'天气'] == u'晴':
        whetherlist.append(0)
    elif mydata.ix[i][u'天气'] == u'多云':
        whetherlist.append(1)
    elif mydata.ix[i][u'天气'] == u'有雨':
        whetherlist.append(2)
    if mydata.ix[i][u'风况'] == u'有':
        windlist.append(1)
    elif mydata.ix[i][u'风况'] == u'无':
        windlist.append(0)
    if mydata.ix[i][u'运动'] == u'适合':
        resultlist.append(1)
    elif mydata.ix[i][u'运动'] == u'不适合':
        resultlist.append(0)
mydata[u'天气']=Series(whetherlist)#将中文数据数值化
mydata[u'风况']=Series(windlist)
mydata[u'运动']=Series(resultlist)

xdata = mydata.values[:,:4]
ydata = mydata.values[:,4]


# 建模:min_sample_split将划分进行到底,如果设置是默认的2的时候将会有一部分划分不准确,但是这样做有过拟合的风险
clf = tree.DecisionTreeClassifier(criterion='entropy',min_samples_split=1)#信息熵作为划分的标准,CART
clf = clf.fit(xdata, ydata)
dot_data = StringIO()
tree.export_graphviz(clf, out_file=dot_data,feature_names=['whether','Temperature',\
'wet','wind'], class_names=['no', 'yes'], filled=True, rounded=True, special_characters=True) 
graph = pydotplus.graph_from_dot_data(dot_data.getvalue()) 

#导出
graph.write_pdf('sport.pdf')
graph.write_png('sport.png')

结果

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 决策树理论在决策树理论中,有这样一句话,“用较少的东西,照样可以做很好的事情。越是小的决策树,越优于大的决策树”。...
    制杖灶灶阅读 5,832评论 0 25
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 分类与预测 餐饮企业经常会碰到下面的问题: 如何预测未来一段时间内,哪些顾客会流失,哪些顾客最有可能成为VIP客户...
    Skye_kh阅读 6,288评论 3 15
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,073评论 0 12
  • 昨天我给我妈喂水的时候,瑶瑶在旁边写作业。我边喂水边故意说:“你姥姥是坏姥姥,不亲瑶瑶,却生病。” 瑶瑶很...
    我是小渔阅读 178评论 0 0