机器学习之决策树原理与Python实现

    有一段时间没来更新博客了,这段时间总体把机器学习的几个基本原理理解了一遍,又利用Keras、opencv、tensorflow等将人脸识别,汉字识别等功能重新实现了一遍,算是有点小感悟。接下来会针对每一种机器学习算法原理做详细讲解以及工程实现。因为在实际工作中,虽然有很多很成熟的框架可以用,但是如何用好,达到一定效率和效果就依赖对原理的理解了。废话不多说了,开始我们的学习之旅吧!

一、关键问题

决策树的本质问题就是计算信息增益值,然后根据信息增益值最大选择最优特征分类,那么问题来了,什么是信息增益呢?这其实是概率统计里面的概念,可以这样理解:就是某一项特征值,通过某种概率统计计算公式得到它在总体情况下由它决定结果概率的大小。

公式如下:

   设特征A有n个不同的取值{a1,a2,···,an},根据特征A的取值将D划分为n个子集D1,D2,···,Dn,|Di|为Di的样本个数。记子集Di中属于Ck的样本的集合为Dik,即Dik = Di ∩ Ck,|Dik|为Dik的样本个数。于是经验条件熵的公式可以些为:

接下来是编码实现公式的问题了!!

1、第一步

拿到数据集,我们首先计算数据集的香龙熵H,这个很简单,根据公式计算即可,python代码如下


def calShan(dataset):
m=len(dataset)
labeldic={}
for fe in dataset:
	
	if fe[-1] not in labeldic.keys():
		labeldic[fe[-1]]=0
	labeldic[fe[-1]]+=1
shno=0.0
for key in labeldic:
	pro=float(labeldic[key]/m)
	shno-=pro*log(pro,2)
return shno

2、第二步

计算信息增益,这里就是利用以上的公式,这里需要注意的是我们计算每个特征下每一个类别的熵H(Di)时需要先将数据集进行分离,建立对应类别的子集,然后调用第一步对应的方法就可以计算了,Python代码如下

def splitdata(dataset,i,val):
#m=len(dataset)
subdata=[]
for fec in dataset:
	if fec[i]==val:
		newfec=fec[:i]
		newfec.extend(fec[i+1:])
		subdata.append(newfec)
return subdata

def calzeyi(dataset):
numfec=len(dataset[0])-1
baseSh=calShan(dataset)
#print(baseSh)
zeyi=[]
newSh=0.0
for i in range(numfec):
	featlist=[example[i] for example in dataset]
	fea=set(featlist)
	print(fea)
	for val in fea:
		subdata=splitdata(dataset,i,val)
		#print(subdata)
		pro=len(subdata)/float(len(dataset))
		newSh+=pro*calShan(subdata)
	subzeyi=baseSh-newSh
	zeyi.append(subzeyi)
return zeyi

第三步、利用最优特征值进行分类

在第二部中已经得到如何计算一个数据集的信息增益,就可以选择出具有决定性的分类特征,然后根据特征的类别划分子集,然后递归,对子集重复计算信息增益,分类,直到有确定的分类结果为止

决策树优缺点

优点:理解简单,需要的数据集不大,能够处理多输出问题

缺点:容易过拟合,不稳定,微小的变化可能导致大的分类错误

本文参考: https://blog.csdn.net/c406495762/article/details/75663451
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值