首页 > 编程语言 >亦菲喊你来学机器学习(10) --决策树算法

亦菲喊你来学机器学习(10) --决策树算法

时间:2024-08-24 13:56:05浏览次数:8  
标签:10 剪枝 -- 模型 来学 算法 data 节点 决策树

文章目录

决策树

机器学习中的决策树算法是一种基本的分类与回归方法,它通过树状结构建立决策模型,以解决分类和回归问题。以下是对决策树算法的详细解析:

一、基本定义

决策树是一种直观的预测模型,它表示对象属性和对象值之间的一种映射关系。树中的每个节点表示某个对象,而每个分叉路径则代表某个可能的属性值,每个叶节点则对应从根节点到该叶节点所经历的路径所表示的对象的值。对于分类问题,决策树模型表示基于特征对实例进行分类的过程,可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。

二、学习过程

决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。这一过程对应着特征空间的划分,也对应着决策树的构建。常见的决策树学习算法包括ID3、C4.5和CART算法。

  1. ID3算法:
    • 核心思想:以信息增益来度量特征选择,选择信息增益最大的特征进行分裂。
    • 优点:理论清晰,方法简单,学习能力较强。
    • 缺点:对可取值数目较多的属性有所偏好,只能处理分类问题,不能处理连续值属性,且没有剪枝策略,容易过拟合。
  2. C4.5算法:
    • 核心思想:克服了ID3对特征数目的偏重这一缺点,引入信息增益率来作为分类标准。
    • 优点:能够处理连续属性,且能够处理缺失值。
    • 缺点:生成的决策树规模一般比ID3大。
  3. CART算法:
    • 核心思想:使用基尼指数来选择特征进行分裂,且生成的决策树必须是二叉树。
    • 优点:既可以用于分类也可以用于回归,生成的决策树规模相对较小。
    • 缺点:在样本不平衡时,生成的决策树会偏向于那些样本数量多的类别。

我们在构建模型时,常用基尼指数判断类别即CART算法。

三、剪枝处理

决策树算法很容易过拟合,剪枝算法就是用来防止决策树过拟合,提高泛化性能的方法。剪枝分为预剪枝与后剪枝。

  • 预剪枝:在决策树的生成过程中,对每个节点在划分前先进行评估,若当前的划分不能带来泛化性能的提升,则停止划分,并将当前节点标记为叶节点。预剪枝的不足在于可能过早地停止决策树的生长,导致模型欠拟合。
  • 后剪枝:先从训练集生成一颗完整的决策树,然后自底向上对非叶节点进行考察,若将该节点对应的子树替换为叶节点,能带来泛化性能的提升,则将该子树替换为叶节点。后剪枝决策树通常比预剪枝决策树保留了更多的分枝,一般情形下,后剪枝决策树的欠拟合风险很小,泛化能力往往优于预剪枝决策树。但后剪枝决策树的训练时间开销较大。

我们在学习时,主要使用预剪枝,可以通过调整最大深度来调整数的生长。

四、决策树的特点

  • 优点:
    • 决策树模型容易理解,可解释性较好。
    • 可以用于小数据集,时间复杂度较小。
    • 可以处理多输入问题,对缺失值不敏感。
  • 缺点:
    • 在处理特征关联性比较强的数据时,表现得不太好。
    • 当样本中各类别不均匀时,信息增益会偏向于那些具有更多数值的特征。
    • 对连续性的字段比较难预测,容易出现过拟合。
    • 当类别太多时,错误可能会增加得比较快。

综上所述,决策树算法是机器学习领域中的一种重要算法,它通过树状结构建立决策模型,以直观的方式展现分类或回归的过程和结果。在实际应用中,需要根据具体问题和数据集的特点选择合适的决策树算法及其剪枝策略。

五、构建模型

对于构建一个完整的模型,主要从以下两个方面进行:

  1. 训练模型
  2. 测试模型

训练模型

  1. 收集数据

链接:训练数据
提取码:7f7y

  1. 数据预处理

数据预处理主要有以下几个方面:读取数据、划分测试集与训练集:

import pandas as pd
import numpy as np

data = pd.read_excel("电信客户流失数据.xlsx")
data_x = data.drop("流失状态",axis = 1)
data_y = data.流失状态

from sklearn.model_selection import train_test_split
data_train,data_test,target_train,target_test = \
    train_test_split(data_x,data_y,test_size=0.2,random_state=0) #从原始数据中,划分测试集与训练集
  1. 调参,交叉验证

交叉验证(Cross-Validation)是一种评估统计分析模型性能的方法,特别是在预测模型中非常有用。它通过重复使用数据子集来训练模型并测试模型,以评估模型对新数据的泛化能力。

同时,在此处可以调参数,找到能使模型效果更好的参数:

from sklearn import tree
from sklearn.model_selection import cross_val_score

dep_parma = []
scores = []
for i in range(5,20):
    lr = tree.DecisionTreeClassifier(criterion='gini',max_depth=i,random_state=0)
    score = cross_val_score(lr,data_train,target_train,cv=8,scoring='recall')
    sco_mean = sum(score)/len(score)
    scores.append(sco_mean)
    dep_parma.append(i)
# print(scores)
dep_choose =  dep_parma[np.argmax(scores)]
print("最优深度为:",dep_choose)
----------------------------------
最优深度为: 14

除此之外,决策树模型中还可以调整的参数有:

min_samples_split (表示分裂一个内部节点需要的最小样本数,默认为2)

max_leaf_nodes (最大叶子节点数),通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。

  1. 训练模型
dtr = tree.DecisionTreeClassifier(criterion='gini',max_depth=dep_choose,min_samples_split=8,random_state=0)
dtr.fit(data_train,target_train)

测试模型

  1. 用训练集本身数据测试
