目录
决策树ID3算法概述
决策树ID3算法简介
决策树ID3算法的原理
决策树ID3算法的核心
决策树ID3算法的本质
决策树ID3算法的基本流程
决策树ID3算法计算过程
步骤1
步骤2
步骤3
决策树ID3算法的代码实现
决策树ID3算法的优缺点
优点
缺点
决策树ID3算法的应用场景
决策树ID3算法概述
决策树ID3算法简介
ID3算法最早是由罗斯昆(J. Ross Quinlan)于1975年在悉尼大学提出的一种分类预测算法,算法的核心是“信息熵”。1986年,Quinlan进一步发展了ID3算法,使其成为决策树学习算法的一种重要代表。ID3算法是一种自顶向下的贪婪型算法,通过递归地划分训练数据集来构建决策树,特别适用于处理离散属性的数据集。
ID3算法通过计算每个属性的信息增益,认为信息增益高的是好属性,每次划分选取信息增益最高的属性为划分标准,重复这个过程,直至生成一个能完美分类训练样例的决策树。
ID3算法是一种贪心算法,用来构造决策树。ID3算法起源于概念学习系统(CLS),以信息熵的下降速度为选取测试属性的标准,即在每个节点选取还尚未被用来划分的具有最高信息增益的属性作为划分标准,然后继续这个过程,直到生成的决策树能完美分类训练样例。
ID3该算法是以信息论为基础,以信息熵和信息增益为衡量标准,从而实现对数据的归纳分类。
决策树ID3算法的原理
ID3算法是基于熵和信息增益的概念,通过将数据集划分为更小的子集来构建决策树。这个算法的核心思想是通过选择最能降低数据不确定性的属性来进行划分,直到所有数据都属于同一类别。
在ID3算法中,信息是指数据的不确定性。为了衡量信息的不确定性,使用了信息熵的概念。信息熵是一个度量数据集中不确定性的指标,它的值越大,表示数据集的不确定性越高。
ID3算法的具体步骤是:首先,计算每个属性的信息增益,信息增益是通过计算在给定属性的条件下,数据集的不确定性减少的程度。然后,选择具有最大信息增益的属性作为划分点,将数据集
ID3算法中,每个节点表示一个属性,每个分支表示一个属性值,每个叶节点表示一个类别。算法通过计算属性的信息增益来选择最佳属性作为节点,从而构建决策树。信息增益越大,属性对分类的贡献越大。
决策树ID3算法的核心
ID3算法核心是“信息熵”。ID3算法通过计算每个属性的信息增益,认为信息增益高的是好属性,每次划分选取信息增益最高的属性为划分标准,重复这个过程,直至生成一个能完美分类训练样例的决策树。
决策树ID3算法的本质
在信息论中,期望信息越小,那么信息增益就越大,从而纯度就越高。ID3算法本质是以信息增益来度量属性的选择,选择分裂后信息增益最大的属性进行分裂。该算法采用自顶向下的贪婪搜索遍历可能的决策空间。
在决策树的每一个非叶子结点划分之前,先计算每一个属性所带来的信息增益,选择最大信息增益的属性来划分,因为信息增益越大,区分样本的能力就越强,越具有代表性,很显然这是一种自顶向下的贪心策略。
决策树ID3算法的基本流程
ID3算法算法是以信息论为基础,以信息熵和信息增益为衡量标准,从而实现对数据的归纳分类。
首先,ID3算法需要解决的问题是如何选择特征作为划分数据集的标准。在ID3算法中,选择信息增益最大的属性作为当前的特征对数据集分类。信息增益的概念将在下面介绍,通过不断的选择特征对数据集不断划分;
其次,ID3算法需要解决的问题是如何判断划分的结束。分为两种情况,第一种为划分出来的类属于同一个类,如上图中的最左端的“非鱼类”,即为数据集中的第5行和第6行数据;最右边的“鱼类”,即为数据集中的第2行和第3行数据。第二种为已经没有属性可供再分了。此时就结束了。
通过迭代的方式,我们就可以得到这样的决策树模型。
决策树ID3算法计算过程
步骤1
假设S为完整的数据集,数据标签(数据类别)共有n个类别,分别为C1,...,Cn。Si对应Ci类别下数据子集,因此,数据集S的信息熵计算如下:
其中,pi是数据样本为Ci的概率,因此:
|Si|是类别Ci在数据集S中的数据数量,|S|是数据集S中的数据数量。
步骤2
假设特征A有k种不同的取值,根据特征A,一定条件下的数据集S可以分为k个子集{S1,...,Sk},因此,数据集S的信息熵可以按照如下方式计算:
步骤3
假设数据集S根据特征A不同的取值分为众多子集,则信息增益的计算为:
计算数据集中每一个特征的信息增益,如Gain(S,B), Gain(S,C)等,选取信息增益最大的特征作为树中新的节点。
决策树ID3算法的代码实现
import numpy as np
import pandas as pd
from collections import Counterclass Node:def __init__(self, feature=None, threshold=None, left=None, right=None, *, value=None):self.feature = featureself.threshold = thresholdself.left = leftself.right = rightself.value = valuedef entropy(labels):"""计算信息熵"""hist = Counter(labels)total = len(labels)entropy = 0for count in hist.values():p = count / totalentropy -= p * np.log2(p)return entropydef information_gain(dataset, labels, feature):"""计算信息增益"""gain = entropy(labels)unique_values = dataset[feature].unique()for value in unique_values:sub_dataset = dataset[dataset[feature] == value]prob = len(sub_dataset) / len(dataset)gain -= prob * entropy(sub_dataset[labels])return gaindef split_dataset(dataset, feature, value):"""根据特征值划分数据集"""left = dataset[dataset[feature] < value]right = dataset[dataset[feature] >= value]return left, rightdef build_tree(dataset, features, labels, depth=0, max_depth=None):"""递归构建决策树"""if max_depth is not None and depth >= max_depth:return Node(value=np.bincount(dataset[labels]).argmax())labels = dataset[labels]if len(labels) == 0:return Node(value=None)num_samples, num_features = dataset.shapeif num_samples <= 1:return Node(value=labels[0])best_ig = -1best_feature, best_threshold = None, Nonefor feature in features:feature_data = dataset[feature].dropna()thresholds = feature_data.unique()for threshold in thresholds:left, right = split_dataset(dataset, feature, threshold)ig = information_gain(dataset, labels, feature)if ig > best_ig:best_ig = igbest_feature = featurebest_threshold = thresholdif best_feature is None:return Node(value=np.bincount(labels).argmax())left_subtree = build_tree(dataset[dataset[best_feature] < best_threshold], features, labels, depth + 1, max_depth)right_subtree = build_tree(dataset[dataset[best_feature] >= best_threshold], features, labels, depth + 1, max_depth)return Node(best_feature, best_threshold, left_subtree, right_subtree)def predict(node, sample):"""预测样本的类别"""if node.value is not None:return node.valueif sample[node.feature] < node.threshold:return predict(node.left, sample)else:return predict(node.right, sample)# 示例数据集
data = {'age': [25, 35, 45, 60, 35, 60],'outlook': ['Sunny', 'Rainy', 'Overcast', 'Sunny', 'Rainy', 'Overcast'],'play': ['No', 'No', 'Yes', 'Yes', 'Yes', 'Yes']
}
df = pd.DataFrame(data)
labels = 'play'# 训练决策树
features = df.columns.tolist()
features.remove(labels)
tree = build_tree(df, features, labels)# 预测
sample = {'age': 40, 'outlook': 'Sunny'}
print(predict(tree, sample))
决策树ID3算法的优缺点
优点
- 易于理解和解释:决策树的结构简洁,可以帮助人们更好地了解分类过程,易于理解和解释,具有良好的可解释性。
- 处理多分类问题:决策树可以处理多分类问题,适用于各种类型的数据。
- 处理离散和连续数据:虽然ID3主要处理离散数据,但通过适当的预处理,也可以处理连续数据。
- 自学习能力:ID3算法可以从数据集中自动学习和归纳规律,无需人为指定函数形式,体现了较强的机器学习特性。
- 处理缺失数据:ID3算法可以处理具有缺失属性值的数据,缺失数据不会影响特征的选取。
- 生成规则:易于提取出规则,可扩展性强。
缺点
- 倾向选择属性值多的特征:ID3算法在选择根节点和各内部节点中的分支属性时,采用信息增益作为评价标准,倾向于选择取值较多的属性,这可能导致选择的属性并不是最优的。
- 不能处理连续属性:ID3算法仅适用于离散属性,对于连续数值型数据需要预先离散化处理,否则无法直接应用。
- 过拟合问题:ID3算法在构建过程中容易受到噪声影响,特别是当数据集中存在大量属性时,可能会导致过拟合现象,构建出的决策树过于复杂,对训练数据拟合得过于紧密,而对未知数据的泛化能力不足。
- 对噪声数据敏感:ID3算法对噪声数据比较敏感,可能会产生过拟合。
- 计算复杂度:在处理高维数据时,可能会产生过度拟合和计算复杂度过高的问题。
- 划分过程可能停止:划分过程会由于子集规模过小而造成统计特征不充分而停止。
- 不支持增量学习:ID3算法不能增量地接受训练集,每增加一次实例就抛弃原有的决策树,重新构造新的决策树,开销很大。
决策树ID3算法的应用场景
ID3算法是一种经典的决策树学习算法,广泛应用于各种分类和预测问题。以下是ID3算法的主要应用场景:
- 文本分类:ID3算法可以用于文本分类任务,通过分析文本内容的特征来预测其所属类别。这种应用在自然语言处理和信息检索中非常常见。
- 垃圾邮件过滤:在电子邮件系统中,ID3算法可以帮助识别和过滤垃圾邮件。通过对邮件内容和元数据的分析,算法可以预测邮件是否为垃圾邮件。
- 医学诊断:在医疗领域,ID3算法可以用于疾病的诊断和预测。通过分析患者的各种医学指标,算法可以帮助医生做出更准确的诊断。
- 金融风险评估:在金融行业,ID3算法可以用于评估客户的信用风险。通过对客户的财务和行为数据的分析,算法可以预测客户违约的可能性。
- 数据挖掘:ID3算法在数据挖掘中也有广泛应用,特别是在处理离散属性的数据集时。它可以从大量数据中发现有价值的模式和规则。
- 模式识别:在模式识别领域,ID3算法可以用于图像识别、语音识别等任务。通过分析数据的特征,算法可以识别和分类不同的模式