当前位置: 首页 > news >正文

机器学习-决策树

决策树

  • 决策树
    • 1. 简介
    • 2. ID3 决策树
    • 3. C4.5决策树
    • 4. CART决策树
    • 5. 决策树对比
    • 6. 正则化 剪枝

决策树

1. 简介

"""
简介一种树形结构树中每个内部节点表示一个特征的判断每个分支代表一个判断结果的输出每个叶节点代表一种分类结果建立过程1. 特征选择选取有较强分类能力的特征2. 决策树生成根据选择的特征生成决策树3. 决策树 易过拟合采用剪枝的方法缓解过拟合
"""

2. ID3 决策树

"""
ID3 决策树熵 Entropy信息论中代表随机变量不确定度的度量熵越大 数据的不确定性越高 信息越多熵越小 数据的不确定性越低信息熵公式其中 P(xi) 表示数据中类别出现的概率,H(x) 表示信息的信息熵值信息增益概念特征a对训练数据集D的信息增益 定义为集合D的熵H(D)与特征a给定条件下D的熵(H|a)之差公式条件熵构建流程1. 计算每个特征的信息增益2. 使用信息增益最大特征将数据集 拆分为子集3. 使用该特征作为决策树的一个节点4. 使用剩余特征对子集重复上述 1 2 3 过程不足偏向于选择种类多的特征作为分裂依据
"""

信息熵 公式
在这里插入图片描述
信息增益 公式
在这里插入图片描述

3. C4.5决策树

"""
信息增益率信息增益率 = 信息增益 /特征熵特征熵本质特征的信息增益 除以 特征的内在信息相当于对信息增益进行修正, 增加一个惩罚系数特征取值个数较多时 惩罚系数较小, 特征取值个数较少时, 惩罚系数较大惩罚系数: 数据集D以特征a作为随机变量的熵的倒数
"""

信息增益率 公式
在这里插入图片描述
特征熵 公式
在这里插入图片描述

4. CART决策树

"""
CART决策树一种决策树模型, 可以用于分类 可以用于回归回归树: 使用平方误差最小化策略预测输出的是一个连续值采用叶子节点里均值作为预测输出分类生成树: 采用基尼指数最小化策略预测输出的是一个离散值采用叶子节点多数类别作为预测类别基尼值从数据集D中随机抽取两个样本,其类别标记不一致的概率Gini(D)值越小,数据集D的纯度越高基尼指数选择使划分后基尼系数最小的属性作为最优化分属性特殊说明信息增益(ID3)、信息增益率值越大(C4.5),则说明优先选择该特征基尼指数值越小(CART),则说明优先选择该特征"""
# 1.导入依赖包
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
import matplotlib.pyplot as plt
from sklearn.tree import plot_treedef titanicCase():# 2.读数据到内存并预处理# 2.1 读取数据taitan_df = pd.read_csv("./data/titanic/train.csv")print(taitan_df.head())  # 查看前5条数据print(taitan_df.info)  # 查看特性信息# 2.2 数据处理,确定x yx = taitan_df[['Pclass', 'Age', 'Sex']]y = taitan_df['Survived']# 2.3 缺失值处理x['Age'].fillna(x['Age'].mean(), inplace = True)print('x -->1', x.head(10))# 2.4 pclass类别型数据,需要转数值one-hot编码x = pd.get_dummies(x)print('x -->2', x.head(10))# 2.5 数据集划分x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.20, random_state=33)# 3.训练模型,实例化决策树模型estimator = DecisionTreeClassifier()estimator.fit(x_train, y_train)# 4.模型预测y_pred = estimator.predict(x_test)# 5.模型评估# 5.1 输出预测准确率myret = estimator.score(x_test, y_test)print('myret-->\n', myret)# 5.2 更加详细的分类性能myreport = classification_report(y_pred, y_test, target_names=['died', 'survived'])print('myreport-->\n', myreport)# 5.3 决策树可视化plot_tree(estimator,max_depth=10,filled=True,feature_names=['Pclass', 'Age', 'Sex_female', 'Sex_male'],class_names=['died', 'survived'])plt.show()

基尼值 公式
在这里插入图片描述
基尼指数公式
在这里插入图片描述

5. 决策树对比

"""
对比ID3信息增益1. ID3 只能对离散属性的数据集构成决策树2. 倾向于选择取值较多的属性C4.5信息增益率1. 缓解了ID3 分支过程中总喜欢偏向于选择值较多的属性2. 可处理连续数值型属性, 增加了对缺失值的处理方法3. 只适合于能够驻留于内存的数据集, 大数据集无能为力CART基尼指数1. 可以进行分类和回归 可处理离散属性, 也可以处理连续属性2. 采用基尼指数 计算 量减小3. 一定是二叉树构建过程1.  选择一个特征,将该特征的值进行排序, 取相邻点计算均值作为待划分点2. 根据所有划分点, 将数据集分成两部分, R1 R23. R1 和 R2 两部分的平方损失相加作为该切分点平方损失4. 取最小的平方损失的划分点, 作为当前特征的划分点5. 以此计算其他特征的最优划分点 以及该划分点对应的损失值6. 在所有的特征的划分点中, 选择出最小平方损失的划分点 作为当前树的分裂点"""
# 1.导入依赖包
import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeRegressor  # 回归决策树
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as pltdef contrastRegressor():"""线性回归与回归决策树对比:return:"""# 2.准备数据x = np.array(list(range(1, 11))).reshape(-1, 1)y = np.array([5.56, 5.70, 5.91, 6.40, 6.80, 7.05, 8.90, 8.70, 9.00, 9.05])print('x -->', x)print('y -->', y)# 3.模型训练,实例化模型model1 = DecisionTreeRegressor(max_depth=1)model2 = DecisionTreeRegressor(max_depth=3)model3 = LinearRegression()model1.fit(x, y)model2.fit(x, y)model3.fit(x, y)# 4.模型预测 # 等差数组-按照间隔x_test = np.arange(0.0, 10.0, 0.01).reshape(-1, 1)y_pre1 = model1.predict(x_test)y_pre2 = model2.predict(x_test)y_pre3 = model3.predict(x_test)print(y_pre1.shape, y_pre2.shape, y_pre3.shape)# 5.结果可视化plt.figure(figsize=(10, 6), dpi=100)plt.scatter(x, y, label='data')plt.plot(x_test, y_pre1, label='max_depth=1')  # 深度1层plt.plot(x_test, y_pre2, label='max_depth=3')  # 深度3层plt.plot(x_test, y_pre3, label='linear')plt.xlabel('data')plt.ylabel('target')plt.title('DecisionTreeRegressor')plt.legend()plt.show()

6. 正则化 剪枝

"""
正则化-剪枝预剪枝指在决策树生成过程中, 对每个节点在划分前先进行估计, 若当前节点的划分不能带来决策树泛化性能提升, 则停止划分并将当前节点标记为叶节点优点预剪枝使决策树很多分支没有展开, 降低了过拟合风险, 显著的减少了决策树的训练和测试时间的开销缺点有些分支的当前划分虽不能提升泛化性能, 单后续划分却有可能导致性能的显著提高, 预剪枝决策时有欠拟合的风险后剪枝是先从训练集生成一颗完整的决策树, 然后自底向上地对非叶节点进行考察, 若将该节点对应的子树替换为叶节点能带来决策树泛化性能提升, 则将该子树替换为叶节点优点比预剪枝保留了更多的分支, 一般情况下, 后剪枝决策树的欠拟合风险很小, 泛化性能往往优于预剪枝缺点训练时间开销比未剪枝的决策树和预剪枝的决策树都长的多"""
http://www.lryc.cn/news/417767.html

相关文章:

  • opencascade TopoDS_Shape源码学习【重中之重】
  • Self-study Python Fish-C Note15 P52to53
  • Java小白入门到实战应用教程-异常处理
  • 使用Anaconda安装多个版本的Python并与Pycharm进行对接
  • android系统中data下的xml乱码无法查看问题剖析及解决方法
  • ​MySQL——索引(三)创建索引(2)使用 CREATE INDEX 语句在已经存在的表上创建索引
  • html+css 实现hover选择按钮
  • Python数据可视化利器:Matplotlib详解
  • 2024 NVIDIA开发者社区夏令营环境配置指南(Win Mac)
  • 介绍rabbitMQ
  • AI在医学领域:使用眼底图像和基线屈光数据来定量预测近视
  • VB.NET中如何利用WPF(Windows Presentation Foundation)进行图形界面开发
  • Go语言标准库中的双向链表的基本用法
  • 手机游戏录屏软件哪个好,3款软件搞定游戏录屏
  • 【力扣】4.寻找两个正序数组的中位数
  • 【C++】初识面向对象:类与对象详解
  • 知识图谱学习总结
  • 2021-10-23 51单片机LED1-8按秒递增闪烁
  • 在Linux中宏观的看待线程
  • 提示libfakeroot.so或libfakeroot-sysv.so出错处理方法
  • 【计算机网络】什么是socket编程?以及相关接口详解
  • LeetCode.19.删除链表的倒数第n个节点
  • vue-cesium
  • 《npm 学习过程中遇到的诸多问题》
  • CentOS 介绍
  • 模拟面试题1
  • CTFHUB-web-RCE-综合过滤练习
  • Leetcode75-7 除自身以外数组的乘积
  • AI绘画工具介绍:以新奇角度分析与探索AI绘画艺术与技术的交汇点
  • 基于Springboot + Vue的宿舍管理系统