没有合适的资源?快使用搜索试试~ 我知道了~
首页Python3 ID3决策树判断申请贷款是否成功的实现代码
资源详情
资源评论
资源推荐

Python3 ID3决策树判断申请贷款是否成功的实现代码决策树判断申请贷款是否成功的实现代码
主要介绍了Python3 ID3决策树判断申请贷款是否成功的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
1. 定义生成树定义生成树
# -*- coding: utf-8 -*-
#生成树的函数
from numpy import *
import numpy as np
import pandas as pd
from math import log
import operator
# 计算数据集的信息熵(Information Gain)增益函数(机器学习实战中信息熵叫香农熵)
def calcInfoEnt(dataSet):#本题中Label即好or坏瓜 #dataSet每一列是一个属性(列末是Label)
numEntries = len(dataSet) #每一行是一个样本
labelCounts = {} #给所有可能的分类创建字典labelCounts
for featVec in dataSet: #按行循环:即rowVev取遍了数据集中的每一行
currentLabel = featVec[-1] #故featVec[-1]取遍每行最后一个值即Label
if currentLabel not in labelCounts.keys(): #如果当前的Label在字典中还没有
labelCounts[currentLabel] = 0 #则先赋值0来创建这个词
labelCounts[currentLabel] += 1 #计数, 统计每类Label数量(这行不受if限制)
InfoEnt = 0.0
for key in labelCounts: #遍历每类Label
prob = float(labelCounts[key])/numEntries #各类Label熵累加
InfoEnt -= prob * log(prob,2) #ID3用的信息熵增益公式
return InfoEnt
### 对于离散特征: 取出该特征取值为value的所有样本
def splitDiscreteDataSet(dataSet, axis, value): #dataSet是当前结点(待划分)集合,axis指示划分所依据的属性,value该属性用于划分的取值
retDataSet = [] #为return Data Set分配一个列表用来储存
for featVec in dataSet:
if featVec[axis] == value:
reducedFeatVec = featVec[:axis] #该特征之前的特征仍保留在样本dataSet中
reducedFeatVec.extend(featVec[axis+1:]) #该特征之后的特征仍保留在样本dataSet中
retDataSet.append(reducedFeatVec) #把这个样本加到list中
return retDataSet
### 对于连续特征: 返回特征取值大于value的所有样本(以value为阈值将集合分成两部分)
def splitContinuousDataSet(dataSet, axis, value):
retDataSetG = [] #将储存取值大于value的样本
retDataSetL = [] #将储存取值小于value的样本
for featVec in dataSet:
if featVec[axis] > value:
reducedFeatVecG = featVec[:axis]
reducedFeatVecG.extend(featVec[axis+1:])
retDataSetG.append(reducedFeatVecG)
else:
reducedFeatVecL = featVec[:axis]
reducedFeatVecL.extend(featVec[axis+1:])
retDataSetL.append(reducedFeatVecL)
return retDataSetG,retDataSetL #返回两个集合, 是含2个元素的tuple形式
### 根据InfoGain选择当前最好的划分特征(以及对于连续变量还要选择以什么值划分)
def chooseBestFeatureToSplit(dataSet,labels):
numFeatures = len(dataSet[0])-1
baseEntropy = calcInfoEnt(dataSet)
bestInfoGain = 0.0; bestFeature = -1
bestSplitDict = {}
for i in range(numFeatures):
#遍历所有特征:下面这句是取每一行的第i个, 即得当前集合所有样本第i个feature的值
featList = [example[i] for example in dataSet]
#判断是否为离散特征
if not (type(featList[0]).__name__=='float' or type(featList[0]).__name__=='int'):
# 对于离散特征:求若以该特征划分的熵增
uniqueVals = set(featList) #从列表中创建集合set(得列表唯一元素值)
newEntropy = 0.0
for value in uniqueVals: #遍历该离散特征每个取值
subDataSet = splitDiscreteDataSet(dataSet, i, value)#计算每个取值的信息熵
prob = len(subDataSet)/float(len(dataSet))
newEntropy += prob * calcInfoEnt(subDataSet)#各取值的熵累加
infoGain = baseEntropy - newEntropy #得到以该特征划分的熵增
# 对于连续特征:求若以该特征划分的熵增(区别:n个数据则需添n-1个候选划分点, 并选最佳划分点)
else: #产生n-1个候选划分点
sortfeatList=sorted(featList)
splitList=[]
for j in range(len(sortfeatList)-1): #产生n-1个候选划分点
splitList.append((sortfeatList[j] + sortfeatList[j+1])/2.0)
bestSplitEntropy = 10000 #设定一个很大的熵值(之后用)
#遍历n-1个候选划分点: 求选第j个候选划分点划分时的熵增, 并选出最佳划分点
for j in range(len(splitList)):
value = splitList[j]
newEntropy = 0.0
DataSet = splitContinuousDataSet(dataSet, i, value)
subDataSetG = DataSet[0]
subDataSetL = DataSet[1]
probG = len(subDataSetG) / float(len(dataSet))
newEntropy += probG * calcInfoEnt(subDataSetG)
probL = len(subDataSetL) / float(len(dataSet))
newEntropy += probL * calcInfoEnt(subDataSetL)
if newEntropy < bestSplitEntropy:
bestSplitEntropy = newEntropy
bestSplit = j
bestSplitDict[labels[i]] = splitList[bestSplit]#字典记录当前连续属性的最佳划分点
infoGain = baseEntropy - bestSplitEntropy #计算以该节点划分的熵增
# 在所有属性(包括连续和离散)中选择可以获得最大熵增的属性
if infoGain > bestInfoGain:
bestInfoGain = infoGain
bestFeature = i
#若当前节点的最佳划分特征为连续特征,则需根据“是否小于等于其最佳划分点”进行二值化处理
#即将该特征改为“是否小于等于bestSplitValue”, 例如将“密度”变为“密度<=0.3815”
#注意:以下这段直接操作了原dataSet数据, 之前的那些float型的值相应变为0和1
#【为何这样做?】在函数createTree()末尾将看到解释
if type(dataSet[0][bestFeature]).__name__=='float' or type(dataSet[0][bestFeature]).__name__=='int':
bestSplitValue = bestSplitDict[labels[bestFeature]]
labels[bestFeature] = labels[bestFeature] + '<=' + str(bestSplitValue)
for i in range(shape(dataSet)[0]):
if dataSet[i][bestFeature] <= bestSplitValue:
dataSet[i][bestFeature] = 1
else:
dataSet[i][bestFeature] = 0
return bestFeature
# 若特征已经划分完,节点下的样本还没有统一取值,则需要进行投票:计算每类Label个数, 取max者
def majorityCnt(classList):
classCount = {} #将创建键值为Label类型的字典
for vote in classList:
if vote not in classCount.keys():
classCount[vote] = 0 #第一次出现的Label加入字典
classCount[vote] += 1 #计数
return max(classCount)
2. 递归产生决策树递归产生决策树

















weixin_38697063
- 粉丝: 5
- 资源: 958
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
最新资源
- ARM Cortex-A(armV7)编程手册V4.0.pdf
- ABB机器人保养总结解析.ppt
- 【超详细图解】菜鸡如何理解双向链表的python代码实现
- 常用网络命令的使用 ipconfig ping ARP FTP Netstat Route Tftp Tracert Telnet nslookup
- 基于单片机控制的DC-DC变换电路
- RS-232接口电路的ESD保护.pdf
- linux下用time(NULL)函数和localtime()获取当前时间的方法
- Openstack用户使用手册.docx
- KUKA KR 30 hA,KR 60 hA机器人产品手册.pdf
- Java programming with JNI
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

评论0