python决策树算法_决策树算法(python)

本文深入探讨了Python中的决策树算法,包括其优缺点、工作原理、信息增益与剪枝策略。通过ID3、C4.5和CART等经典算法的介绍,展示了如何使用scikit-learn库构建决策树模型,并在红酒数据集上进行了训练和测试,实现了90.74%的测试集准确率。此外,还讨论了特征重要性,并提供了决策树的特征选择准则。
摘要由CSDN通过智能技术生成

决策树

优点:

- 计算复杂度不高,易于理解和解释,甚至比线性回归更直观;

- 与人类做决策思考的思维习惯契合;

- 模型可以通过树的形式进行可视化展示;

- 可以直接处理非数值型数据,不需要进行哑变量的转化,甚至可以直接处理含缺失值的数据;

- 可以处理不相关特征数据。

缺点:

- 对于有大量数值型输入和输出的问题,特别是当数值型变量之间存在许多错综复杂的关系,如金融数据分析,决策树未必是一个好的选择;

- 决定分类的因素更倾向于更多变量的复杂组合;

- 模型不够稳健,某一个节点的小小变化可能导致整个树会有很大的不同。

- 可能会产生过度匹配(过拟合)问题。

使用数据类型:数值型和离散型(标称型)。

工作原理:

决策树算法通常是一个递归的选择最优特征的过程,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类过程。这一过程对应着特征空间的划分,也对应着决策树的构建。开始,构建根结点,将所有训练数据都放在根结点。选择一个最优特征,按照这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类。如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到所对应的叶节点中去;如果还有子集不能被基本正确分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的节点。如此递归的进行下去,直到所有的训练数据子集被基本正确分类,或者没有合适的特征为止。最后每个子集都被分到叶节点上,即都有了明确的类,这就生成了一颗决策树。

决策树可以看作if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。

将决策树转换成if-then规则的过程如下:

由决策树的根节点到叶节点的每一条路径构建一条规则;

路径内部结点的特征对应规则的条件;

叶节点的类对应规则的结论.

决策树的路径具有一个重要的性质:互斥且完备,即每一个样本均被且只能被一条路径所覆盖。

决策树由结点和有向边组成。结点有两种类型: 内部结点和叶节点。内部节点表示一个特征或属性,叶节点表示一个类。

1435484-20200410163638445-1948954313.png

决策树通常有三个步骤:特征选择、决策树生成、决策树的修剪。

特征选择

如果利用一个特征进行分类的结果与随机分类的结果无异,则可以认为这个特征是不具备分类能力的。而我们应该基于什么准则来判定一个特征的分类能力呢?这时候,需要引入一个概念:信息增益。特征选择原则:对训练数据集,计算其每个特征的信息增益,并比它们的大小,从而选择信息增益最大的特征。

以信息增益作为特征选择准则,会存在偏向于选择取值较多的特征的问题。可以采用信息增益比对这一问题进行校正。原则也是选择信息增益比最大的特征。

决策树的生成

决策树的生成算法有很多变形,这里介绍几种经典的实现算法:ID3算法,C4.5算法和CART算法。这些算法的主要区别在于分类结点上特征选择的选取标准不同。下面详细了解一下算法的具体实现过程。

ID3算法

ID3算法的核心是在决策树的各个结点上应用信息增益准则进行特征选择。具体做法是:

从根节点开始,对结点计算所有可能特征的信息增益,选择信息增益最大的特征作为结点的特征&#x

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是用 Python 实现 ID3 决策树算法的代码示例: ```python import math from collections import Counter def find_entropy(data): """ 计算数据集的信息熵 """ # 统计数据集中每个类别的样本数 class_counts = Counter(data["label"]) # 计算每个类别样本数占总数的比例 class_probs = [class_count / len(data["label"]) for class_count in class_counts.values()] # 计算信息熵 entropy = sum([-class_prob * math.log(class_prob, 2) for class_prob in class_probs]) return entropy def find_best_split(data, features): """ 找到最佳分裂特征和特征值 """ # 计算数据集的信息熵 entropy = find_entropy(data) # 初始化最佳分裂特征和特征值 best_feature, best_value = None, None # 初始化最小信息增益 min_info_gain = float("inf") # 遍历每个特征 for feature in features: # 找到该特征的所有取值 values = set(data[feature]) # 遍历每个取值 for value in values: # 将数据集分成两部分 left_data = data[data[feature] == value] right_data = data[data[feature] != value] # 如果分裂后的数据集不为空 if len(left_data) > 0 and len(right_data) > 0: # 计算分裂后的信息熵 left_entropy = find_entropy(left_data) right_entropy = find_entropy(right_data) split_entropy = (len(left_data) / len(data)) * left_entropy + (len(right_data) / len(data)) * right_entropy # 计算信息增益 info_gain = entropy - split_entropy # 如果信息增益更大,则更新最佳分裂特征和特征值 if info_gain < min_info_gain: best_feature, best_value = feature, value min_info_gain = info_gain # 返回最佳分裂特征和特征值 return best_feature, best_value def build_tree(data, features): """ 构建决策树 """ # 如果数据集为空,则返回 None if len(data) == 0: return None # 如果数据集中所有样本都属于同一类别,则返回该类别 if len(set(data["label"])) == 1: return data["label"].iloc[0] # 如果没有可用特征,则返回数据集中样本数最多的类别 if len(features) == 0: return Counter(data["label"]).most_common(1)[0][0] # 找到最佳分裂特征和特征值 best_feature, best_value = find_best_split(data, features) # 如果信息增益小于等于 0,则返回数据集中样本数最多的类别 if best_feature is None or best_value is None: return Counter(data["label"]).most_common(1)[0][0] # 创建节点 node = {"feature": best_feature, "value": best_value, "left": None, "right": None} # 将数据集分成两部分 left_data = data[data[best_feature] == best_value] right_data = data[data[best_feature] != best_value] # 递归构建左子树和右子树 node["left"] = build_tree(left_data, [feature for feature in features if feature != best_feature]) node["right"] = build_tree(right_data, [feature for feature in features if feature != best_feature]) # 返回节点 return node ``` 该代码实现了 ID3 决策树算法,其中 `find_entropy` 函数用于计算数据集的信息熵,`find_best_split` 函数用于找到最佳分裂特征和特征值,`build_tree` 函数用于构建决策树
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值