决策树学习

目录

介绍

决策树形状

信息量

 信息熵

熵的值和意义

 ID3算法

公式

公式2

决策树结果

第一层

 第二层

 C4.5算法

手动计算

CART

公式

 西瓜数据

计算特征色泽的gini_index

 总结

剪枝

前剪枝过程

 待剪枝决策树

剪枝结果

 总结

后剪枝

 待剪枝决策树

剪枝结果

​总结

连续值处理

计算公式

代码实现

缺失值处理

计算公式

  数据集概览

 计算方法

决策树生成

根蒂=清晰计算

最终决策树

多变量决策树

sklearn中实现决策树

ID3信息增益算法决策树

决策树结果

总结


介绍

从0到1介绍概念,手撕代码

统计学习方法|决策树原理剖析及实现 | Dodo

决策树形状

'#周志华西瓜数据集2.0#'

'''
训练集:
    #特征                       #标签
编号 色泽,根蒂,敲声,纹理,脐部,触感,好瓜   
1,   青绿,蜷缩,浊响,清晰,凹陷,硬滑,是
2,   乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,是
3,   乌黑,蜷缩,浊响,清晰,凹陷,硬滑,是
4,   青绿,蜷缩,沉闷,清晰,凹陷,硬滑,是
5,   浅白,蜷缩,浊响,清晰,凹陷,硬滑,是
6,   青绿,稍蜷,浊响,清晰,稍凹,软粘,是
7,   乌黑,稍蜷,浊响,稍糊,稍凹,软粘,是
8,   乌黑,稍蜷,浊响,清晰,稍凹,硬滑,是
9,   乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,否
10,  青绿,硬挺,清脆,清晰,平坦,软粘,否
11,  浅白,硬挺,清脆,模糊,平坦,硬滑,否
12,  浅白,蜷缩,浊响,模糊,平坦,软粘,否
13,  青绿,稍蜷,浊响,稍糊,凹陷,硬滑,否
14,  浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,否
15,  乌黑,稍蜷,浊响,清晰,稍凹,软粘,否
16,  浅白,蜷缩,浊响,模糊,平坦,硬滑,否
17,  青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,否'''

也就是说拿来一个测试集,包含一个西瓜,根据西瓜的特征[色泽,根蒂,敲声,纹理,脐部,触感]来判断此西瓜
的标签是什么?
那么使用哪一个特征划分最佳呢?即更快速的判断西瓜的标签,需要引入信息熵entropy

信息量

论文地址:信息熵与不确定性_爱学术

信息量=\log \frac{1}{p},p为该事件的概率,底数为2

信息量的概念:消除或减少不确定性的大小则

 信息熵

衡量不确定性大小,熵值越大,不确定性越高;

周志华老师西瓜书

log底数为2,单位为bit

李航老师统计学习方法

熵的值和意义

来源:决策树中信息、熵、信息增益、基尼指数的概念及其python实现_mike_jun的博客-CSDN博客_gini指数

熵只依赖X的分布,和X的取值没有关系,熵是用来度量不确定性,当熵越大,概率说X=xi的不确定性越大,反之越小,在机器学期中分类中说,熵越大即这个类别的不确定性更大,反之越小,当随机变量的取值为两个时,熵随概率的变化曲线如下图:

 在熵H(P)越大时,表示信息的不确定性越大。

来源:统计学习方法|决策树原理剖析及实现 | Dodo

例如我们有10个苹果,1个好苹果,9个坏苹果,令好苹果为A,坏苹果为B,熵的计算如下:

 

 同样,我们假设5个是好苹果,5个是坏苹果呢?

 发现信息熵变成了1。在1个好苹果和9个坏苹果时,我们可以认为大部分都是坏苹果,在这10个苹果内部其实并不混乱,可以说确定性比较大(因为只有一个是好苹果)。当5比5时,里面就有点乱了,有一半是好苹果,有一半是坏苹果,你并不能太确定每个苹果是好的还是坏的,熵就大。

 另一个例子

