大家好,又见面了,我是你们的朋友全栈君。
决策树算法
决策树算法是一种逼近离散函数值的方法。它是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类的过程。
决策树算法构造决策树来发现数据中蕴涵的分类规则.如何构造精度高、规模小的决策树是决策树算法的核心内容。决策树构造可以分两步进行。第一步,决策树的生成:由训练样本集生成决策树的过程。一般情况下,训练样本数据集是根据实际需要有历史的、有一定综合程度的,用于数据分析处理的数据集。第二步,决策树的剪技:决策树的剪枝是对上一阶段生成的决策树进行检验、校正和修下的过程,主要是用新的样本数据集(称为测试数据集)中的数据校验决策树生成过程中产生的初步规则,将那些影响预衡准确性的分枝剪除。
基本思想
序号 | 是否大学生 | 是否常去图书馆 | 是否经常参加竞赛 | 是否优秀 |
---|---|---|---|---|
1 | 是 | 是 | 是 | 是 |
2 | 是 | 是 | 否 | 是 |
3 | 是 | 否 | 是 | 否 |
4 | 否 | 是 | 否 | 否 |
5 | 否 | 是 | 否 | 否 |
6 | 是 | 否 | 是 | 是 |
7 | 是 | 否 | 是 | 是 |
8 | 是 | 是 | 是 | 是 |
9 | 否 | 是 | 是 | 否 |
10 | 是 | 是 | 否 | 否 |
步骤一、先计算数据集D的信息熵H(x),数据集D的信息熵,即在仅仅只知道类别属性的基础上的信息熵。数据记录有10条,是否优秀属性值为“是”的有5条,为“否”的5条。
总信息熵H(x)=-5/10*log2(5/10)-5/10*log2(5/10)=1
这个数值就是告诉我们,是否优秀这个不确定性为1,那么假设有人可以告诉你说:如果我告诉你一列属性值(和目标分类属性相关的属性值),那么你的这种不确定性又是多少呢?
步骤二、计算知道各个属性的前提下,数据集D的信息熵
比如知道了年龄是否大学生属性:在是大学生的特征下,有优秀的,也有不优秀的,那么总共有5个优秀,2个不优秀的;
而在不是大学生的特征下,有优秀的,也有不优秀的,那么总共有0个优秀,3个不优秀的;
H(x|大学生)=-7/10(5/7*log2(5/7) 2/7*log2(2/7))
-3/10(0/3*log2(0/3) 3/3*log2(3/3))=0.604
同理,会算出:
H(x|图书馆),H(x|经常参加竞赛)
H(x|图书馆)=-7/10(3/7*log2(3/7) 4/7*log2(4/7))
-3/10(2/3*log2(2/3) 1/3*log2(1/3))=0.965
H(x|经常参加竞赛)=-6/10(2/6*log2(2/6) 4/6*log2(4/6))
-4/10(1/4*log2(1/4) 3/4*log2(3/4))=0.875
步骤三、计算哪个的信息增益大
Gain(大学生)=H(x)-H(x|大学生)=value1=0.396
Gain(图书馆)=H(x)-H(x|图书馆)=value2=0.035
Gain(经常参加竞赛)=H(x)-H(x|经常参加竞赛)=value3=0.125
value1>value3>value2,然后根据这个结果选取“大学生”属性最为最先分类的属性。
根据大学生属性值分类之后,那么接下来数据集重新进行了划分,由重复上述步骤进行下一个分裂属性的查找。
直到到所有的特征都用完了,二是划分后额信息增益足够小,那么决策树的生长就可以停止了,最终构成一颗决策树!
具体代码:
代码语言:javascript复制import numpy as np
import xlrd
#设置数据读取路径
path='C://Users//xiaoxiannv//Desktop//tree.xlsx'
#xlrd打开数据
data=xlrd.open_workbook(path)
#读取excel的sheet
sheet1=data.sheet_by_name('Sheet1')
#原始数据放入二维数组中去
nrows=sheet1.nrows
ncols=sheet1.ncols
#初始化得到与data set相同行,列的二维数组
dataMatrix=np.zeros((nrows-1,ncols),dtype=str)
#数据放入初始化的二维数组中
for i in range(1,nrows):
dataMatrix[i-1,:]=sheet1.row_values(i)
#数值化
for i in range(nrows-1):
temp=dataMatrix[i,:]
temp[temp=='是']=1
temp[temp=='否']=0
dataMatrix[i,:]=temp
#强制转换矩阵为int
dataMatrix=dataMatrix.astype('int')
#算法 第一步
targetAtr=dataMatrix[:,-1]
#计算原始数据集的信息熵
def calcuEntropy(ta):
zeros=sum(ta==0)
ones=sum(ta==1)
sm=zeros ones
p0=zeros/sm
p1=ones/sm
if(p0==0):
p0=1
elif(p1==0):
p1=1
return -p0*np.log2(p0)-p1*np.log2(p1)
#计算加入某先验特征属性后的信息熵(也就是加入某一个知识后的信息不确定性)
entropy2=dataMatrix[:,-1]#是否优秀
entropy1=dataMatrix[:,1]#大学生
entropy3=dataMatrix[:,2]#图书馆
entropy4=dataMatrix[:,3]#竞赛
newMt=np.array([entropy1,entropy2])
newMt=np.transpose(newMt)
newMt1=np.array([entropy3,entropy2])
newMt1=np.transpose(newMt1)
newMt2=np.array([entropy4,entropy2])
newMt2=np.transpose(newMt2)
#print(newMt)
def lastEntropy(data):
#数据传进来,根据引入属性值的多少来进行数据划分
#比如引入第一列属性,总共有“是”“否”两类值,也就是根据“是”“否”把数据集划分为两类
nrows,ncols=data.shape;
yesList=[]
noList=[]
for i in range(nrows):
if(data[i,0]==1):
yesList.append(data[i,:])
else:
noList.append(data[i,:])
#根据“是”“否”把数据集划分为两类yesMatrix,noMatrix
yesMatrix=np.array(yesList)
noMatrix=np.array(noList)
#统计“是”的数据集有多少个
yM=yesMatrix.shape[0]
#统计“否”的数据集有多少个
nM=noMatrix.shape[0]
#计算各个数据集的占比,比如“是”数据集占总数据百分比,“否”数据集占总数据百分比
sM=yM nM
yPercent=yM/sM
nPercent=nM/sM
#print(yesMatrix[:,-1])
#print(noMatrix[:,-1])
#计算在引入属性知识之后,“是”数据集下是信息熵(也就是引入新知识后的不确定性)
yEntropy=calcuEntropy(yesMatrix[:,-1])
nEntropy=calcuEntropy(noMatrix[:,-1])
print("nyEntropy " str(yEntropy))
print("nEntropy " str(nEntropy))
#计算总的信息熵
return yPercent*yEntropy nPercent*nEntropy
values=calcuEntropy(targetAtr)-lastEntropy(newMt)
values1=calcuEntropy(targetAtr)-lastEntropy(newMt1)
values2=calcuEntropy(targetAtr)-lastEntropy(newMt2)
print('大学生的信息熵为:',lastEntropy(newMt))
print('图书馆的信息熵为:',lastEntropy(newMt1))
print('竞赛的信息熵为:',lastEntropy(newMt2),'n')
#print(calcuEntropy(targetAtr))
#print(dataMatrix)
#比较信息熵大小
if values>values1:
if values1>values2:
print('values>values1>values2,选取“大学生”属性最为最先分类的属性')
else:
if values>values2:
print('values>values2>values1,选取“大学生”属性最为最先分类的属性')
else:
print('values2>values>values1,选取“竞赛”属性最为最先分类的属性')
elif values<values1:
if values1<values2:
print('values2>values1>values,选取“竞赛”属性最为最先分类的属性')
else:
if values2>values:
print('values1>values2>values,选取“图书馆”属性最为最先分类的属性')
else:
print('values1>values>values2,选取“图书馆”属性最为最先分类的属性')
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/197554.html原文链接:https://javaforall.cn