ID3 C4.5 CART决策树原理及sklearn实现


问题描述

假设我们有一组训练数据 D={ (x1,y1),,(xN,yN)} D = { ( x 1 , y 1 ) , ⋯ , ( x N , y N ) } ,这组训练数据代表 N N 个样本, x i ( i = 1 , , N ) 是样本点 i i 的特征向量, y i 是样本点 i i 的类别,样本共分为 K 类的情况下, yi y i 的取值来自于 K K 个类别值 { C 1 , , C K } ,训练数据的特征集合为 A=A1,,AM A = A 1 , ⋯ , A M ,样本在某个特征 Am A m 处可能取到的特征值有 n n 个,分别为 { a 1 m , , a n m }
决策树是一种由结点和有向边构成的树形结构,结点类型分为内部结点和叶结点,每个内部结点代表对象的一个特征,叶结点则代表对象的类别。下图是一个简单的决策树,它通过输入对象的特征自上而下进行判断,并输出对象的类别(通过对象是否常熬夜,是否常运动判断其分类是健康或亚健康)。在下图中,椭圆框代表内部结点,长方形框代表叶结点。

对于一个未知类别的输入对象,决策树自上而下的测试该对象在每个内部结点的特征取值,从而将其分配到相应的子结点或叶结点,当对象被分配到某个叶结点时,便可确定其类别。


ID3

ID3算法的基本流程为:如果某一个特征能比其他特征更好的将训练数据集进行区分,那么将这个特征放在初始结点,依此类推,初始特征确定之后,对于初始特征每个可能的取值建立一个子结点,选择每个子结点所对应的特征,若某个子结点包含的所有样本属于同一类或所有特征对其包含的训练数据的区分能力均小于给定阈值,则该子结点为一个叶结点,其类别与该叶结点的训练数据类别最多的一致。重复上述过程直到特征用完或者所有特征的区分能力均小于给定阈值。
如何衡量某个特征对训练数据集的区分能力呢,ID3算法通过信息增益来解决这个问题。

信息增益

一个离散型随机变量 x x 的概率分布为: P ( x = x i ) = p i , ( i = 1 , , n ) ,那么 x x 的熵定义如下:

H ( x ) = i = 1 n p i l o g 2 p i

熵的单位为比特(bit),定义 0log0=0 0 l o g 0 = 0 。对于两个随机变量 x,y x , y ,他们有如下形式的联合概率分布:

P(x=xi,y=yj)=pij,(i=1,,n;j=1,,K) P ( x = x i , y = y j ) = p i j , ( i = 1 , ⋯ , n ; j = 1 , ⋯ , K )

那么在 x x 确定的条件下 y 的条件熵定义如下:
H(y|x)=i=1npiH(y|x=xi) H ( y | x ) = ∑ i = 1 n p i H ( y | x = x i )

数据集的熵表征着其类别的不确定程度,而数据集关于某个特征的条件熵则表征着给定某个特征后,其类别的不确定程度。可以想见,数据集的熵与其关于某个特征的条件熵之差表征着这个特征的确定使数据集不确定性减少的程度,数据集的熵与条件熵的差值叫做信息增益,很容易理解,某个特征的信息增益可以反映这个特征对数据集的分类能力,信息增益越大,证明该特征能更好的对数据集进行分类。

信息增益:数据集 D D 的熵为 H ( D ) ,其关于其某个特征 Am A m 的条件熵为 H(D|Am) H ( D | A m ) ,则信息增益为 g(D,Am) g ( D , A m ) g(D,Am)=H(D)H(D|Am) g ( D , A m ) = H ( D ) − H ( D | A m )

对于训练样本集来说,其概率是由数据估计得到的,因此其熵与条件熵分别称为经验熵和经验条件熵。经验熵和经验条件熵的计算方式如下:

H(D)=k=1K|Ck||D|log2|Ck||D|g(D,Am)=H(D)H(D|Am)=H(D)i=1n|Di||D|H(Di)g(D,Am)=k=1K|Ck||D|log2|Ck||D|+i=1n|Di||D|k=1K|Dik||Di|log2|Dik||Di| H ( D ) = − ∑ k = 1 K | C k | | D | l o g 2 | C k | | D | g ( D , A m ) = H ( D ) − H ( D | A m ) = H ( D ) − ∑ i = 1 n | D i | | D | H ( D i ) g ( D , A m ) = − ∑ k = 1 K | C k | | D | l o g 2 | C k | | D | + ∑ i = 1 n | D i | | D | ∑ k = 1 K | D i k | | D i | l o g 2 | D i k | | D i |

其中
  • 3
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
感谢您的提问!对于鸢尾花分类问题,可以使用ID3C4.5和CART算法。下面是一个使用Python实现决策树分类器的示例代码,包括超参数寻优和可视化决策树: ```python import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier, export_graphviz from sklearn.metrics import confusion_matrix, classification_report import graphviz iris = load_iris() X_train, X_test, y_train, y_test = train_test_split( iris.data, iris.target, test_size=0.3, random_state=0) # 构建决策树分类器 clf = DecisionTreeClassifier() # 超参数寻优 param_grid = {'criterion': ['gini', 'entropy'], 'max_depth': np.arange(1, 10)} clf = GridSearchCV(clf, param_grid, cv=5) clf.fit(X_train, y_train) print("Best parameters found: ", clf.best_params_) # 训练并预测 clf = DecisionTreeClassifier(**clf.best_params_) clf.fit(X_train, y_train) y_pred = clf.predict(X_test) # 评估性能 print("Confusion matrix:\n", confusion_matrix(y_test, y_pred)) print("Classification report:\n", classification_report(y_test, y_pred)) # 可视化决策树 dot_data = export_graphviz(clf, out_file=None, feature_names=iris.feature_names, class_names=iris.target_names, filled=True, rounded=True, special_characters=True) graph = graphviz.Source(dot_data) graph.render("iris_decision_tree") ``` 在上面的代码中,首先加载鸢尾花数据集并将其分成训练集和测试集。然后,使用GridSearchCV进行超参数寻优,以获得最佳的参数组合,接着构建决策树分类器并对其进行训练和预测。最后,使用confusion_matrix和classification_report评估分类器的性能,并利用export_graphviz函数可视化决策树

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值