比如有人告诉小明A,B,C,D中选择A的概率为1/2,那么不确定性大小为

 =1.792bit,所以在这个例子中

 ID3算法

以信息增益为度量的计算方法

选择最大的信息增益作为节点,与信息熵相反

缩写

西瓜书手动计算

ID3 决策树(基于西瓜数据集2.0)_修行修心-CSDN博客

公式

公式2

李航老师统计学习方法中,经验条件熵

'#周志华西瓜数据集2.0#'

'''
训练集:
    #特征                       #标签
编号 色泽,根蒂,敲声,纹理,脐部,触感,好瓜   
1,   青绿,蜷缩,浊响,清晰,凹陷,硬滑,是
2,   乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,是
3,   乌黑,蜷缩,浊响,清晰,凹陷,硬滑,是
4,   青绿,蜷缩,沉闷,清晰,凹陷,硬滑,是
5,   浅白,蜷缩,浊响,清晰,凹陷,硬滑,是
6,   青绿,稍蜷,浊响,清晰,稍凹,软粘,是
7,   乌黑,稍蜷,浊响,稍糊,稍凹,软粘,是
8,   乌黑,稍蜷,浊响,清晰,稍凹,硬滑,是
9,   乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,否
10,  青绿,硬挺,清脆,清晰,平坦,软粘,否
11,  浅白,硬挺,清脆,模糊,平坦,硬滑,否
12,  浅白,蜷缩,浊响,模糊,平坦,软粘,否
13,  青绿,稍蜷,浊响,稍糊,凹陷,硬滑,否
14,  浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,否
15,  乌黑,稍蜷,浊响,清晰,稍凹,软粘,否
16,  浅白,蜷缩,浊响,模糊,平坦,硬滑,否
17,  青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,否'''
步骤1:按色泽的3个选择将17个样本D,划分为Dv{青绿6个,乌黑6个,浅白5个}
步骤2:按照标签的2个选择继续划分青绿{3好瓜,3非好瓜},乌黑{3好瓜,3非好瓜},浅白{1好瓜,4非好瓜}
步骤3:计算每个划分的entropy

决策树结果

第一层

 第二层

 C4.5算法

C4.5算法、天气例子、图形、手撕:C4.5算法详解(非常仔细)_张张的专栏-CSDN博客_c4.5算法

       若以编号来划分计算信息增益,那么结果为0.998,远大于其他特征,所以信息增益对取值较多的属性有所编号。     

李航统计学习方法公式  ,经验熵理解,即某个特征的某个选择的数量与总数比值

  西瓜书解释

  注意一般C4.5的策略是先选信息增益高于平均水平的,再从其中选增益率最高的

手动计算

详细计算增益比:[决策树]西瓜书中Gain、Gain Ratio和Gini index的计算 - 知乎

#色泽属性IV值;一共3个划分取值为{6,6,5}
IV=-(np.log2(6/17)*(6/17)*2+np.log2(5/17)*(5/17))
Out[39]: 1.5798634010685344
#色泽属性gain值=0.043
gain_ratio(色泽)=0.043/1.58

CART

分类和回归数,分类和回归都可以使用的算法

公式

来自李航老师统计学习方法

特征含有多个选择情况,累加gini值

 西瓜数据

'#周志华西瓜数据集2.0#'

