Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
决策树是一种经典的机器学习算法,用于解决分类和回归问题。它的基本思想是通过对数据集中的特征进行递归划分,构建一系列的决策规则,从而生成一个树状结构。在决策树中,每个内部节点表示对输入特征的一个测试,每个分支代表一个测试结果,而每个叶子节点表示一个类别或输出值。决策树的发展历史可以追溯到20世纪50年代和60年代。最早的决策树算法是ID3(Iterative Dichotomiser 3),由Ros
目录
基于Python 和 Scikit-learn 库实现决策树算法的简单示例代码,用于解决分类问题:
博主介绍:✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神,答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战,深受全网粉丝喜爱与支持✌有需要可以联系作者我哦!
🍅文末三连哦🍅
👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟
前言:
决策树是一种经典的机器学习算法,用于解决分类和回归问题。它的基本思想是通过对数据集中的特征进行递归划分,构建一系列的决策规则,从而生成一个树状结构。在决策树中,每个内部节点表示对输入特征的一个测试,每个分支代表一个测试结果,而每个叶子节点表示一个类别或输出值。
决策树的发展历史可以追溯到20世纪50年代和60年代。最早的决策树算法是ID3(Iterative Dichotomiser 3),由Ross Quinlan于1986年提出。之后,C4.5算法和其改进版本C5.0也相继提出,扩展了ID3算法并加入了剪枝等优化方法。此外,还有 CART(Classification and Regression Trees)算法,由Leo Breiman等人于1984年提出,可用于分类和回归问题,并引入了基于基尼系数(Gini impurity)和均方误差(Mean Squared Error)的划分准则。
决策树在机器学习领域得到了广泛的应用,具有许多优点,如易于理解、可解释性强、能够处理混合数据类型等。它适用于多种任务,包括分类、回归、特征选择等。此外,决策树还可以通过集成学习方法(如随机森林、梯度提升树)进一步提升性能,并解决决策树容易过拟合的问题。
总的来说,决策树是一种简单而有效的机器学习算法,为解决分类和回归问题提供了一种直观的方法。随着机器学习领域的发展,决策树算法也在不断地被改进和优化,为各种实际问题提供了强大的工具。
一、决策树思想
决策树的思想原理是通过对数据集中的特征进行递归划分,构建一系列的决策规则,从而生成一个树状结构。其基本思想可以总结如下:
-
选择最佳特征: 首先,从数据集中选择一个最佳的特征作为当前节点的划分标准。通常使用一些准则来评估特征的优劣,例如信息增益、基尼系数、均方误差等。
-
划分数据集: 将数据集根据选择的特征进行划分,生成多个子集,每个子集包含具有相同特征值的样本。
-
递归构建子树: 对每个子集递归地重复步骤1和步骤2,直到满足停止条件。停止条件可以是节点中样本的类别相同、达到最大深度、样本数量小于某个阈值等。
-
生成决策规则: 最终,每个叶子节点都表示一个类别或输出值,而每个内部节点都表示对输入特征的一个测试。通过将树的结构转化为一系列的if-then规则,可以解释数据的分类或预测过程。
-
剪枝优化(可选): 对生成的决策树进行剪枝优化,去除一些不必要的节点,防止过拟合。
通过这种方式,决策树可以根据输入特征对数据进行逐层的划分,构建出一个易于理解和解释的决策模型。决策树的基本思想是根据数据的特征值进行划分,通过划分后的数据集的纯度或者信息增益来选择最佳的划分特征,从而递归地构建出一个树状结构,实现对数据的分类或预测。
开始
|
V
选择最佳特征作为根节点
|
V
划分数据集,生成子集,选择最佳特征作为当前节点的划分标准
/ | \
/ | \
/ | \
子集1满足停止条件? 子集2满足停止条件? 子集3满足停止条件?
/ | \ / | \
/ | \ / | \
V V V V V V
生成叶子节点 递归构建子树 生成叶子节点 递归构建子树 生成叶子节点
| | | | |
V V V V V
返回 返回 返回 返回 返回
| | | | |
V V V V V
结束
二、经典决策树算法
经典的决策树算法包括ID3(Iterative Dichotomiser 3)、C4.5(Classification and Regression Trees)以及CART(Classification and Regression Trees)。这些算法在构建决策树时采用了不同的思想和策略,下面简要介绍它们的思想和实现步骤:
-
ID3(Iterative Dichotomiser 3):
- 思想: ID3算法是一种基于信息熵的决策树算法,它通过选择使得信息增益最大的特征来进行划分,以减少数据集的不确定性。
- 实现步骤:
- 从所有特征中选择使得信息增益最大的特征作为当前节点的划分标准。
- 根据选定的特征进行划分,生成子集。
- 对每个子集递归地重复步骤1和步骤2,直到满足停止条件。
- 生成叶子节点,表示类别或输出值。
- 返回。
-
C4.5(Classification and Regression Trees):
- 思想: C4.5算法是ID3的改进版本,它在选择划分特征时采用信息增益比来解决ID3算法对取值数目较多特征的偏好。
- 实现步骤:
- 从所有特征中选择使得信息增益比最大的特征作为当前节点的划分标准。
- 根据选定的特征进行划分,生成子集。
- 对每个子集递归地重复步骤1和步骤2,直到满足停止条件。
- 生成叶子节点,表示类别或输出值。
- 返回。
-
CART(Classification and Regression Trees):
- 思想: CART算法是一种同时适用于分类和回归问题的决策树算法,它通过选择使得基尼系数最小的特征来进行划分,以提高树的纯度。
- 实现步骤:
- 从所有特征中选择使得基尼系数最小的特征作为当前节点的划分标准。
- 根据选定的特征进行划分,生成子集。
- 对每个子集递归地重复步骤1和步骤2,直到满足停止条件。
- 生成叶子节点,表示类别或输出值。
- 返回。
这些经典的决策树算法在实现时都采用了递归的思想,通过选择最佳的划分特征来构建树结构,直到满足停止条件为止。每个算法在选择划分特征时都采用了不同的指标,如信息增益、信息增益比、基尼系数等,以达到不同的优化目标。
三、算法应用案列
基于Python 和 Scikit-learn 库实现决策树算法的简单示例代码,用于解决分类问题:
首先我们将使用鸢尾花数据集,并尝试根据花萼和花瓣的长度和宽度来预测鸢尾花的品种。
第一步是加载了鸢尾花数据集,并选择花萼长度和花瓣长度作为特征。然后将数据分为训练集和测试集,并创建了一个决策树模型并在训练集上拟合了模型。最后,使用Matplotlib绘制了训练集和测试集的数据点,并在图上绘制了决策边界。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
# 加载鸢尾花数据集
iris = load_iris()
# 选择花萼长度和花瓣长度作为特征
X = iris.data[:, [0, 2]]
y = iris.target
# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.29, random_state=42)
# 创建决策树模型
model = DecisionTreeClassifier()
# 在训练集上拟合模型
model.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 计算模型的准确率
accuracy = accuracy_score(y_test, y_pred)
print("模型的准确率:", accuracy)
# 打印分类报告
print("分类报告:")
print(classification_report(y_test, y_pred))
# 绘制数据变化图
plt.figure(figsize=(10, 6))
# 绘制训练集数据点
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap='viridis', label='Training Set')
# 绘制测试集数据点
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap='viridis', marker='x', label='Test Set')
# 绘制决策边界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01),
np.arange(y_min, y_max, 0.01))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.3, cmap='viridis')
plt.xlabel('Sepal Length (cm)')
plt.ylabel('Petal Length (cm)')
plt.title('Decision Tree Classifier - Iris Dataset')
plt.legend()
plt.colorbar(label='Target Class')
plt.show()
执行结果:数据集划分29%测试集,71%训练集。精确率约为95%
四、总结
算法
-
原理简单直观: 决策树基于对数据集中特征的递归划分,生成一系列的决策规则,形成树状结构,易于理解和解释。
-
可解释性强: 决策树模型生成的规则可以直观地解释为基于哪些特征进行分类或预测,为决策过程提供了透明度。
-
能够处理混合数据类型: 决策树算法能够处理包括连续型和离散型特征在内的多种数据类型。
-
适用于多种任务: 决策树可用于分类和回归问题,并且能够进行特征选择和缺失值处理等任务。
-
可扩展性好: 决策树可以与其他算法结合,如随机森林和梯度提升树等,以提高预测性能。
决策树算法应用:
-
医疗诊断: 决策树可用于根据患者的症状和体征进行医学诊断,帮助医生做出治疗决策。
-
金融风险评估: 决策树可用于根据借款人的信用记录和财务状况来评估贷款风险,并决定是否批准贷款。
-
市场营销: 决策树可用于分析客户的行为和偏好,帮助企业制定个性化的营销策略。
-
生态学研究: 决策树可用于分析生态系统中不同因素之间的关系,帮助科学家理解生态系统的结构和功能。
决策树算法优缺点:
优点:
- 简单直观,易于理解和解释。
- 可解释性强,生成的规则直观可见。
- 能够处理混合数据类型,包括连续型和离散型特征。
- 适用于多种任务,包括分类、回归、特征选择等。
- 可扩展性好,能够与其他算法结合提高预测性能。
缺点:
- 容易过拟合,特别是在处理复杂数据集时。
- 对于类别数量较多的特征,决策树倾向于选择类别数较多的特征进行划分。
- 不稳定性高,对输入数据的小变化可能会导致树结构的大变化。
- 在处理连续型数据时可能产生过于复杂的树结构,需要进行剪枝等操作来减少模型复杂度。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)