目录
介绍
从0到1介绍概念,手撕代码
决策树形状
'#周志华西瓜数据集2.0#'
'''
训练集:
#特征 #标签
编号 色泽,根蒂,敲声,纹理,脐部,触感,好瓜
1, 青绿,蜷缩,浊响,清晰,凹陷,硬滑,是
2, 乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,是
3, 乌黑,蜷缩,浊响,清晰,凹陷,硬滑,是
4, 青绿,蜷缩,沉闷,清晰,凹陷,硬滑,是
5, 浅白,蜷缩,浊响,清晰,凹陷,硬滑,是
6, 青绿,稍蜷,浊响,清晰,稍凹,软粘,是
7, 乌黑,稍蜷,浊响,稍糊,稍凹,软粘,是
8, 乌黑,稍蜷,浊响,清晰,稍凹,硬滑,是
9, 乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,否
10, 青绿,硬挺,清脆,清晰,平坦,软粘,否
11, 浅白,硬挺,清脆,模糊,平坦,硬滑,否
12, 浅白,蜷缩,浊响,模糊,平坦,软粘,否
13, 青绿,稍蜷,浊响,稍糊,凹陷,硬滑,否
14, 浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,否
15, 乌黑,稍蜷,浊响,清晰,稍凹,软粘,否
16, 浅白,蜷缩,浊响,模糊,平坦,硬滑,否
17, 青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,否'''
也就是说拿来一个测试集,包含一个西瓜,根据西瓜的特征[色泽,根蒂,敲声,纹理,脐部,触感]来判断此西瓜
的标签是什么?
那么使用哪一个特征划分最佳呢?即更快速的判断西瓜的标签,需要引入信息熵entropy
信息量
论文地址:信息熵与不确定性_爱学术
信息量=,p为该事件的概率,底数为2
信息量的概念:消除或减少不确定性的大小则
信息熵
衡量不确定性大小,熵值越大,不确定性越高;
周志华老师西瓜书
log底数为2,单位为bit
李航老师统计学习方法
熵的值和意义
来源:决策树中信息、熵、信息增益、基尼指数的概念及其python实现_mike_jun的博客-CSDN博客_gini指数
熵只依赖X的分布,和X的取值没有关系,熵是用来度量不确定性,当熵越大,概率说X=xi的不确定性越大,反之越小,在机器学期中分类中说,熵越大即这个类别的不确定性更大,反之越小,当随机变量的取值为两个时,熵随概率的变化曲线如下图:
在熵H(P)越大时,表示信息的不确定性越大。
例如我们有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表示浅白
计算来源代码:决策树中信息、熵、信息增益、基尼指数的概念及其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(无缺敲声)-rv?*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(无缺色泽)-rv?*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(无缺脐部)-rv?*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层进入下层条件方便查看