目录
决策树算法概述
决策树算法背景
我们在日常生活中经常会遇到一些选择需要去做一些选择,比如我们在找工作的时候每个人都希望能找到一个好的工作,但是公司那么多,工作种类那么多,什么样的工作才能算是好工作,这个时候就需要我们对众多的工作去做一个判断。
最常用的一种方法就是制定几个可以衡量工作好坏的指标,比如公司所处的行业是什么、应聘的岗位是什么、投资人是谁、薪酬待遇怎么样等等。评判一个工作好坏的指标有很多个,但是每一个指标对工作好坏这一结果的决策能力是不一样的,为了更好的对每一个指标的决策能力做出判断,我们引入一个可以量化信息决策能力的概念,这个概念就是信息熵。
信息熵是用来度量(量化)信息的,一条信息的信息量与其不确定性有着直接的联系,当我们需要了解清楚一件不确定的事情的时候,我们就需要了解大量的信息。
决策树算法简介
决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。
决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。 数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用来作预测(就像上面的银行官员用他来预测贷款风险)。
从数据产生决策树的机器学习技术叫做决策树学习, 通俗说就是决策树。
一个决策树包含三种类型的节点:
根节点:第一个选择点,通常用矩形框来表式
非叶子节点与分支:中间过程,通常用圆圈何竖线来表式
叶子节点:最终的决策结果,通常用三角形来表示决策树的组成
决策树算法核心思想
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据集进行分割,使得对各个子数据集有一个最好的分类过程,这一过程对应着对特征空间的划分,也对应着决策树的构建。
开始构建根节点,将所有的训练数据集都放在根节点,选择一个最有特征,按照这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下获得最好的分类。如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到对应的叶节点中去;如果还有子集不能够被基本正确分类,那么就对这些子集新的选择最优特征,继续对其进行分割,构建相应的结点。如此递归下去,直到所有的训练数据子集被基本正确分类,或者没有合适的特征为止。最后每个子集都被分到叶节点上,即都有了明确的分类,这就生成了一颗决策树。
根节点是决策树最开始的结点,内部结点是可以继续分类的结点。
利用上面递归的方法可能对训练数据有很好的预测能力,但是对未知数据集未必有很好的分类能力,可能发生过拟合的现象,这就需要对决策树进行剪枝,让树变得简单一些,从而拥有更好的泛化能力。
决策树算法的工作过程
特征选择
特征选择就是选择对训练数据具有分类能力的特征,也就是我们在背景里面提到的对工作好坏评判起作用的指标,这样就可以提高决策树学习的效率。如果一个特征的分类能力与随机分类的结果没什么差异,则称这个特征是没有分类能力的。一般我们把这类特征是直接去掉的,我们优先那些能够对我们的分类起到决定作用的特征,我们在具体选取的时候会用到两个准则:信息增益或信息增益比。
信息增益
- 熵
在信息论和概率统计中,熵表示随机变量不确定性的度量。设X是一个取有限个值的离散随机变量,其概率分布为:P(X=xi)=pi,i=1,2,...,n。
则随机变量X的熵定义为H(X)=-∑pi log pi。
因熵只依赖于X的分布,而与X无关,所以可将X的熵记作H(p),即H(p)=-∑pi log pi。
熵越大,随机变量的不确定性就越大。
当pi=1或pi=1时,H(p)等于0,此时,随机变量是完全没有不确定性的。当pi=0.5时,H(p)等于1,此时,熵取值最大,随机变量不确定性最大。
- 条件熵
设有随机变量(X,Y)其联合概率分布为:P(X=xi,Y=yi)=Pij,条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性。随机变量X给定条件下随机变量Y的条件熵H(Y|X),定义为X给定条件下Y的条件概率分布的熵对X的数学期望:H(Y|X)=∑pi H(Y|X=xi)。
- 信息增益
信息增益表示在得知特征X的信息而使得类Y的不确定性减少的程度。
特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A在给定条件下D的经验条件熵H(D|A)之差,即g(D,A)=H(D)-H)(D|A)。
一般地,熵H(Y)与条件熵H(Y|X)之差称为互信息,决策树学习中的信息增益等价于训练数据集中的类与特征的互信息。
根据信息信息增益选择特征的方法是:对训练数据集(或子集)D,计算其每个特征的信息增益,并比较他们的大小,选择信息增益最大的特征。
- 信息增益算法步骤
- 计算训练数据集的经验熵H(D)
- 计算特征A对数据集D的经验条件熵H(D|A),这里的条件熵H(D|A)=∑pi H(D|A=Ai)=∑pi H(Di)=∑pi ∑p(Dik)log(p(Dik)),(Di中的i表示根据特征A将样本D分成i个类别,k表示样本D本身按照结果分成k个类别,比如前面的对一个工作好坏进行评定,根据工作内容好坏对样本进行分类,得到的类别数就是k;在拿特征A-工资待遇对样本进行分类得到样本类别数i),p(Dik)表示Di类别中类别k出现的概率,求取方法与朴素贝叶斯中对概率的求取方法一致,用似然估计,即用事件出现的频数的比值来代替概率。
- 计算信息增益g(D,A)
信息增益比
以信息增益作为划分训练数据集的特征,存在偏向于选取取值较多的特征的问题使用信息增益比可以对这一问题进行校正。
特征A对训练数据集D的信息增益比gR(D,A)定义为信息增益g(D,A)与训练数据集D关于特征A的值的熵HA(D)之比,即gR(D,A)=g(D,A)/HA(D)。其中
HA(D)=∑p(Di)log(p(Di))。
决策树的生成
常用的决策树生成的方法有ID3、C4.5、CART、Random Forest、Adaboost、GBDT、Xgboost、LightGBM算法。本篇也着重介绍这两种算法。
ID3算法
ID3算法的核心是在决策树各个结点的上应用信息增益准则选择特征,递归地构建决策树。
具体方法就是从根节点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子节点;再对子节点递归地调用以上方法,构建决策树;直至所有特征的信息增益均很小或没有特征可以选择为止,最后得到一个决策树。
C4.5的生成算法
C4.5和ID3算法相似,C4.5是在ID3的基础上进行了改进,从ID3用信息增益来选取特征改成了用信息增益比来选取特征,其他步骤均与ID3算法一致,不展开阐述。
决策树的修剪
决策树生成算法是通过递归的方法产生决策树,直到不能继续下去为止,这样产生的树往往对训练数据的分类很准确,但对未知数据的分类却没那么准确,即出现过拟合的现象。过拟合的原因在于学习时过度考虑如何提高训练数据的正确分类,从而构建出过于复杂的决策树。解决这个问题的方法是考虑决策树的复杂度,对已生成的决策树进行简化,我们把这种对已生成的树进行简化的过程称为剪枝。
剪枝是从已生成的树上裁掉一些子树或叶节点,并将其根结点或父节点作为新的叶节点,从而简化分类树模型。
决策树的剪枝往往通过极小化决策树整体的损失函数或代价函数来实现。设树T的叶节点个数为|T|,t是树T的叶节点,该叶结点由Nt个样本点,其中k类的样本点由Ntk个,k=1,2,...,K,Ht(T)为叶节点t上的经验熵,α≥0为参数,则决策树学习的损失函数可以定义为:
再来看一下常规意义上的损失函数:
公式的前半部分表示训练误差,对于这一部分,我们希望他的值越小越好,后半部分是正则化项,是为了防止过拟合而加的一个惩罚项。
所以我们可以把决策树的损失函数写成:
上式中,C(T)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,|T|表示模型复杂度,参数参数α≥0控制两者之间的影响。较大的α促使选择较简单的模型(树),较小的α促使选择较复杂的模型(树)。α=0意味着只考虑模型与训练数据的拟合程度,不考虑模型的复杂度。
剪枝,就是当α确定时,选择损失函数最小的模型,即损失函数最小的子树。
算法步骤
输入:生成算法产生的整个树T,参数α
输出:修剪后的子树Tα
- 计算每个结点的经验熵
- 递归地从树的叶节点向上回缩,设一组叶节点回缩到其父节点之前与之后的整体树分别为TB与TA,其对应的损失函数值分别为Cα(TB)与Cα(TA),如果:图片,则进行剪枝,即将父节点变为新的叶节点。
- 返回步骤2,直到不能继续为止,得到损失函数最小的子树Tα。
决策树算法的代码实现
python
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
from sklearn.tree import export_graphviz
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.3, random_state=42)
# 创建决策树分类器
clf = DecisionTreeClassifier(random_state=42)
# 训练模型
clf.fit(X_train, y_train)
# 使用训练好的模型进行预测
y_pred = clf.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
# 导出决策树的dot文件
dot_data = export_graphviz(clf, out_file=None,
feature_names=data.feature_names,
class_names=data.target_names,
filled=True, rounded=True,
special_characters=True)
# 使用graphviz渲染图形
graph = graphviz.Source(dot_data)
# 保存树图为文件
graph.render("iris_tree")
决策树算法的优缺点
优点
易于理解:决策树的结构直观,易于人类理解。模型的决策过程可以通过树状图的形式清晰地展示出来。
数据要求低:决策树算法不需要数据是正态分布的,也不需要数据是线性可分的,因此它对数据的要求较低。
特征处理简单:决策树算法可以处理数值型和类别型数据,不需要复杂的特征工程。
可处理混合数据类型:决策树可以同时处理连续变量和离散变量。
可视化:决策树的结果可以很容易地通过树状图进行可视化,有助于理解模型的决策逻辑。
易于实现:许多机器学习库(如scikit-learn)都提供了决策树的实现,使用起来非常方便。
处理非线性问题:决策树能够处理非线性问题,因为它通过树状结构将数据分割成多个区域。
不需要参数估计:在决策树的构建过程中,不需要对数据进行参数估计。
缺点
容易过拟合:决策树容易生成过于复杂的树,导致模型在训练数据上表现很好,但在测试数据上表现不佳。
不稳定:小的数据变动可能会导致生成完全不同的决策树,这使得模型的泛化能力较差。
对噪声敏感:决策树对噪声数据和异常值非常敏感,这些数据可能会影响树的构建和预测结果。
需要剪枝:为了减少过拟合和提高模型的泛化能力,通常需要对决策树进行剪枝处理,这增加了模型训练的复杂性。
计算成本高:随着树的深度增加,决策树的计算成本会显著增加,尤其是在处理大规模数据集时。
对连续变量的分割点选择:决策树在处理连续变量时,需要选择一个合适的分割点,这可能会影响模型的性能。
不平衡数据集表现不佳:在不平衡的数据集中,决策树可能会偏向于多数类,导致少数类的预测效果不佳。
模型解释性有限:虽然决策树的可视化有助于理解模型,但当树变得非常复杂时,理解其决策逻辑可能会变得困难。
决策树算法的应用场景
金融行业
- 信用评估:决策树可以用于评估客户的信用风险,帮助银行和金融机构决定是否批准贷款。
- 欺诈检测:通过分析交易模式和客户行为,决策树可以识别潜在的欺诈行为。
- 投资决策:决策树可以辅助投资者在复杂的市场环境中做出投资决策。
医疗行业
- 疾病诊断:决策树可以用于辅助医生进行疾病诊断,通过分析病人的症状和检查结果来预测疾病类型。
- 药物疗效预测:通过分析患者的基因和病史,决策树可以预测药物的疗效和副作用。
- 医疗风险评估:决策树可以帮助医疗机构评估手术风险和治疗计划的可行性。
电商行业
- 商品推荐:决策树可以分析用户的行为和偏好,推荐适合的商品。
- 销售预测:通过分析历史销售数据,决策树可以预测未来的销售趋势。
- 用户行为分析:决策树可以分析用户在网站上的行为,优化用户体验和提高转化率。
社交媒体
- 情感分析:决策树可以分析用户在社交媒体上的言论,判断其情感倾向。
- 事件预测:通过分析用户的行为和互动,决策树可以预测可能发生的事件。
- 用户行为分析:决策树可以帮助社交媒体平台了解用户的行为模式和偏好。
数据挖掘
- 特征选择:决策树可以用于特征选择,通过计算特征的重要性来筛选出对预测结果影响最大的特征。
- 异常检测:决策树可以用于异常检测,通过构建深度较大的树来识别数据集中的异常点。
回归任务
- 房价预测:决策树可以用于预测房价,通过分析房屋的特征和市场数据来估计其价值。
- 股票价格预测:决策树可以用于预测股票价格,分析市场趋势和经济指标。
分类任务
- 垃圾邮件分类:决策树可以用于识别和过滤垃圾邮件。
- 疾病诊断:在医疗领域,决策树可以辅助诊断疾病,通过分析症状和检查结果来预测疾病类型。
教育领域
- 课程推荐:决策树可以分析学生的学习习惯和成绩,推荐适合的课程和学习资源。
能源领域
能源消耗预测:决策树可