sk-learn决策树ID3、C4.5和CART的算法代码实现

一、ID3算法

1.伪代码

ID3 (Examples, Target_Attribute, Attributes)
    Create a root node for the tree
    If all examples are positive, Return the single-node tree Root, with label = +.
    If all examples are negative, Return the single-node tree Root, with label = -.
    If number of predicting attributes is empty, then Return the single node tree Root,
    with label = most common value of the target attribute in the examples.
    Otherwise Begin
        A ← The Attribute that best classifies examples.
        Decision Tree attribute for Root = A.
        For each possible value, vi, of A,
            Add a new tree branch below Root, corresponding to the test A = vi.
            Let Examples(vi) be the subset of examples that have the value vi for A
            If Examples(vi) is empty
                Then below this new branch add a leaf node with label = most common target value in the examples
            Else below this new branch add the subtree ID3 (Examples(vi), Target_Attribute, Attributes – {A})
    End
    Return Root

我们接下来并不会用这个而是用sklearn库实现

2.缺点

  • 对于具有很多值的属性它是非常敏感的,例如,如果我们数据集中的某个属性值对不同的样本基本上是不相同的,甚至更极端点,对于每个样本都是唯一的,如果我们用这个属性来划分数据集,它会得到很大的信息增益,但是,这样的结果并不是我们想要的。
  • ID3算法不能处理具有连续值的属性。
  • ID3算法不能处理属性具有缺失值的样本。
  • 由于按照上面的算法会生成很深的树,所有容易产生过拟合现象。

3.实现代码

1.导入模块部分

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.tree import DecisionTreeClassifier

2.读取数据

data = pd.read_csv('./西瓜数据集.csv')
data
色泽根蒂敲击纹理脐部触感好瓜
0青绿蜷缩浊响清晰凹陷硬滑
1乌黑蜷缩沉闷清晰凹陷硬滑
2乌黑蜷缩浊响清晰凹陷硬滑
3青绿蜷缩沉闷清晰凹陷硬滑
4浅白蜷缩浊响清晰凹陷硬滑
5青绿稍蜷浊响清晰稍凹软粘
6乌黑稍蜷浊响稍糊稍凹软粘
7乌黑稍蜷浊响清晰稍凹硬滑
8乌黑稍蜷沉闷稍糊稍凹硬滑
9青绿硬挺清脆清晰平坦软粘
10浅白硬挺清脆模糊平坦硬滑
11浅白蜷缩浊响模糊平坦软粘
12青绿稍蜷浊响稍糊凹陷硬滑
13浅白稍蜷沉闷稍糊凹陷硬滑
14乌黑稍蜷浊响清晰稍凹软粘
15浅白蜷缩浊响模糊平坦硬滑
16青绿蜷缩沉闷稍糊稍凹硬滑

3.数据编码

#创建LabelEncoder()对象,用于序列化
label = LabelEncoder()    

#为每一列序列化
for col in data[data.columns[:-1]]:
    data[col] = label.fit_transform(data[col])
data
色泽根蒂敲击纹理脐部触感好瓜
0221100
1020100
2021100
3220100
4121100
5211121
6011221
7011120
8010220
9202111
10102010
11121011
12211200
13110200
14011121
15121010
16220220

sklearn拟合

# 采用ID3拟合
dtc = DecisionTreeClassifier(criterion='entropy')
# 进行拟合
dtc.fit(data.iloc[:,:-1].values.tolist(),data.iloc[:,-1].values) 
# 标签对应编码
result = dtc.predict([[1,1,1,1,0,0]])
#拟合结果
result
array(['是'], dtype=object)

二、C4.5算法

C4.5算法总体思路与ID3类似,都是通过构造决策树进行分类,其区别在于分支的处理,在分支属性的选取上,ID3算法使用信息增益作为度量,而C4.5算法引入了信息增益率作为度量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h88vxEjX-1635604412623)(attachment:image.png)]
由信息增益率公式中可见,当𝑣比较大时,信息增益率会明显降低,从而在一定程度上能够解决ID3算法存在的往往选择取值较多的分支属性的问题

三、CART算法

CART算法构造的是二叉决策树,决策树构造出来后同样需要剪枝,才能更好的应用于未知数据的分类。CART算法在构造决策树时通过基尼系数来进行特征选择。

1.基尼指数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9I1TfPAZ-1635604412625)(attachment:8RW4%293Q@CXD6R%60WA%5BXP4CGC.png)]

2.CART拟合

# 采用CART拟合
dtc = DecisionTreeClassifier()
# 进行拟合
dtc.fit(data.iloc[:,:-1].values.tolist(),data.iloc[:,-1].values) 
# 标签对应编码
result = dtc.predict([[1,1,1,1,0,0]])
#拟合结果
result
array(['是'], dtype=object)

四、参考

https://blog.csdn.net/xlinsist/article/details/51468741

https://blog.csdn.net/qq_47281915/article/details/120928915

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值