决策树算法和实际应用

简介: 决策树算法和实际应用

相关概念

什么是决策树,它的工作原理是什么

决策树是一种基于树结构的分类算法,它通过构造一棵树来模拟决策过程。在决策树中,每个节点代表一个属性或特征,每个分支代表一个可能的取值,而每个叶子节点代表一个分类结果。决策树的工作原理是通过对数据集进行递归分割,将数据集划分为不同的子集,直到每个子集都属于同一类别或达到预定的停止条件。在分类时,将待分类样本从根节点开始,按照属性值依次向下遍历,直到到达叶子节点,即可得到分类结果。

构造剪枝

策树的构造过程中,有哪些重要的问题需要解决

有三个重要的问题需要解决:

  1. 将哪个属性作为根节点?
  2. 选择哪些属性作为后继节点?
  3. 什么时候停止并得到目标值?

对于第一个问题,我们需要选择一个最优的属性作为根节点,使得该属性能够最好地区分不同类别的样本。

对于第二个问题,我们需要选择一组最优的属性作为后继节点,使得每个子节点能够更好地区分不同类别的样本。

对于第三个问题,我们需要设置停止条件,以避免过拟合现象的发生,常见的停止条件包括达到预定的树深度、样本数量不足等。

如何对决策树进行剪枝,避免过拟合现象的发生

为了避免决策树出现过拟合现象,我们可以对决策树进行剪枝。剪枝可以分为预剪枝后剪枝两种方法。

预剪枝是在决策树构造时就进行剪枝。方法是在构造的过程中对节点进行评估,如果对某个节点进行划分,在验证集中不能带来准确性的提升,那么对这个节点进行划分就没有意义,这时就会把当前节点作为叶节点,不对其进行划分。

后剪枝是在生成决策树之后再进行剪枝,通常会从决策树的叶节点开始,逐层向上对每个节点进行评估。如果剪掉这个节点子树,与保留该节点子树在分类准确性上差别不大,或者剪掉该节点子树,能在验证集中带来准确性的提升,那么就可以把该节点子树进行剪枝。方法是用这个节点子树的叶子节点来替代该节点,类标记为这个节点子树中最频繁的那个类。

无论是预剪枝还是后剪枝,剪枝的目的都是为了减少决策树的复杂度,避免过拟合现象的发生,提高决策树的泛化能力。

决策树算法分类

ID3 、C4.5和 CART 算法分类对比

  • 节点划分指标:
  • ID3算法:信息增益
  • C4.5算法:信息增益率
  • CART算法:分类树使用基尼系数,回归树使用最小二乘偏差或最小绝对偏差
  • 树的结构:
  • ID3和C4.5算法:多叉树
  • CART算法:二叉树
  • 数据类型:
  • ID3算法:仅处理离散型数据
  • C4.5算法:处理连续型和离散型数据
  • CART算法:处理连续型和离散型数据,同时适用于多分类和回归问题
  • 应用场景:
  • ID3算法:基本的决策树算法,适用于简单的分类问题
  • C4.5算法:改进了ID3算法,适用于更复杂的分类问题,可以处理连续型数据和缺失值
  • CART算法:更加通用的决策树算法,适用于分类和回归问题,可以处理连续型数据和多分类问题

简述CART 算法

CART算法是一种决策树算法,全称为Classification And Regression Tree,中文叫做分类回归树。CART算法可以生成二叉树,同时可以作分类树和回归树。CART算法的核心思想是通过对样本数据进行递归的二元分裂,构建一棵二叉树,使得每个叶子节点对应一个类别或一个数值。在构建决策树的过程中,CART算法采用基尼系数作为属性选择的指标,选择基尼系数最小的属性进行划分。CART算法的优点是可以处理连续型和离散型的数据,同时可以处理多分类和回归问题。CART算法的缺点是容易过拟合,需要进行剪枝处理。

决策树的纯度概念是指在某个节点上,样本的类别越单一,纯度越高。选择最佳属性进行划分的方法是通过计算属性的纯度增益或纯度减少程度,选择纯度增益或减少程度最大的属性作为划分属性。在CART算法中,属性选择的指标采用的是基尼系数

Titanic 乘客生存预测

业务流程

数据解释

代码实现

