利用sklearn 实现ID3、CART、C4.5 算法挑西瓜
一、ID3算法
1. 基础知识
ID3 算法是建立在奥卡姆剃刀(用较少的东西,同样可以做好事情)的基础上:越是小型的决策树越优于大的决策树。ID3 算法的核心思想就是以信息增益来度量特征选择,选择信息增益最大的特征进行分裂。算法采用自顶向下的贪婪搜索遍历可能的决策树空间(C4.5 也是贪婪搜索)。 其大致步骤为:
1)初始化特征集合和数据集合;
2)计算数据集合信息熵和所有特征的条件熵,选择信息增益最大的特征作为当前决策节点;
3)更新数据集合和特征集合(删除上一步使用的特征,并按照特征值来划分不同分支的数据集合);
4)重复 2,3 两步,若子集值包含单一特征,则为分支叶子节点。
2. 划分标准
ID3算法使用的分类标准是信息增益,它表示得知特征A的信息而使得样本集合不确定性减少的程度。
信息增益的计算过程参考:https://blog.csdn.net/One2332x/article/details/121053735?spm=1001.2014.3001.5501
3. 缺点
- ID3 没有剪枝策略,容易过拟合;
- 信息增益准则对可取值数目较多的特征有所偏好,类似“编号”的特征其信息增益接近于 1;
- 只能用于处理离散分布的特征;
- 没有考虑缺失值。
4. 利用sklearn实现ID3算法
打开Jupyter,新建项目。
# 导入包
import pandas as pd
from sklearn import tree
import numpy as np
from sklearn.model_selection import train_test_split
import graphviz
df = pd.read_csv('C:\\....\\西瓜数据集.txt') # 读取文件
# 将特征值全部转化为数字显示
df['色泽']=df['色泽'].map({
'浅白':1,'青绿':2,'乌黑':3})
df['根蒂']=df['根蒂'].map({
'稍蜷':1,'蜷缩':2,'硬挺':3})
df['敲声']=df['敲声'].map({
'清脆':1,'浊响':2,'沉闷':3})
df['纹理']=df['纹理'].map({
'清晰':1,'稍糊':2,'模糊':3})
df['脐部']=df['脐部'].map({
'平坦':1,'稍凹':2,'凹陷':3})
df['触感'] = np.where(df['触感']=="硬滑",1,2)
df['好瓜'] = np.where(df['好瓜']=="是",1,0)
x_train=df[['色泽','根蒂','敲声','纹理','脐部','触感']]
y_train=df['好瓜']
print(df)
id3=tree.DecisionTreeClassifier(criterion='entropy')
id3=id3.fit(x_train,y_train)
print(id3)
显示结果:
调用sklearn中函数tree.DecisionTreeClassifier()
,其中参数 criterion
表示选择特征的准则,默认是 'gini'
,也就是基尼系数,可以设置为'entropy'
,即信息增益。
id3=tree.DecisionTreeClassifier(criterion='entropy')
id3=id3.fit(x_train,y_train)
labels = ['色泽', '根蒂', '敲击', '纹理', '脐部', '触感']
dot_data = tree.export_graphviz(id3
,feature_names=labels
,class_names=["好瓜","坏瓜"]
,filled=True
,rounded=True
)
graph = graphviz.Source(dot_data)
graph
显示结果:
二、C4.5算法
1. 基础知识
C4.5主要克服ID3使用信息增益进行特征划分对取值数据较多特征有偏好的缺点。使用信息增益率进行特征划分。
C4.5相比ID3进行的改进有如下4点:
- 引入剪枝策略,使用悲观剪枝策略进行后剪枝;
- 使用信息增益率代替信息增益,作为特征划分标准;
- 将连续特征离散化,假设 n 个样本的连续特征 A 有 m 个取值,C4.5 将其排序并取相邻两样本值的平均数共 m-1 个划分点,分别计算以该划分点作为二元分类点时的信息增益,并选择信息增益最大的点作为该连续特征的二元离散分类点;
- 缺失值处理
- 对于具有缺失值的特征,用没有缺失的样本子集所占比重来折算信息增益率,选择划分特征。
- 选定该划分特征,对于缺失该特征值的样本,将样本以不同的概率划分到不同子节点。
2. 划分标准
利用信息增益率可以克服信息增益的缺点,其公式为:
G a i n r a t i o ( D , A ) = G a i n ( D , A ) H A ( D ) Gain_ratio(D,A)=\frac{Gain(D,A)}{H_A(D)} Gainratio(D,A)=HA(D)Gain(D,A)
H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ l o g 2 ∣ D i ∣ ∣ D ∣ H_A(D)=-\sum_{i=1}^n\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|} HA(D)=−i=1∑n∣D∣∣Di∣lo