C4.5算法
C4.5算法是对ID3算法的改进,在决策树的生成过程中,使用了信息增益率作为属性选择的方法,其具体的算法步骤如下:
输入:训练数据集D,特征集A,阈值e
输出:决策树T
1.如果D中所有实例属于同一类C,则置T为单结点树,并将C作为该结点的类,返回T
2.如果A=∅,则置T为单结点树,并将D中实例数最大的类C作为该结点的类,返回T
3.否则,计算A中各特征对D的信息增益率,选择信息增益率最大的特征Ak
4.如果Ak的信息增益率小于阈值e,则置T为单结点树,并将D中实例数最大的类C作为该结点的类,返回T
5.否则,对Ak的每一个可能值ai,依Ak=ai将D分割为子集若干非空Di,将属性Ak作为一个结点,其每个属性值ai作为一个分支,分别构建子结点,由结点及其子结点构成树T,返回T
6.对结点i,以Di为训练集,以A−{Ak}为特征集,递归地调用步骤(1)∼(5)得到子树Ti,返回Ti
通过上述算法步骤可以发现,ID3算法和C4.5算法步骤基本一致,唯一的变化就是,在第四步时将ID3算法中的信息增益,改成了C4.5算法中的信息增益率。其他步骤两种算法完全一致。
代码实现
# 加载数据
def loadDataSet(dataPath):
dataset = []
with open(dataPath) as file:
lines = file.readlines()
for line in lines:
values = line.strip().split(' ')
dataset.append(values)
return dataset
# 根据属性值,分割数据集
def splitDataSet(dataset, axis, value):
retDataSet = []
for featVec in dataset:
if featVec[axis] == value:
reducedFeatVec = featVec[:axis]
reducedFeatVec.extend(featVec[axis+1:])
retDataSet.append(reducedFeatVec)
return retDataSet
# 计算数据集的信息熵
def calShannonEnt(dataset):
numEntries = len(dataset) * 1.0
labelCounts = dict()
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 = labelCounts[key] / numEntries
import math
shannonEnt -= prob * math.log(prob, 2)
return shannonEnt
# 计算分割后的数据集相较于原数据集的信息增益
def InfoGain(dataset, axis, baseShannonEnt):
featList = [example[axis] for example in dataset]
uniqueVals = set(featList)
newShannonEnt = 0.0
numEntries = len(dataset) * 1.0
for value in uniqueVals:
subDataSet = splitDataSet(dataset, axis, value)
ent = calShannonEnt(subDataSet)
prob = len(subDataSet) / numEntries
newShannonEnt += prob * ent
infoGain = baseShannonEnt - newShannonEnt
return infoGain
# 计算属性的分裂信息值
def SplitInfo(dataset, axis):
numEntries = len(dataset) * 1.0
labelsCount = dict()
ent = 0.0
for featVec in dataset:
value = featVec[axis]
if value not in labelsCount:
labelsCount[value] = 0
labelsCount[value] += 1
for key in labelsCount:
prob = labelsCount[key] / numEntries
import math
ent -= prob * math.log(prob, 2)
return ent
# 计算属性的信息增益率
def GainRate(dataset, baseset, axis, baseShannonEnt):
infoGain = InfoGain(dataset, axis, baseShannonEnt)
splitInfo = SplitInfo(baseset, axis)
return infoGain / splitInfo
# 根据信息增益率,来选择属性
def ChooseBestFeatureByGainRate(dataset, baseset):
numFeature = len(dataset[0]) - 1
baseShannonEnt = calShannonEnt(dataset)
bestGainRate = 0.0
bestFeature = -1
for i in range(numFeature):
gainRate = GainRate(dataset, baseset, i, baseShannonEnt)
if gainRate > bestGainRate:
bestGainRate = gainRate
bestFeature = i
return bestFeature
# 构建决策树
def createTree(dataset, baseset, labels):
classList = [example[-1] for example in dataset]
if classList.count(classList[0]) == len(classList):
return classList[0]
if len(dataset[0]) == 1:
return majorityCnt(classList)
bestFeature = ChooseBestFeatureByGainRate(dataset, baseset)
bestFeatureLabel = labels[bestFeature]
myTree = {bestFeatureLabel:{}}
del(labels[bestFeature])
featValues = [example[bestFeature] for example in dataset]
uniqueVals = set(featValues)
for value in uniqueVals:
subLabels = labels[:]
myTree[bestFeatureLabel][value] = \
createTree(splitDataSet(dataset, bestFeature, value), baseset, subLabels)
return myTree
C4.5算法的更多相关文章
- C4.5算法的学习笔记
有日子没写博客了,这些天忙着一些杂七杂八的事情,直到某天,老师喊我好好把数据挖掘的算法搞一搞!于是便由再次埋头看起算法来!说起数据挖掘的算法,我想首先不得的不提起的就是大名鼎鼎的由决策树算法演化而来的 ...
- 决策树-预测隐形眼镜类型 (ID3算法,C4.5算法,CART算法,GINI指数,剪枝,随机森林)
1. 1.问题的引入 2.一个实例 3.基本概念 4.ID3 5.C4.5 6.CART 7.随机森林 2. 我们应该设计什么的算法,使得计算机对贷款申请人员的申请信息自动进行分类,以决定能否贷款? ...
- 决策树之C4.5算法
决策树之C4.5算法 一.C4.5算法概述 C4.5算法是最常用的决策树算法,因为它继承了ID3算法的所有优点并对ID3算法进行了改进和补充. 改进有如下几个要点: 用信息增益率来选择属性,克服了ID ...
- C4.5算法总结
C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法.它的目标是监督学习:给定一个数据集,其中的每一个元组都能用一组属性值来描述,每一个元组属于一个互斥的类别中的某一类.C4.5的目标是通过学习, ...
- C4.5算法(摘抄)
1. C4.5算法简介 C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法.它的目标是监督学习:给定一个数据集,其中的每一个元组都能用一组属性值来描述,每一个元组属于一个互斥的类别中的某一类.C ...
- 机器学习之决策树(ID3 、C4.5算法)
声明:本篇博文是学习<机器学习实战>一书的方式路程,系原创,若转载请标明来源. 1 决策树的基础概念 决策树分为分类树和回归树两种,分类树对离散变量做决策树 ,回归树对连续变量做决策树.决 ...
- 决策树-C4.5算法(三)
在上述两篇的文章中主要讲述了决策树的基础,但是在实际的应用中经常用到C4.5算法,C4.5算法是以ID3算法为基础,他在ID3算法上做了如下的改进: 1) 用信息增益率来选择属性,克服了用信息增益选择 ...
- 机器学习总结(八)决策树ID3,C4.5算法,CART算法
本文主要总结决策树中的ID3,C4.5和CART算法,各种算法的特点,并对比了各种算法的不同点. 决策树:是一种基本的分类和回归方法.在分类问题中,是基于特征对实例进行分类.既可以认为是if-then ...
- 数据挖掘领域十大经典算法之—C4.5算法(超详细附代码)
https://blog.csdn.net/fuqiuai/article/details/79456971 相关文章: 数据挖掘领域十大经典算法之—K-Means算法(超详细附代码) ...
随机推荐
- 全景视频外包团队:技术分享Unity3D全景漫游
作者:未知 1.建模中使用的图片.文件.文件夹等以及模型中物体.材质等的名称都不能使用中文或者特殊符号,可以使用英文字母.数字.下划线等 2.调整Max的单位为米 3.烘培光影的设置 4.模型的中的植 ...
- OAF_文件系列3_实现OAF多行表中附件功能AttachmentImage(案例)
20150727 Created By BaoXinjian
- 栅格数据处理 RasterDataset RasterLayer Raster RasterBandCollection
1 IRasterLayer myrasterlayer = MapControl.Map.Layer[index] as IRasterLayer;2 IRaster myRaster = myra ...
- SeedDms 文档管理系统安装
在xampp下安装SeedDms 1.下载seeddms-quickstart-4.3.24.tar.gz,解压出来三个目录 \data\ \pear\ \seeddms-4.3.24\ 我把seed ...
- cocos2dx 2.0 CCScrollView的用法以及滑动的原理
#ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" USING_N ...
- Appium for Mac 环境准备篇
之前写过一篇Appium for windows的文章,因为是09年的T400,启动Android模拟器的时候死机三次,那就公司申请台Macbook air吧,15寸的Macbook Pro实在太重了 ...
- Mybatis保存数据时事务问题
今天不小心在sqlplus中用for update ,然后事务没提交,结果在项目中一直保存不进去数据,找了很久发现是sqlplus中的事务没提交,哎,这种问题真得避免啊,一定要细心啊!
- Fiddler抓包测试App接口
Fiddler抓包测试App接口 使用Fiddler对手机App应用进行抓包,可以对App接口进行测试,也可以了解App传输中流量使用及请求响应情况,从而测试数据传输过程中流量使用的是否合理. 抓包过 ...
- android前端开发 布局学习
元素背景设置 -------------------------------- Android中shape中的属性大全 http://www.oschina.net/question/166763_3 ...
- 上传文件时$_FILES为空的解决方法
上传视频的时候打印$_FILES为空,小的文件就没问题,后来发现是因为传的文件太大, 出现这个问题的原因主要有两个:表单原因或者php设置原因: 1,表单类型: 上传文件的表单编码类型必须设置成 en ...