目录
1、ID3算法
以下实现了决策树的创建、可视化绘制、决策树的保存和调用
但是在利用决策树进行预测的时候出现错误
分类代码
#实用决策树进行分类
def classify(inputTree, featLabels, testVec):
firstStr = inputTree.keys()[0]
secondDict = inputTree[firstStr]
featIndex = featLabels.index(firstStr)
for key in secondDict.keys():
if testVec[featIndex] == key:
if type(secondDict[key]).__name__ == 'dict':
classLabel = classify(secondDict[key], featLabels, testVec)
else: classLabel = secondDict[key]
return classLabel
UnboundLocalError: local variable 'classLabel' referenced before assignment
暂时未解决
完整代码
from dataProcess import loaddatasets
from math import log
import operator
import json
import numpy as np
from paths import abs_path
##数据集
def createDataSet(xlsPath):
"""
创建数据集
"""
datas, labels = loaddatasets(xlsPath)
labels = labels.reshape(-1, 1)
dataSet = np.hstack((datas, labels))
dataSet = dataSet.tolist()
featureName = ['能效设计', '含油舱底水污染控制', '污油污染控制', '餐饮污水控制', '生活污水控制', '发动机排气污染物控制',
'制冷剂', '灭火剂', '垃圾污染控制', '防止噪声污染', '应用比例', '振动', '噪声', '有害物质的禁用和限用']
# 返回数据集和每个维度的名称
return dataSet, featureName
##分割数据集
def splitDataSet(dataSet, axis, value):
"""
按照给定特征划分数据集
:param axis:划分数据集的特征的维度
:param value:特征的值
:return: 符合该特征的所有实例(并且自动移除掉这维特征)
"""
# 循环遍历dataSet中的每一行数据
retDataSet = []
for featVec in dataSet:
if featVec[axis] == value:
reduceFeatVec = featVec[:axis] # 删除这一维特征
reduceFeatVec.extend(featVec[axis + 1:])
retDataSet.append(reduceFeatVec)
return retDataSet
def majorityCnt(classList):
classCount = {}
for vote in classList:
# 统计classList中每个元素出现的次数
if vote not in classCount.keys():
classCount[vote] = 0
classCount[vote] += 1
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) # 根据字典的值降序排序
return sortedClassCount[0][0] # 返回classList中出现次数最多的元素
##计算信息熵
# 计算的始终是类别标签的不确定度
def calcShannonEnt(dataSet):
"""
计算训练数据集中的Y随机变量的香农熵
:param dataSet:
:return:
"""
numEntries = len(dataSet) # 实例的个数
labelCounts = {}
for featVec in dataSet: # 遍历每个实例,统计标签的频次
currentLabel = featVec[-1] # 表示最后一列
# 当前标签不在labelCounts map中,就让labelCounts加入该标签
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) # log base 2
return shannonEnt
## 计算条件熵
def calcConditionalEntropy(dataSet, i, featList, uniqueVals):
"""
计算x_i给定的条件下,Y的条件熵
:param dataSet: 数据集
:param i: 维度i
:param featList: 数据集特征列表
:param unqiueVals: 数据集特征集合
:return: 条件熵
"""
ce = 0.0
for value in uniqueVals:
subDataSet = splitDataSet(dataSet, i, value)
prob = len(subDataSet) / float(len(dataSet)) # 极大似然估计概率
ce += prob * calcShannonEnt(subDataSet) # ∑pH(Y|X=xi) 条件熵的计算
return ce
##计算信息增益
def calcInformationGain(dataSet, baseEntropy, i):
"""
计算信息增益
:param dataSet: 数据集
:param baseEntropy: 数据集中Y的信息熵
:param i: 特征维度i
:return: 特征i对数据集的信息增益g(dataSet | X_i)
"""