机器学习之决策树的分类树模型及决策树绘制

决策树分类模型

目录

决策树


概念

机器学习中的决策树是一种常用的有监督学习算法,主要用于分类和回归任务。决策树模型通过一系列的判断规则来进行决策,这些规则以树状结构表示。

所有数据从根节点一步步洛到叶子节点,对样本进行学习,并建立分类规则,依据分类规则对新样本进行预测。

组成部分:

  1. 根节点:决策树的起始点。
  2. 非叶子节点:代表一个特征或属性,是除根节点、叶子节点的中间节点。
  3. 叶子节点:代表一个决策结果,通常用于分类问题中的类别标签或回归问题中的预测值,最终结果点。

决策树的构建过程:

  1. 特征选择 :在构建决策树时,首先要选择一个最优的特征来对数据进行分割。常用的特征选择方法有信息增益、信息增益比、基尼指数等。
  2. 树的生成:根据选择的特征,将数据集分割成多个子集,然后对每个子集递归地进行特征选择和分割,直到满足停止条件。
  3. 剪枝为了避免过拟合,需要对决策树进行剪枝 。剪枝策略有预剪枝和后剪枝两种。预剪枝通过提前停止树的生长来防止过拟合,后剪枝则是在树完全生长后,从下到上地对非叶节点进行考察,删除不具统计显著性的节点。

优缺点

决策树的优点:
  1. 易于理解和解释。
  2. 可以处理数值型和类别型数据。
  3. 能够处理缺失值。
  4. 抗噪声能力较强。
决策树的缺点:
  1. 容易过拟合,特别是在没有剪枝的情况下。
  2. 对于连续特征,决策树需要进行离散化处理,可能会损失信息。
  3. 对于类别不平衡的数据,决策树可能会偏向于多数类

概念

表示随机变量的不确定性的度量 ,也可以表示物体内部的混乱程度

算法

数据理解

x1=[1,1,1,2,1]

x2=[1,1,1,1,1]

则x1的熵为 -4/5log(4/5,2)--1/5log(1/5,2) =0.7219280948873623

则x2的熵为 -5/5*log(5/5,2)=0,x2更小,更稳定

决策树的三种分法


ID3(Iterative Dichotomiser 3)

概念

是一种经典的决策树学习算法,ID3算法主要用于构造分类树,其核心思想是以信息增益作为特征选择的标准 ,递归地构建决策树。信息增益越大,意味着该特征在分类中的重要性越高,因此通常选择信息增益最大的特征来进行决策树的节点分裂

算法步骤
  • 数据

  • 计算类别熵

  • 通过属性熵--------->计算信息增益

    • 信息增益 = 类别熵-属性熵
  • 对比信息增益选择最大作为决策树的节点分裂

  • 根据该节点的类别和属性重复上述操作至可求出类别
    如上选择天气后,分裂除sunny,overcast,rainy三个节点

其中sunny有以下数据,重新根据sunny下的温度、湿度、是否有风属性和类别是否出去玩,重复上述操作。

C4.5

概念

其核心思想是以信息增益比作为特征选择的标准 ,递归地构建决策树。信息增益比越大,意味着该特征在分类中的重要性越高,因此通常选择信息增益比最大的特征来进行决策树的节点分裂

信息增益比

信息增益比=信息增益/分裂信息

**

如天气的分裂信息2hot-2n,2mild-1no-1yes,1cool-yes
-2/5log(2/5,2)-2/5log(2/5,2)-1/5*log(1/5,2)=1.5219280948873621

天气的信息增益是 0.247

则信息增益比为:0.16229413257416767,根据信息增益比分裂,选择更大的信息增益比,步骤于ID3相同

CART决策树

概念

决策树是一种常用的决策树学习方法,它可以用于分类问题(Classification Trees)也可以用于回归问题(Regression Trees),分裂准则:CART使用"基尼指数"(Gini index)来作为分类树的分裂准则,使用"最小二乘回归"(Least Squares Regression)来作为回归树的分裂准则。

算法

决策分类树


决策树分类函数及参数

函数导入
python 复制代码
from sklearn.tree import DecisionTreeClassifier
函数及参数