from sklearn import metrics
train_predict = dtr.predict(data_train)
print(metrics.classification_report(target_train,train_predict))
----------------------------------
              precision    recall  f1-score   support

           0       0.94      0.98      0.96       357
           1       0.94      0.80      0.87       123

    accuracy                           0.94       480
   macro avg       0.94      0.89      0.91       480
weighted avg       0.94      0.94      0.94       480
  1. 划分的测试集数据
test_predict = dtr.predict(data_test)
print(metrics.classification_report(target_test,test_predict))
--------------------------
              precision    recall  f1-score   support

           0       0.88      0.76      0.82        89
           1       0.51      0.71      0.59        31

    accuracy                           0.75       120
   macro avg       0.70      0.74      0.71       120
weighted avg       0.79      0.75      0.76       120

这样,我们就成功构建了一个决策树模型啦!!

总结

本篇介绍了:

  1. 常见的决策树学习算法:ID3算法、C4.5算法、CART算法
  2. 常用预剪枝方法防止过拟合
  3. 决策树主要的模型参数调整有:
    1. 树的最大深度:max_depth
    2. 最大叶子节点数:max_leaf_nodes
    3. 分裂一个内部节点需要的最小样本数:min_samples_split

标签:10,剪枝,--,模型,来学,算法,data,节点,决策树
From: https://blog.csdn.net/m0_74896766/article/details/141491070

相关文章

  • TensorFlow 的基本概念和使用场景
    TensorFlow是一个开源的机器学习框架,由Google开发和维护。它允许开发者使用图形计算的方式构建和训练机器学习模型。TensorFlow的基本概念如下:张量(Tensor):TensorFlow使用张量来表示数据。张量是多维数组,在计算图中流动,是TensorFlow的基本数据单元。张量可以是标量(0维数组)、......
  • 大数据技术之 Flume概述、安装(1)
    目录Flume概述 Flume定义为什么选用Flume Flume基础架构 AgentSourceSink Channel EventFlume安装 Flume安装部署 安装地址 安装部署Flume概述 Flume定义Flume是Cloudera提供的一个高可用的、高可靠的、分布式的海量日志采集、聚合和传......
  • 编程之旅:从挫折到突破的心路历程
    你是如何克服编程学习中的挫折感的?编程学习之路上,挫折感就像一道道难以逾越的高墙,让许多人望而却步。然而,真正的编程高手都曾在这条路上跌倒过、迷茫过,却最终找到了突破的方法。你是如何在Bug的迷宫中找到出口的?面对复杂的算法时,你用什么方法让自己保持冷静?让我们一起分享......
  • 大数据技术之Flume应用案例(2)
    目录 监控端口数据官方案例步骤1:准备环境步骤2:配置FlumeAgent步骤3:启动FlumeAgent步骤4:发送数据到Flume步骤5:查看HDFS中的数据注意事项示例说明实时监控单个追加文件案例需求分析实现步骤(1)确保环境变量配置正确(2)创建flume-file-hdfs.conf......
  • 彩度战队运行故障:Assembly-CSharp.dll文件缺失原因及修复方法
    一、缺失原因Assembly-CSharp.dll文件是Unity游戏引擎在编译C#脚本时生成的一个动态链接库(DLL)文件,它包含了游戏或软件的核心逻辑和控制代码,是游戏或软件能够正常运行的关键部分。在彩度战队游戏中,Assembly-CSharp.dll文件缺失可能由以下原因造成:安装不完整或损坏:游戏在安......
  • 本地分支推送到githud分支上操作过程:
    一、准备阶段:配置SSH密钥配置Git用户信息:gitconfig--globaluser.name"123456"gitconfig--globaluser.email"[email protected]"gitconfig--list生成SSH密钥:ssh-keygen-trsa-C"[email protected]"当被询问保存位置时,按回车键接受默认位置。接着输入密码两次。......
  • QQ稳定运行秘籍:处理qbcore.dll错误,告别频繁报错
    在使用QQ时,如果遇到因qbcore.dll文件错误而导致的频繁报错问题,不必过于担心。以下是一些有效的处理方法和建议,帮助您恢复QQ的稳定运行:1.重新安装QQ应用程序qbcore.dll是QQ应用程序的一个关键动态链接库文件,负责与操作系统进行交互并支持QQ的运行。如果该文件出现错误或损坏......
  • Steam共享库被锁怎么办?Steam共享库锁定问题全面解析与解锁指南
    当Steam共享库被锁定时,玩家可能会遇到无法访问或共享游戏库的问题。以下是对Steam共享库锁定问题的全面解析与解锁指南:一、理解Steam共享库锁定的原因同步问题:可能是由于Steam客户端的同步问题导致的,例如账户状态未及时更新。账户使用冲突:如果其他家庭成员或朋友正在使用共......
  • 英超:阿森纳作客再战维拉
    特鲁瓦最终主场0-1不敌克莱蒙特,新赛季前两轮0进球丢5个,备战法乙的时间不够,肯定对特鲁瓦赛季初的表现造成影响。客观而言,经历了人员流失的克莱蒙特也不算强,只是恰好能击败特鲁瓦而已。  今天说下指数的话题,首先明确一点,赛前的指数分析都很主观,很多人赛后的复盘更是纯靠脑洞......
  • 《红色警戒2:共和国之辉2》续作报错?BINKW32.DLL文件缺失解决方案全攻略
    《红色警戒2:共和国之辉2》(注:实际上,《红色警戒2》的官方版本中并未直接提及“共和国之辉2”作为续作,这里可能是指基于《红色警戒2》的某个MOD或类似游戏)在运行时如果遇到“BINKW32.DLL文件缺失”的报错,这通常意味着游戏无法找到或加载这个必要的动态链接库文件。以下是一系列解......