机器学习实战_初识决策树算法_理解其python代码(一)

来源:互联网 发布:淘宝网怎样和微信绑定 编辑:程序博客网 时间:2024/06/05 19:22

这是经过我修改后能在python3.0中完美运行的Tree决策树 project源码,可以直接拿来学习:
http://download.csdn.net/download/qq_36396104/10142842

(一)计算给定数据集的香农熵(个人理解为计算给定信息集纯度的一种数学计算指标):

from math import logdef calcShannonEnt(dataSet):#calculata shannonEnt    numEntries = len(dataSet)    labelCounts = {}    for featVec in dataSet:#将当前键值加入字典并记录类别出现的次数        currentLabel = featVec[-1]        if currentLabel not in labelCounts.keys():            labelCounts[currentLabel] = 0        labelCounts[currentLabel] += 1    shannonEnt = 0.0    for key in labelCounts:#计算香农熵        prob = float(labelCounts[key])/numEntries#使用所有类标签的发生频率计算类别出现的概率        shannonEnt -= prob*log(prob,2)#得到香农熵    return shannonEnt

测试代码:

def createDataSet():    dataSet = [[1,1,'maybe'],               [1, 1,'yes'],               [1,0,'no'],               [0,1,'no'],               [0,1,'no']]    labels = ['no surfacing','flippers']    return dataSet,labels#放在另一个py文件内的test:import CreateDataSetimport treesmyDat,labels=CreateDataSet.createDataSet()print(myDat)print(trees.calcShannonEnt(myDat))

(二)划分数据集:
需要的python基础:也可看我整理出来的文章

列表解析(列表推导):

前期准备(人为划分,给定属性以及相应的值,作为后面函数的调用)

def splitDataSet(dataSet,axis,value):#将属性axis中满足值为value的数据划分出来
retDataSet = []#Python在函数中传递的是列表的引用,在函数内部对列表对象的修改将会影响该列表的整个生命周期。为了消除这个不良影响,需要在函数的开始声明一个新列表对象。
for featVec in dataSet:
if featVec[axis] == value:
reducedFeatVec = featVec[:axis]#通过以下两步可得到满足所给条件的除去属性(axis+1发挥的作用)axis的数据
reducedFeatVec.extend(featVec[axis+1:])
retDataSet.append(reducedFeatVec)
return retDataSet

测试代码:

import CreateDataSet
import trees

myDat,labels=CreateDataSet.createDataSet()
print(trees.splitDataSet(myDat,1,1))

正式划分:(利用信息增益得到所有属性中最适合划分的一个)

def chooseBestFeatureToSplit(dataSet):
numFeatures = len(dataSet[0]) - 1
baseEntropy = calcShannonEnt(dataSet)
bestInfoGain = 0.0;bestFeature=-1
for i in range(numFeatures):
featList = [example[i] for example in dataSet]#列表解析(推导),得到dataSet中的第i个属性的所有取值eg:(1,1,1,0,0)
uniqueVals = set (featList)#通过集合中元素唯一的特性,将得到的featList中的重复元素变唯一eg:(1,0)
newEntropy = 0.0
for value in uniqueVals:
subDataSet = splitDataSet(dataSet,i,value)
prob = len(subDataSet)/float(len(dataSet))
newEntropy += prob * calcShannonEnt(subDataSet)
infoGain = baseEntropy - newEntropy
if(infoGain > bestInfoGain):
bestInfoGain = infoGain
bestFeature = i
return bestFeature

test:

import CreateDataSet
import trees

myDat,labels=CreateDataSet.createDataSet()
print(trees.chooseBestFeatureToSplit(myDat))
“`

阅读全文
1 0