DecisionTreeClassifier(criterion='gini',max_depth=25,max_leaf_nodes=90,random_state=0)

  • 1.criterion :gini or entropy 【采用基尼系数还是熵值衡量,默认基尼系数】
  • 2.splitter: best or random 前者是在所有特征中找最好的切分点 后者是在部分特征中(数据量大的时候)【默认best,无需更改】
  • 3.max_features:(表示表示寻找最优分裂时需要考虑的特征数量,默认为None,表示考虑所有特征。),log2,sqrt,N 特征小于50的时候一般使用所有的
  • 4**.max_depth: 表示树的最大深度**,数据少或者特征少的时候可以不管这个值,如果模型样本量多,特征也多的情况下,可以尝试限制下。如果没有设置,那么将会把节点完全展开,直到所有的叶子节点都是纯的,或者达到最小叶子节点的个数阈值设置。
  • 5.min_samples_split :(表示分裂一个内部节点需要的最小样本数,默认为2),如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分,如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值,控制内部节点分裂的情况;
  • 6.min_samples_leaf :(叶子节点最少样本数)
  • 7.min_weight_fraction_leaf:(叶子节点最小的样本权重和)
  • 8.max_leaf_nodes :(最大叶子节点数),通过限制最大叶子节点数,可以防止过拟合,默认是"None",
    1. min_impurity_decrease :
  • 10.min_impurity_split: 这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点不再生成子节点。即为叶子节点 。
  • 11.class_weight 指定样本各类别的的权重,

决策树绘制函数及参数

函数导入
python 复制代码
from sklearn.tree import plot_tree
函数及参数
  • fig,ax = plt.subplots(figsize=(10,10)),显示窗口大小
  • plot_tree(dtr,filled=True,ax=ax)
    • dtr,使用的模型
    • filled=True,
    • ax=ax,窗口
  • plt.show(),显示

AUC性能测试指标

AUC-ROC曲线

可以适用于多分类,二分类等分类问题的性能度量,越接近1,样本分离性越好。

函数

y_pre_proba = dtr.predict_proba(data_te)获取概率,data_te,为测试数据

a = y_pre_proba[:,1]

auc_re = metrics.roc_auc_score(tar_te,a),结果

问题测试


问题数据及分析

除最后一列都为特征数据,最后一列为结果类别

实际测试

代码展示:

python 复制代码
import matplotlib.pyplot as plt
import pandas as pd
from cv2 import threshold
from sklearn.metrics import roc_curve
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics
datas = pd.read_excel('cart.xlsx')
data = datas.iloc[:,:-1]
tar = datas.iloc[:,-1]
# 训练集特征,测试集特征,训练集结果,测试集结果,test_size抽取的测试集百分比,train_size 抽取的训练集百分比
data_tr,data_te,tar_tr,tar_te = \
    train_test_split(data, tar, test_size=0.2,random_state=0)
dtr = DecisionTreeClassifier(criterion='gini',max_depth=20,max_leaf_nodes=80,random_state=0)
dtr.fit(data_tr,tar_tr)
tr_pr = dtr.predict(data_tr)
score = dtr.score(data_tr,tar_tr)
print(score)
print(metrics.classification_report(tar_tr,tr_pr))
te_pr = dtr.predict(data_te)
score = dtr.score(data_te,tar_te)
print(score)
print(metrics.classification_report(tar_te,te_pr))
# auc
y_pre_proba = dtr.predict_proba(data_te)
a = y_pre_proba[:,1]
auc_re = metrics.roc_auc_score(tar_te,a)

# auc绘图
fpr,tpr,thre = roc_curve(tar_te,a)
plt.figure()
plt.plot(fpr,tpr,color='darkorange',lw=2,label=f'ROC curve(area={round(auc_re,2)}')
plt.plot([0,1],[0,1],color='navy',lw=2,linestyle='--')
plt.xlim([0.0,1.0])
plt.ylim([0.0,1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend()
plt.show()
# 决策树
from sklearn.tree import plot_tree
fig,ax = plt.subplots(figsize=(8,8))
plot_tree(dtr,filled=True,ax=ax)
plt.show()

运行结果:

相关推荐
weixin_437497775 小时前
读书笔记:Context Engineering 2.0 (上)
人工智能·nlp
cnxy1885 小时前
围棋对弈Python程序开发完整指南:步骤1 - 棋盘基础框架搭建
开发语言·python
喝拿铁写前端5 小时前
前端开发者使用 AI 的能力层级——从表面使用到工程化能力的真正分水岭
前端·人工智能·程序员
goodfat5 小时前
Win11如何关闭自动更新 Win11暂停系统更新的设置方法【教程】
人工智能·禁止windows更新·win11优化工具
北京领雁科技6 小时前
领雁科技反洗钱案例白皮书暨人工智能在反洗钱系统中的深度应用
人工智能·科技·安全
落叶,听雪6 小时前
河南建站系统哪个好
大数据·人工智能·python
清月电子6 小时前
杰理AC109N系列AC1082 AC1074 AC1090 芯片停产替代及资料说明
人工智能·单片机·嵌入式硬件·物联网
Dev7z6 小时前
非线性MPC在自动驾驶路径跟踪与避障控制中的应用及Matlab实现
人工智能·matlab·自动驾驶
七月shi人6 小时前
AI浪潮下,前端路在何方
前端·人工智能·ai编程
橙汁味的风6 小时前
1隐马尔科夫模型HMM与条件随机场CRF
人工智能·深度学习·机器学习