sklearn决策树源码,python决策树剪枝算法

  sklearn决策树源码,python决策树剪枝算法

  利用决策树为一系列数据寻找最佳分类方法;

  DataSet=[[长,太,男],

  [矮,太,男],

  [矮,太,男],

  [长,瘦,女],

  [矮,瘦,女],

  [矮,太,女],

  [长,太,女],

  [长,太,女]

  想法:现实生活中,第一个同学A可以先从头发判断,得到如下图的想法。

  这是一个简单的决策树。每个分类标准根据不同的标准重新分类。

  b同时在考虑另一个想法。先按声音分类,再按头发分类。

  在最终的结果中,如何判断分类结果的好坏?

  数据划分的基础之一是减少数据的不确定性,所以可以用数据的不确定性来判断结果。

  这里需要介绍一下克劳德香农定义的熵的概念。信息分布的不确定性可以用熵值来度量。熵值越大,不确定性越大,信息分布越均匀,中间差值变化越大,信息增益越大。信息增益可以衡量某些特征对分类结果的影响。

  该企业的计算公式如下:

  信息增益表示两个信息熵之差。

  1;首先,在分类之前计算总熵。有8名学生,3名男性,5名女性。

  2;A老师的头发分类结果如下。

  A老师分类结果的熵值:H1=(4/8)1)4/8) *0.8113=0.9507

  也可以计算B的分类结果。

  乙方分类结果的熵值为H2=(6/8)1)2/8) *0=0.75。

  3;比较学生A和B的信息增益值:

  所以B的分类标准信息增益最大,分类结果也最有代表性。

  通过以上分析,可以得到一个简单的分析过程。

  选择我们要分析的数据,以上面的数据为例。

  从math导入日志

  进口经营者

  计算差异交换(数据):#数据的熵

  Num entries=len (data) #数据条目数

  labelCounts={}

  对于数据集中的featVec:

  Current=featvec [-1] #每行数据的最后一个字(类别)

  ifcurrentlabelnotinlabelcounts . keys():

  count[当前标签]=0

  Label Counties [current label]=1 #有几个类,统计每个类的数量。

  shannonEnt=0

  对于标签帐户中的密钥:

  prob=float(label count[key])/numEntries #计算单个类的熵。

  Shannonent-=prob*log(prob,2) #累加每个类的熵。

  返回香农ent

  创建efcreatedataset1(:)的样本数据

  DataSet=[[长,太,男],

  [矮,太,男],

  [矮,太,男],

  [长,瘦,女],

  [矮,瘦,女],

  [矮,太,女],

  [长,太,女],

  [长,太,女]

  Labels=[头发,声音] #两个功能

  返回数据、标签

  Defsplitdataset(数据集,轴,值):#按特征分类的数据

  retDataSet=[]

  对于数据集中的featVec:

  if featVec[轴]==值:

  reducedfeatvec=feat vec [ : axis ]

  reducedfeatvec . extend(feat vec[axis 1:]))))))).

  ret dataset . append(reducedfeatvec).

  返回ret数据集

  ChooseBestFeaturesSplit(dataset):#选择最佳分类特征。

  Num features=len(数据集[0]-1

  基础熵=calcshannonent(数据集)#原始熵

  bestInfoGain=0

  bestFeature=-1

  傅立叶变换(数量特征):

  fat list=[example[I]for example indataset]

  唯一vals=集合(功能列表)

  新企业=0

  对于唯一值:

  子数据=拆分数据(数据,I,值))。

  Prob=len(子数据)/floating(浮动数据))

  新熵=prob * calcshannonent(子数据集)特征熵

  增益=基础熵-新熵#原始熵和按特征分类的熵之间的差

  如果使用if (information basis): #特征进行分类,如果熵下降最多,则该子特征为最佳分类特征。

  bestInfoGain=信息增益

  bestFeature=i

  返回基本功能

  按defmajorityCNT(classlist)分类后的类别数排序:#,比如最后分类为2男1女后,判定为男性;

  classCount={}

  对于类别列表中的投票:

  如果vote不在classCount.keys()中:

  classCount[vote]=0

  类别[投票]=1

  已排序的类计数=已排序的(类计数。items(,key=operator.itemgetter(1),reverse=True).

  返回安全类计数[0] [0]

  efcreatetree(数据,标签) :

  类列表=[示例[-1]用于样本数据集合]#类别:男性或女性

  如果类列表。count(类列表[0])==len(类列表):

  返回类列表[0]

  iflen(dataset[0] )==1:

  重新命名列表(类列表) )。

  最佳壮举=choosebestfeaturetosplit(数据) #选择最佳特征

  bestFeatLabel=labels[bestFeat]

  myTree={bestFeatLabel:{}} #分类结果以词典格式保存

  (戴尔(labels [ bestfeat ])标签)(标签)(标签)(标签)(标签)(标签)(标签)(标签)。

  脂肪值=[数据集中的示例[最佳专长]

  唯一值=集合(特征值)

  对于唯一值:

  子标签=标签[:]

  我的树[最佳特性标签] [值]=创建树(拆分数据集3

  (数据、最佳、值)、辅助标签)

  返回我的树

  if __name__==__main__ :

  数据,标签=创建数据1 (#创建演示数据

  打印(创建树)数据,标签) )输出决策树模型的结果

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: