决策树

决策树 · 浏览次数 : 67

小编点评

**决策树相关概念及简单实现** **决策树**是一种树形结构,用于将数据分类或回归。它基于属性对数据进行分割,并根据数据中的特征和属性建立分类规则。 **决策树的类型** * ID3(信息增益) * C4.5(信息增益率) * CART(Gini系数) **信息增益** 信息增益是用于评估决策树中一个属性对数据纯度影响的指标。它衡量的是将一个属性的值划分成多个不相似的区域所需要的平均信息量。 **剪枝** 在构建决策树的过程中,可以通过剪枝技术来降低树的复杂性,提高模型的预测效率。在决策树中,使用最大深度等策略来确定树的深度,并使用 min_samples_split、min_samples_leaf 等策略来控制每个节点的样本数。 **评价决策树** 为了评估决策树的好坏,可以使用以下指标: * 熵值:衡量样本纯度,熵值越大,样本纯度越低。 * Gini系数:衡量样本纯度,Gini系数越大,样本纯度越低。 **决策树的 Python 实现** ```python from sklearn import tree from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt import graphviz # 加载鸢尾花数据集 data = load_iris() X = data.data y = data.target # 划分数据集 X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=0.1) # 实例化模型对象 clf = tree.DecisionTreeClassifier(criterion='entropy') # 通过模型接口训练模型 clf = clf.fit(X_train, Y_train) # 模型预测 predict_y = clf.predict(X_test) # 打印预测结果 print("对测试集样本的预测结果:\\", predict_y) print("预测样本为某个标签的概率:\\", predict_y1) # 绘制决策树 fig, ax = plt.subplots() tree.plot_decision_tree(ax=ax, feature_names=X.feature_names, class_names=y.tolist()) ax.set_xlabel("特征") ax.set_ylabel("类") ax.set_title("决策树") plt.show() # 打印重要性 info = [*zip(X.feature_names, clf.feature_importances_)] print(info) ``` **注意** * `criterion='entropy'` 指定使用信息增益作为评估指标。 * `random_state` 用于设置分支中的随机模式。 * `splitter="random"` 表示在分支时进行随机选择。 * `max_features` 用于限制分枝时考虑的特征个数。 * `min_impurity_decreases` 用于限制信息增益的大小,当信息增益小于设定数值时停止分支。

正文

决策树相关概念及简单实现

​ 决策树是一种机器学习的方法。决策树的生成算法有ID3(信息增益), C4.5(信息增益率)和CART(Gini系数)等。决策树是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。
​ 构造树的基本想法是随着树深度的增加,节点的熵迅速地降低。熵降低地速度越快越好,这样我们有望得到一颗高度最矮地决策树。

熵和Gini系数

描述样本纯度,熵和Gini系数越大,表示样本纯度越小,即样本中每一类出现的概率越小。

\[熵 = -\sum_{i=1}^{n}{P_i\ln(P_i)} \]

\[Gini系数 = 1 - \sum_{k=1}^{K}{P_i^2} \]

信息增益

熵值的变化。希望构建决策树的过程中,信息增益越大越好。但如果在确定一个根节点之后,有很多子样本,每个子样本非常纯,那么就会出现熵约等于1的情况,但这种情况不是我们希望看到的,所以此方法需要改进。

剪枝

预剪枝:在构建决策树的过程时,提前停止

后剪枝:决策树构建好后,然后才开始裁剪

评价函数

评价决策树结构的好坏,类似于损失函数。其中Nt为当前叶子节点样本个数,H(t)则表示当前叶子节点的熵值或Gini值。

\[C(T) = \sum_{t \epsilon leaf}{N_tH(t)} \]

叶子节点个数太多,也会影响决策树结构好坏,加入了剪枝以后,评价函数变为:

\[C_\alpha(T) = C(T) + \alpha|T_{leaf}| \]

决策树Python实现

from sklearn import tree
from sklearn.datasets import load_iris
from sklearn import model_selection
import matplotlib.pyplot as plt
import graphviz

# 加载鸢尾花数据集,X为数据集,y为标签
dataSet = load_iris()
X = dataSet.data
y = dataSet.target
# 特证名称
feature_names = dataSet.feature_names
# 类名
target_names = dataSet.target_names
# 划分数据集
X_train, X_test, Y_train, Y_test = model_selection.train_test_split(X, y)

# 实例化模型对象
# 1.criterion这个参数正是用来决定不纯度的计算方法的
# 输入"entropy",使用信息熵;输入“gini”,使用基尼系数
# 对于高维数据或者噪音很多的数据,信息熵很容易过拟合,基尼系数在这种情况下效果往往会更好
# 2.random_state用来设置分支中的随机模式的参数,默认为None,在高维度时随机性会表示的更加明显
# 3.splitter也是用来控制决策树中的随机选项的
# 输入“best”,决策树在分支时虽然随机,但是还是会优先选择更加重要的特征进行分支;
# 输入"random",决策树会在分支时更加随机,树会因为含有更多的不必信息而更深更大,可能会导致过拟合问题
# 4.剪枝操作
# (1)max_depth:限制树的最大深度,超过设定深度的树枝全部剪掉
# (2)min_samples_leaf:一个节点在分支后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分支就不会发生
# (3)min_samples_split:一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分支,否则分支就不会发生
# (4)max_features:限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,和max_depth相似
# (5)min_impurity_decreases:限制信息增益的大小,信息增益小于设定数值的分枝不会发生。
clf = tree.DecisionTreeClassifier(criterion='entropy')