import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier
import numpy as np
from sklearn.model_selection import cross_val_score
# 数据加载
train_data = pd.read_csv('./train.csv')
test_data = pd.read_csv('./test.csv')
# 数据探索
print(train_data.info())
print('-'*30)
print(train_data.describe())
print('-'*30)
print(train_data.describe(include=['O']))
print('-'*30)
print(train_data.head())
print('-'*30)
print(train_data.tail())
# 数据清洗
# 使用平均年龄来填充年龄中的 nan 值
train_data['Age'].fillna(train_data['Age'].mean(), inplace=True)
test_data['Age'].fillna(test_data['Age'].mean(),inplace=True)
# 使用票价的均值填充票价中的 nan 值
train_data['Fare'].fillna(train_data['Fare'].mean(), inplace=True)
test_data['Fare'].fillna(test_data['Fare'].mean(),inplace=True)
print(train_data['Embarked'].value_counts())
# 使用登录最多的港口来填充登录港口的 nan 值
train_data['Embarked'].fillna('S', inplace=True)
test_data['Embarked'].fillna('S',inplace=True)
# 特征选择
features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
train_features = train_data[features]
train_labels = train_data['Survived']
# test_features已经从test_data中提取出来了
test_features = test_data[features]
dvec=DictVectorizer(sparse=False)
# dvec.fit_transform 用于训练和转换数据,将数据转换为字典形式并进行特征提取和向量化处理。这个方法会返回处理后的特征矩阵。
# dvec.transform 方法只进行数据转换,即将新数据转换为字典形式并进行特征提取和向量化处理,这个方法只返回转换后的特征矩阵,不进行训练
train_features=dvec.fit_transform(train_features.to_dict(orient='records'))
print(dvec.feature_names_)
# 构造 ID3 决策树
clf = DecisionTreeClassifier(criterion='entropy')
# 决策树训练
clf.fit(train_features, train_labels)
# 将其转换为NumPy数组或字典格式
# dvec.transform是将数据集进行特征向量化的方法,它将数据集中的非数值型特征转换为数值型特征,以便于分类器等机器学习算法的处理
test_features=dvec.transform(test_features.to_dict(orient='records'))
# 决策树预测
pred_labels = clf.predict(test_features)
# 得到决策树准确率
acc_decision_tree = round(clf.score(train_features, train_labels), 6)
print(u'score 准确率为 %.4lf' % acc_decision_tree)
# 使用K折交叉验证  统计决策树准确率
# 使用score函数对训练集的准确率进行统计,正确率会接近于100%(如上结果为98.2%),但是这并不能代表决策树分类器的准确率。
# 因为我们没有测试集的实际结果,所以无法用测试集的预测结果与实际结果做对比。
# 而使用K折交叉验证可以更好地评估模型的性能,因为它可以使用所有的数据来进行训练和测试,从而更好地反映模型的性能。
print(u'cross_val_score准确率为 %.4lf' % np.mean(cross_val_score(clf, train_features, train_labels, cv=10)))

问题思考

构造特征向量时使用了 DictVectorizer 类,使用fit_transform 函数将特征向量转化为特征值矩阵。DictVectorizer 类同时也提供 transform 函数,那么这两个函数有什么区别?

transform和fit_transform虽然结果相同,但是不能互换。转换过程中,fit_transform函数会学习特征的取值范围,并将特征转换为数值型特征。transform函数不会在转化过程中学习特征的取值范围,而是使用之前学习到的特征取值范围进行转换。

数据可视化

Graphviz 可视化工具帮我们把决策树呈现出来

Python可视化工具库实战_数据与后端架构提升之路的博客-CSDN博客

实战总结

1.   特征选择是分类模型好坏的关键。选择什么样的特征,以及对应的特征值矩阵,决定了分类

模型的好坏。通常情况下,特征值不都是数值类型,可以使用 DictVectorizer 类进行转

化;

2.   模型准确率需要考虑是否有测试集的实际结果可以做对比,当测试集没有真实结果可以对比

时,需要使用 K 折交叉验证 cross_val_score;

3. Graphviz 可视化工具可以很方便地将决策模型呈现出来,帮助你更好理解决策树的构建。


目录
打赏
0
0
2
0
25
分享
相关文章
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
99 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
34 12
基于 Python 的布隆过滤器算法在内网行为管理中的应用探究
在复杂多变的网络环境中,内网行为管理至关重要。本文介绍布隆过滤器(Bloom Filter),一种高效的空间节省型概率数据结构,用于判断元素是否存在于集合中。通过多个哈希函数映射到位数组,实现快速访问控制。Python代码示例展示了如何构建和使用布隆过滤器,有效提升企业内网安全性和资源管理效率。
36 9
解锁机器学习的新维度:元学习的算法与应用探秘
元学习作为一个重要的研究领域,正逐渐在多个应用领域展现其潜力。通过理解和应用元学习的基本算法,研究者可以更好地解决在样本不足或任务快速变化的情况下的学习问题。随着研究的深入,元学习有望在人工智能的未来发展中发挥更大的作用。
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
53 2
探索企业文件管理软件:Python中的哈希表算法应用
企业文件管理软件依赖哈希表实现高效的数据管理和安全保障。哈希表通过键值映射,提供平均O(1)时间复杂度的快速访问,适用于海量文件处理。在Python中,字典类型基于哈希表实现,可用于管理文件元数据、缓存机制、版本控制及快速搜索等功能,极大提升工作效率和数据安全性。
76 0
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
81 1
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
100 1
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
基于遗传优化算法的风力机位置布局matlab仿真
本项目基于遗传优化算法(GA)进行风力机位置布局的MATLAB仿真,旨在最大化风场发电效率。使用MATLAB2022A版本运行,核心代码通过迭代选择、交叉、变异等操作优化风力机布局。输出包括优化收敛曲线和最佳布局图。遗传算法模拟生物进化机制,通过初始化、选择、交叉、变异和精英保留等步骤,在复杂约束条件下找到最优布局方案,提升风场整体能源产出效率。