'''
训练集:
    #特征                       #标签
编号 色泽,根蒂,敲声,纹理,脐部,触感,好瓜   
1,   青绿,蜷缩,浊响,清晰,凹陷,硬滑,是
2,   乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,是
3,   乌黑,蜷缩,浊响,清晰,凹陷,硬滑,是
4,   青绿,蜷缩,沉闷,清晰,凹陷,硬滑,是
5,   浅白,蜷缩,浊响,清晰,凹陷,硬滑,是
6,   青绿,稍蜷,浊响,清晰,稍凹,软粘,是
7,   乌黑,稍蜷,浊响,稍糊,稍凹,软粘,是
8,   乌黑,稍蜷,浊响,清晰,稍凹,硬滑,是
9,   乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,否
10,  青绿,硬挺,清脆,清晰,平坦,软粘,否
11,  浅白,硬挺,清脆,模糊,平坦,硬滑,否
12,  浅白,蜷缩,浊响,模糊,平坦,软粘,否
13,  青绿,稍蜷,浊响,稍糊,凹陷,硬滑,否
14,  浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,否
15,  乌黑,稍蜷,浊响,清晰,稍凹,软粘,否
16,  浅白,蜷缩,浊响,模糊,平坦,硬滑,否
17,  青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,否'''
步骤1:按色泽的3个选择将17个样本D,划分为Dv{青绿6个,乌黑6个,浅白5个}
步骤2:按照标签的2个选择继续划分青绿{3好瓜,3非好瓜},乌黑{3好瓜,3非好瓜},浅白{1好瓜,4非好瓜}
步骤3:计算每个划分的gini值
步骤4:累加gini值求出特征gini


计算特征色泽的gini_index

详细计算:[决策树]西瓜书中Gain、Gain Ratio和Gini index的计算 - 知乎

1、特征3个选择

D1表示色泽,1表示青绿,2表示乌黑,3表示浅白

Gini(D1=1)=1-\frac{3}{6}^{2}-\frac{3}{6}^{2}

Gini(D1=2)=1-\frac{4}{6}^{2}-\frac{2}{6}^{2}

Gini(D1=2)=1-\frac{1}{5}^{2}-\frac{4}{5}^{2}

Gini_index(D1)=\sum gini(D1)

 计算来源代码:决策树中信息、熵、信息增益、基尼指数的概念及其python实现_mike_jun的博客-CSDN博客_gini指数

打印出全部的特征的基尼系数

#色泽
青绿
乌黑
浅白
0.42745098039215684

#根蒂
蜷缩
稍蜷
硬挺
0.42226890756302526

#敲声
浊响
沉闷
清脆
0.4235294117647059

#纹理
清晰
稍糊
模糊
0.2771241830065359

#脐部
凹陷
稍凹
平坦
0.3445378151260504

#触感
硬滑
软粘
0.49411764705882355

 选择gini_index小的作为划分点

 总结

纯度小(离散程度大)分裂点
Gain大的增益选择大的
Gain ratio大的增益比率选择大的增
Gini index小的基尼系数选择小的

剪枝

防止过拟合,使用验证集进行评价

前剪枝过程

 待剪枝决策树

训练集先决定叶节点类别,然后验证集验证准确度

1、从①脐部开始,将它变为叶节点(做决策,相当于把脐部替换为好瓜),根据训练集{5好,5坏},任选一类划分,好瓜。代入验证集,所有样本都被视为好瓜,那么{4,5,8}预测正确,其他错误。验证集准确度ACC=3/7=42.9%

2、使用脐部的三个选择进行划分后,训练集中{1,2,3,14},{6,7,15,17},{10,16}进入各自的节点②③④

3、将②③④设为叶节点(做决策,相当于把它们替换为好瓜、好瓜、坏瓜),然后验证集中进入②节点{4,5,13},同样③节点{8,9},④节点{11,12},与替换值比较,最终正确的判断有{4,5,8,11,12}。验证集准确度ACC=5/7=71.4%。这步计算的是色泽、根蒂特征将要划分前准确度

4、用脐部划分后验证集准确度为71.4%>42.9%,说明划分得到确定。

5、对②节点进行前剪枝。用色泽的三个选择进行划分后,带入验证集,②节点{4,5,13},最终正确的判断有{4,5,8,11,12},5,13号预测错误,ACC=4/7=57.1%。说明如果剪去②节点(将②节点变为叶节点,并且删除②以下的节点),准确度将变低,拒绝剪枝。