# 通过模型接口训练模型
clf = clf.fit(X_train, Y_train)

# 模型预测
predict_y = clf.predict(X_test)
print("对测试集样本的预测结果:\n", predict_y)
predict_y1 = clf.predict_proba(X_test)
print("预测样本为某个标签的概率:\n", predict_y1)
# 通过测试集对模型评分(0-1)
Test_score = clf.score(X_test, Y_test)
print("模型在测试集上进行评分:\n", Test_score)

# 使用grapviz绘制决策树
clf_dot = tree.export_graphviz(clf,
                               out_file=None,
                               feature_names=feature_names,
                               class_names=target_names,
                               filled=True,
                               rounded=True)
graph = graphviz.Source(clf_dot,
                        filename="iris_decisionTree",
                        format="png")
graph.view()
print("\n特征重要程度为:")
info = [*zip(feature_names, clf.feature_importances_)]
for cell in info:
    print(cell)

# 确认最优的剪枝参数,横坐标是超参数,纵坐标是模型度量,这里是Test_score
test = []
for i in range(10):
    clf = tree.DecisionTreeClassifier(max_depth=i + 1
                                      , criterion="entropy"
                                      , random_state=30
                                      , splitter="random"
                                      )
    clf = clf.fit(X_train, Y_train)
    score = clf.score(X_test, Y_test)
    test.append(score)
plt.plot(range(1, 11), test, color="red", label="max_depth")
plt.legend()
plt.show()

基于鸢尾花数据集的决策树形状

image

参考链接

机器学习第二阶段:机器学习经典算法(2)——决策树与随机森林

决策树算法python实现

与决策树相似的内容:

决策树

# 决策树相关概念及简单实现 ​ 决策树是一种机器学习的方法。决策树的生成算法有ID3(信息增益), C4.5(信息增益率)和CART(Gini系数)等。决策树是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。 ​ 构造树的基本想法

决策树(实验室会议小记)

实验室开会的一些记录

用案例带你认识决策树,解锁洞察力

决策树是一种基于树形结构的分类模型,它通过对数据属性的逐步划分,将数据集分成多个小的决策单元。

算法金 | 决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost 算法大全

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 决策树是一种简单直观的机器学习算法,它广泛应用于分类和回归问题中。它的核心思想是将复杂的决策过程分解成一系列简单的决策,通过不断地将数据集分割成更小的子集来进行预测。本文将带你详细了解决

聊聊基于Alink库的决策树模型算法实现

示例代码及相关内容来源于《Alink权威指南(Java版)》 概述 决策树模型再现了人们做决策的过程,该过程由一系列的判断构成,后面的判断基于前面的判断结果,不断缩小范围,最终推出结果。 如下,基于决策树模型预测天气,是最常见的示例。天气的整个预测过程,就是不断地判断推测的过程。 特征分类 特征数据

算法金 | 突破最强算法模型,决策树算法!!

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 1. 引言 今天我们唠唠 吴恩达:机器学习的六个核心算法! 之决策树算法。 决策树是一种用于分类和回归的机器学习算法。它通过一系列的决策规则将数据逐步划分,最终形成一个类似于树状结构的模

聊聊基于Alink库的随机森林模型

概述 随机森林(Random Forest)是一种集成学习(Ensemble Learning)方法,通过构建多个决策树并汇总其预测结果来完成分类或回归任务。每棵决策树的构建过程中都引入了随机性,包括数据采样和特征选择的随机性。 随机森林的基本原理可以概括如下: 随机抽样训练集:随机森林通过有放回抽

随机森林RF模型超参数的优化:Python实现

本文介绍基于Python的随机森林(Random Forest,RF)回归代码,以及模型超参数(包括决策树个数与最大深度、最小分离样本数、最小叶子节点样本数、最大分离特征数等)自动优化的代码~

算法金 | 你真的完全理解 Logistic 回归算法了吗

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 今日 178/10000 1. 引言 吴恩达:机器学习的六个核心算法!, 通透!!十大回归算法模型最强总结, 突破最强算法模型,决策树算法!! 急匆匆把 逻辑回归 给落下了,今天我们杀他

C#的重载决策

重载是许多编程语言支持的特性。所谓重载,就是指可以定义多个名称相同但参数(个数、类型和顺序)不同的方法(函数)。先来看一个例子: ```c# void Main() { char cvalue = 'a'; male m = new male(); m.write(cvalue); } class