楼主: 乐文义
1666 2

简单决策树的python实现 [推广有奖]

  • 1关注
  • 1粉丝

大专生

98%

还不是VIP/贵宾

-

威望
0
论坛币
55 个
通用积分
2.1441
学术水平
2 点
热心指数
4 点
信用等级
2 点
经验
460 点
帖子
24
精华
0
在线时间
108 小时
注册时间
2017-1-15
最后登录
2020-6-22

楼主
乐文义 发表于 2018-3-21 09:22:28 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
  1. # coding: utf-8

  2. # In[28]:


  3. #####香农熵
  4. from math import log
  5. import operator
  6. def calcShannonEnt(dataSet):
  7.     numEntries=len(dataSet)
  8.     labelCounts={}
  9.     for featVec in dataSet:
  10.         currentLabel = featVec[-1]
  11.         if currentLabel not in labelCounts.keys():
  12.             labelCounts[currentLabel] = 0
  13.         labelCounts[currentLabel] += 1
  14.     shannonEnt = 0.0
  15.     for key in labelCounts:
  16.         prob = float(labelCounts[key])/numEntries
  17.         shannonEnt -= prob * log(prob,2)
  18.     return shannonEnt


  19. # In[6]:


  20. def createDataSet():
  21.     dataSet = [[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]
  22.     labels=['no surfacing','flippers']
  23.     return dataSet, labels


  24. # In[9]:


  25. #############划分数据集
  26. def splitDataSet(dataSet,axis,value):
  27.     retDataSet = []
  28.     for featVec in dataSet:
  29.         if featVec[axis] == value:
  30.             reducedFeatVec = featVec[:axis]
  31.             reducedFeatVec.extend(featVec[axis+1:])
  32.             retDataSet.append(reducedFeatVec)
  33.     return retDataSet


  34. # In[26]:


  35. #######选择最佳划分
  36. def chooseBestFeatureToSplit(dataSet):
  37.     numFeatures = len(dataSet[0]) - 1
  38.     baseEntropy = calcShannonEnt(dataSet)
  39.     bestInfoGain = 0.0;bestFeature = -1
  40.     for i in range(numFeatures):
  41.         featList = [example[i] for example in dataSet]
  42.         uniqueVals = set(featList)
  43.         newEntropy = 0.0
  44.         for value in uniqueVals:
  45.             subDataSet = splitDataSet(dataSet,i,value)
  46.             prob =len(subDataSet)/float(len(dataSet))
  47.             newEntropy += prob* calcShannonEnt(subDataSet)
  48.         infoGain = baseEntropy - newEntropy
  49.         if (infoGain > bestInfoGain):
  50.             bestInfoGain = infoGain
  51.             bestFeature = i
  52.     return bestFeature


  53. # In[29]:


  54. ####投票决定标签
  55. def majorityCnt(classList):
  56.     classCount = {}
  57.     for vote in classList:
  58.         if vote not in classCount.keys(): classCount[vote] = 0
  59.         classCount[vote] +=1
  60.     sortedClassCount = sorted(classCount.iteritems(),                             key=operator.itemgetter(1),reverse = True)
  61.     return sortedClassCount[0][0]


  62. # In[32]:


  63. #####递归构造决策树
  64. def createTree(dataSet,labels):
  65.     classList = [example[-1] for example in dataSet]
  66.     if classList.count(classList[0]) == len(classList):
  67.         return classList[0]
  68.     if len(dataSet[0]) == 1:
  69.         return majorityCnt(classList)
  70.     bestFeat = chooseBestFeatureToSplit(dataSet)
  71.     bestFeatLabel = labels[bestFeat]
  72.     myTree = {bestFeatLabel:{}}
  73.     del(labels[bestFeat])
  74.     featValues = [example[bestFeat] for example in dataSet]
  75.     uniqueVals = set(featValues)
  76.     for value in uniqueVals:
  77.         subLabels = labels[:]
  78.         myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet,bestFeat,value),subLabels)
  79.     return myTree


  80. # In[33]:


  81. ####测试
  82. myDat,labels =createDataSet()
  83. print(myDat)
  84. splitDataSet(myDat,0,0)
  85. chooseBestFeatureToSplit(myDat)
  86. myTree = createTree(myDat,labels)
  87. myTree
复制代码


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python 决策树 Majority operator features python python核心编程 决策树算法

沙发
escaflowne1985 在职认证  发表于 2018-3-23 11:24:59
代码能跑通 如果有可视化就最好了 希望添加

藤椅
xushaojies 发表于 2019-8-19 16:31:02 来自手机
不懂

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-27 04:20