6、对节点③进行剪枝。前一步脐部划分准确度为71.4%,训练集{6,7,15,17},其中稍蜷{6,7,15},为好瓜叶节点。验证集进入③节点{8,9},结果{4,5,8,11,12},8正确,9号错误。禁止划分。

那么验证集准确度ACC没有变化

7、节点4,所属类别一致,不再划分

剪枝结果

 总结

原理:计算节点划分前后,验证集准确度变化。如根节点,先验概率0.5好瓜,将其设为叶节点(根据先验概率判断验证集),即输入这个节点的样本全部预测为正或负。

其实就是要剪枝的节点设为叶节点,用训练集把它类别进行确定,再带入验证集,进行准确度比对。

后剪枝

 待剪枝决策树

 后剪枝是决策树生成之后进行剪枝操作

1、带入验证集,正确的样本有{4,11,12},ACC=3/7=42.9%

2、将⑥节点设为叶节点(做决策,如何确定节点类别??训练集),{7,15}训练集进入此节点,为好瓜,带入验证集,验证集正确样本{4,8,11,12},增加8号。ACC=4/7=57.1%。说明剪去后正确度提高,接受剪枝。

3、将⑤节点设为叶节点,{6,7,15}训练集进入此节点,为好瓜,带入验证集,验证集正确样本{4,8,11,12},相对上一步没有增减,ACC=4/7=57.1。可以不进行剪枝,但是根据奥卡姆剃刀原理(如无必要,勿增实体),需要剪枝

4、将②节点设为叶节点,{1,2,3,14}训练集进入此节点,为好瓜。验证集{4,5,8,11,12},5号为新增,ACC=5/7=71.4%。接受剪枝

剪枝结果

总结

后剪枝欠拟合风险很小,但是训练开销较大

连续值处理

将含糖量和密度进行处理

方法:将n个值排序后,对相邻的两个数求平均作为n-1个划分点(特征的选择的二分类结果),以划分点作为特征的2个选择,分别计算2个选择的值。

非常详细处理连续值密度:决策树(decision tree)(三)——连续值处理_天泽28的专栏-CSDN博客_决策树连续变量的处理

计算公式

代码实现

# 计算两个特征的基尼指数
data_str  = io.StringIO('''编号,色泽,根蒂,敲声,纹理,脐部,触感,密度,含糖率,好瓜
1,青绿,蜷缩,浊响,清晰,凹陷,硬滑,0.697,0.46,是  
2,乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,0.774,0.376,是  
3,乌黑,蜷缩,浊响,清晰,凹陷,硬滑,0.634,0.264,是  
4,青绿,蜷缩,沉闷,清晰,凹陷,硬滑,0.608,0.318,是  
5,浅白,蜷缩,浊响,清晰,凹陷,硬滑,0.556,0.215,是  
6,青绿,稍蜷,浊响,清晰,稍凹,软粘,0.403,0.237,是  
7,乌黑,稍蜷,浊响,稍糊,稍凹,软粘,0.481,0.149,是  
8,乌黑,稍蜷,浊响,清晰,稍凹,硬滑,0.437,0.211,是  
9,乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,0.666,0.091,否  
10,青绿,硬挺,清脆,清晰,平坦,软粘,0.243,0.267,否  
11,浅白,硬挺,清脆,模糊,平坦,硬滑,0.245,0.057,否  
12,浅白,蜷缩,浊响,模糊,平坦,软粘,0.343,0.099,否  
13,青绿,稍蜷,浊响,稍糊,凹陷,硬滑,0.639,0.161,否  
14,浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,0.657,0.198,否  
15,乌黑,稍蜷,浊响,清晰,稍凹,软粘,0.36,0.37,否  
16,浅白,蜷缩,浊响,模糊,平坦,硬滑,0.593,0.042,否  
17,青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,0.719,0.103,否''')
# print(data_str)
data=np.genfromtxt(data_str,skip_header=1,delimiter=',',dtype=np.str)
X=data[:,-3].astype(np.float)
y=data[:,-1]
y[y=='是']='1'
y[y=='否']='0'
y=y.astype(np.int)
# y=y[:,np.newaxis]
# print(X.shape,y.shape)
data1=np.vstack((X,y)).T
# print(data1)
sort_ind=np.argsort(X)
X=X[sort_ind]
y=y[sort_ind]
print(X,y)
ret=[]
for n in range(len(X)-1):
    tt=round((X[n]+X[n+1])/2,3)
    ret.append(tt)

