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

决策树分类模型

目录

决策树


概念

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

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

组成部分:

  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()

运行结果:

相关推荐
风一样的树懒23 分钟前
Python使用pip安装Caused by SSLError:certificate verify failed
人工智能·python
9命怪猫28 分钟前
AI大模型-提示工程学习笔记5-零提示
人工智能·笔记·学习·ai·提示工程
cnbestec1 小时前
GelSight Mini视触觉传感器凝胶触头升级:增加40%耐用性,拓展机器人与触觉AI 应用边界
人工智能·机器人
测试最靓仔1 小时前
allure报告修改默认语言为中文
python·自动化
bohu831 小时前
ros2-4.2 用python实现人脸识别
人工智能·opencv·人脸识别·ros2·服务调用
Loving_enjoy2 小时前
ChatGPT 数据分析与处理使用详解
大数据·人工智能
whaosoft-1432 小时前
51c自动驾驶~合集45
人工智能
AI视觉网奇2 小时前
imageio 图片转mp4 保存mp4
python
凡人的AI工具箱2 小时前
每天40分玩转Django:Django DevOps实践指南
运维·后端·python·django·devops
shaxin观yin2 小时前
python反序列化+沙箱逃逸++js+redis
python·学习·https