print('ret',ret,len(ret))
def entropy(all,x,y):
    '若all=x+y则计算熵,否则计算条件熵'
    t=x+y
    z1=np.log2(x/t)*x/t
    z2=np.log2(y/t)*y/t
    if np.isnan(z1):
        z1=0.0
    if np.isnan(z2):
        z2=0.0
    return -t/all*(z1+z2)
def cacl_1_0(y_):
    len_1=y_.sum()
    len_0=(y_==0).sum()
    return len_0,len_1
def divde_1_0(ind,y):
    y1=y[:ind]
    y2=y[ind:]
    # print(y1,y2)
    return cacl_1_0(y1),cacl_1_0(y2)


ret=np.array(ret)
max_len=len(ret)#16
ent1=entropy(17,8,9) #经验熵,类别熵

rec=[]
for t in range(1,max_len):
    (x1,y1),(x2,y2)=divde_1_0(t,y)#按t(特征)划分后,各子划分(特征的选择)好,坏瓜数量
    ent2_1=entropy(x1+y1,x1,y1)
    ent2_2=entropy(x2+y2,x2,y2)    
    ret_2_1=ent2_1*(x1+y1)/17#条件熵,该特征的选择的占比*entropy
    ret_2_2=ent2_2*(x2+y2)/17

    # print(x1,y1,x2,y2)#按t(特征)划分后,各类好,坏瓜数量
    # print(ent1,ent2_1,ent2_2)
    rec.append(ent1-ret_2_1-ret_2_2)
    '''
    sort原始密度:17个
    [0.243 0.245 0.343 0.36  0.403 0.437 0.481 0.556 0.593 0.608 0.634 0.639 0.657 0.666 0.697 0.719 0.774] 
    sort标签:
    [0 0 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1]
    相邻求均值形成n-1个划分: 16个
    [0.244, 0.294, 0.352, *0.382*, 0.42, 0.459, 0.518, 0.574, 0.6, 0.621, 0.637, 0.648, 0.662, 0.682, 0.708, 0.746]
    
    按阈值进行划分:
    [0] [0 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1]#0.244
    1 0 8 8                              #按t(特征)划分后,各类好,坏瓜数量
    0.9975025463691152 -0.0 1.0          #经验熵,划分熵,划分熵
    0.05632607578087989                  #条件熵

    [0 0] [0 0 1 1 1 1 0 1 1 0 0 0 1 0 1]
    2 0 7 8
    0.9975025463691152 -0.0 0.9967916319816366
    0.11798051815002408

    [0 0 0] [0 1 1 1 1 0 1 1 0 0 0 1 0 1]
    3 0 6 8
    0.9975025463691152 -0.0 0.9852281360342515
    0.006046489176565528
    
    最大gain为0.262,对应划分为0.381
    
    '''

缺失值处理

弄清楚各参数的意思,带入公式计算即可

计算公式

初始的Wx为1,在根节点之后,若被划入多个子节点,Wx会被改变,权重=子节点无缺样本数/总无缺数

  数据集概览

 计算方法

 详细计算西瓜书:决策树(decision tree)(四)——缺失值处理_天泽28的专栏-CSDN博客_决策树处理缺失值 

 另一位博主其他例子:

机器学习笔记(7)——C4.5决策树中的缺失值处理_小赵的博客-CSDN博客_决策树如何处理缺失值

以敲声特征为例,计算信息增益

p:15个有效样本,p=15/17

Pk:Pk(好瓜)=7/15,Pk(坏瓜)=8/15

rv:rv浊响=8/15,rv沉闷=5/15,rv清脆=2/15

Gain(敲声)=p*(  ent(无缺敲声)-\sumrv?*ent(敲声=?)

Gain(敲声)=15/17*(0.997+ 8/15* ( 5/8*log5/8+3/8*log3/8 )+...+...)=0.145

决策树生成

没有纹理特征的8,10会被带入三个节点,W8,10=无缺子节点样本数/父节点无缺样本数

将缺失值样本按不同的概率划分到了所有分支中,而概率=无缺失值样本在每个分支中所占的比例。

 计算纹理=稍糊条件下,色泽信息增益

p:6个加权的有效样本,p= (4*1+5/15+5/15) /(5*1+5/15+5/15)=4+2/3  /  5+2/3  =14/17=0.824

Pk:Pk(好瓜)=1 + 5/15  /   4*1+5/15+5/15 ,Pk(坏瓜)=3+5/15   /   4*1+5/15+5/15

rv:rv乌黑=2+5/15 / 4*1+5/15+5/15,rv青绿=1+5/15  / 4*1+5/15+5/15,rv浅白=1/ 4*1+5/15+5/15

Gain(色泽)=p*(  ent(无缺色泽)-\sumrv?*ent(色泽=?)

ent(色泽)=-( Pk好瓜 log Pk好瓜+Pk坏瓜 log Pk坏瓜)=0.863

Gain(色泽)=14/17*(0.863-rv*ent(色泽=?) )=0.305

其他不再计算,属性“敲声”的信息增益值最大

 构建决策树如下,敲声沉闷{9,14,17}都为坏瓜,标为叶节点

作者没有写清晰分支的计算方法,根据理解 ,再构建决策树时候(训练)应将加权的样本带入其他分支。

 

 计算:敲声=浊响,脐部的信息增益,样本为{7,8,13},8的权重已结是为5/15

p:3个加权的有效样本,p= (2*1+5/15) /(2*1+5/15)=1

Pk:Pk(好瓜)=1 + 5/15  /   2*1+5/15 ,Pk(坏瓜)=1  /  2*1+5/15

rv:rv稍凹=1+5/15 / 2*1+5/15, rv凹陷=1  / 2*1+5/15

Gain(脐部)=p*(  ent(无缺脐部)-\sumrv?*ent(脐部=?)

Gain(脐部)=1*(0.985-0.571*(0+0) -0.429*(0+0))=0.985

根蒂=清晰计算

机器学习笔记(7)——C4.5决策树中的缺失值处理_小赵的博客-CSDN博客_决策树如何处理缺失值

最终决策树

多变量决策树

若用单变量决策树,那么生成的结果划分表示是与轴平行的,图中加粗线条

        但在学习任务的真实分类边界比较复杂时,必须使用很多段划分才能获得较好的近似。多变量决策树使用斜的划分边界,在此类决策树中,非叶结点不再是仅对某个属性,而是对属性的线性组合进行测试。

        

 若使用多变量相当于给每个非叶节点一个权重

 pytorch实现多变量决策树:

多变量决策树_weixin_44132485的博客-CSDN博客_多变量决策树

sklearn中实现决策树

ID3信息增益算法决策树

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn import tree
import graphviz
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
import io
# X,y=load_iris(return_X_y=True)
# X=X.astype(np.int64)
# data_str  = io.StringIO('''
#编号,色泽,根蒂,敲声,纹理,脐部,触感,密度,含糖率,好瓜
# 1,青绿,蜷缩,浊响,清晰,凹陷,硬滑,0.697,0.46,是
# 2,乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,0.774,0.376,是
# 3,乌黑,蜷缩,浊响,清晰,凹陷,硬滑,0.634,0.264,是
# 4,青绿,蜷缩,沉闷,清晰,凹陷,硬滑,0.608,0.318,是
# 5,浅白,蜷缩,浊响,清晰,凹陷,硬滑,0.556,0.215,是
# 6,青绿,稍蜷,浊响,清晰,稍凹,软粘,0.403,0.237,是
# 7,乌黑,稍蜷,浊响,稍糊,稍凹,软粘,0.481,0.149,是
# 8,乌黑,稍蜷,浊响,清晰,稍凹,硬滑,0.437,0.211,是
#
# 9,乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,0.666,0.091,否
# 10,青绿,硬挺,清脆,清晰,平坦,软粘,0.243,0.267,否
# 11,浅白,硬挺,清脆,模糊,平坦,硬滑,0.245,0.057,否
# 12,浅白,蜷缩,浊响,模糊,平坦,软粘,0.343,0.099,否
# 13,青绿,稍蜷,浊响,稍糊,凹陷,硬滑,0.639,0.161,否
# 14,浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,0.657,0.198,否
# 15,乌黑,稍蜷,浊响,清晰,稍凹,软粘,0.36,0.37,否
# 16,浅白,蜷缩,浊响,模糊,平坦,硬滑,0.593,0.042,否
# 17,青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,0.719,0.103,否  ''')
data_str = io.StringIO('''编号,色泽,根蒂,敲声,纹理,脐部,触感,密度,含糖率,好瓜
1,1,1,1,1,1,1,0.697,0.46,0  
2,2,1,2,1,1,1,0.774,0.376,0  
3,2,1,1,1,1,1,0.634,0.264,0  
4,1,1,2,1,1,1,0.608,0.318,0  
5,3,1,1,1,1,1,0.556,0.215,0  
6,1,2,1,1,2,2,0.403,0.237,0  
7,2,2,1,2,2,2,0.481,0.149,0  
8,2,2,1,1,2,1,0.437,0.211,0  
9,2,2,2,2,2,1,0.666,0.091,1  
10,1,3,3,1,3,2,0.243,0.267,1  
11,3,3,3,3,3,1,0.245,0.057,1  
12,3,1,1,3,3,2,0.343,0.099,1  
13,1,2,1,2,1,1,0.639,0.161,1  
14,3,2,2,2,1,1,0.657,0.198,1  
15,2,2,1,1,2,2,0.36,0.37,1  
16,3,1,1,3,3,1,0.593,0.042,1  
17,1,1,2,2,2,1,0.719,0.103,1''')
# # print(data_str)
data = np.genfromtxt(data_str, delimiter=',', dtype=np.str)
X = data[1:, 1:7].astype(np.int)
y = data[1:, -1].astype(np.int)
X_train, X_test, y_train, y_test=train_test_split(X,y,test_size=0.4,shuffle=True,random_state=0)
clf = DecisionTreeClassifier(criterion='entropy',random_state=0)
clf.fit(X_train, y_train)
'''
七个参数:Criterion,
两个随机性相关的参数(random_state,splitter),
四个剪枝参数(max_depth, ,min_sample_leaf,max_feature,min_impurity_decrease)
一个属性:feature_importances_
四个接口:fit,score,apply,predict'''
print('clf.feature_importances_',clf.feature_importances_)
print(clf.predict(X_test))
print(y_test)
# 画决策树
# dot_data = tree.export_graphviz(clf, out_file=None, 
#         feature_names=['色泽', '根蒂', '敲声', '纹理', '脐部', '触感'], 
#         class_names=['good', 'bad'], filled=True, rounded=True
#         )
# # # print(dot_data)
# graph = graphviz.Source(dot_data)
# graph.save('1.gv')

决策树结果

总结

1、结果与西瓜书中决策树不一致,删除掉1、2层进入下层条件方便查看

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值