1.决策树原理

  • 决策树:树形结构流程图(漏斗型),模型本身包含一些列逻辑决策。数据分类从根节点开始,根据特征值遍历树上的各个决策节点。
  • 几乎可应用于任何类型的数据建模,且性能不错。但当数据有大量多层次的名义特征或者大量的数值特征时,可能会生成一个过于复杂的决策树。
  • 递归划分/分而治之:利用特征值将数据分解成具有相似类的较小的子集。
  • 过程:从代表整个数据集的根节点开始,选择最能预测目标类的特征,然后将案例划分到该特征不同值的组中(即第一组树枝),继续分而治之其他节点,每次选择最佳的候选特征,直到节点上所有案例都属于同一类,或者没有其他的特征来区分案例,或者决策树已经达到了预先定义的大小。
  • 由于数据可一直划分(直到组内的特征没有区别),所以决策树容易过拟合,给出过于具体细节的决策。
  • C5.0决策树算法:C4.5/ID3(迭代二叉树3代)算法的改进:



    ①选择最佳分割

    确定根据哪个特征来进行分割。

    纯类:一组数据中只包含单一的类。
  • 熵Entropy(S):用来度量纯度,取值0-1。0表示样本完全同质,1表示样本凌乱最大。



    如两个类的数据分割,红为60%,白为40%,则该数据分割的熵为:

    任何可能的两个类划分的熵的图形(一个类比例x,另一个1-x):
curve(-x*log2(x)-(1-x)*log2(1-x),
col='red',xlab = 'x',ylab = 'Entropy',lwd=4)

  • 信息增益:用熵值计算每一个可能特征的分割引起的同质性(均匀性)变化,即分割前与分割后的数据分区熵值之差。



    如果一次分割后划分到多个分区,则要通过落入每一分区比例按权重来计算所有分区熵值总和:



    信息增益越高,根据某一特征分割后创建的分组越均衡。

以上假定的是名义特征,对于数值特征同样可用信息增益。即通过设置阈值来划分不同组。

除了信息增益可用于特征分割标准,其他常用的标准还有:基尼系数,卡方统计量,增益比等。

②修剪决策树

  • 修建决策树减少它的大小,避免过拟合。
  • 提前终止法/预剪枝决策树法:决策节点达到一定数量的案例就停止。
  • 后剪枝决策树法(更有效):根据节点处的错误率使用修剪准则将树减少到更合适的大小。
  • C5.0算法能自动修剪。采用后剪枝策略,先生成一个过拟合训练集的大决策树,再删除对分类误差影响不大的节点和分枝。这样整个分枝会上移或被取代(子树提升/子树替换)。

2.决策树应用示例

采用C5.0决策树来识别高风险银行贷款

2.1)收集数据

信贷数据集:包含1000个贷款案例,贷款特征和贷款者特征的数值特征和名义特征的组合。其中一个类变量表示贷款是否陷入违约。

数据下载:

链接: https://pan.baidu.com/s/1p6eTQvUZEAHd9GaFQN0BKA 提取码: ph8u

2.2)探索和准备数据

## Example: Identifying Risky Bank Loans ----
## Step 2: Exploring and preparing the data ----
credit <- read.csv("credit.csv")
str(credit) # look at two characteristics of the applicant
table(credit$checking_balance)
table(credit$savings_balance) # look at two characteristics of the loan
summary(credit$months_loan_duration)
summary(credit$amount) # look at the class variable
table(credit$default) # create a random sample for training and test data
# use set.seed to use the same random number sequence as the tutorial
set.seed(123)
train_sample <- sample(1000, 900) str(train_sample) # split the data frames
credit_train <- credit[train_sample, ]
credit_test <- credit[-train_sample, ] # check the proportion of class variable
prop.table(table(credit_train$default))
prop.table(table(credit_test$default))

2.3)训练模型

## Step 3: Training a model on the data ----
# build the simplest decision tree
library(C50)
credit_model <- C5.0(credit_train[-17], credit_train$default)
# trial可选数值用于控制自助法循环次数(默认1)
# costs可选矩阵用于给出各类型错误对应的成本 # display simple facts about the tree
credit_model # display detailed information about the tree
summary(credit_model)



2.4)评估模型性能

依然使用混淆矩阵来评价模型。

## Step 4: Evaluating model performance ----
# create a factor vector of predictions on test data
credit_pred <- predict(credit_model, credit_test) # cross tabulation of predicted versus actual classes
library(gmodels)
CrossTable(credit_test$default, credit_pred,
prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
dnn = c('actual default', 'predicted default'))



错误率30%,且只正确预测了15个贷款违约者。需要提升性能。

2.5)提高模型性能

通过自适应增强算法(boosting)

  • 通过将很多学习能力弱的学习算法组合在一起,尤其使用优点和缺点的多种学习方法组合,可以显著提高分类器的准确性。
  • 参数trials设为10,即10个试验(研究表明能降低约25%的错误率)
## Step 5: Improving model performance ----

## Boosting the accuracy of decision trees
# boosted decision tree with 10 trials
credit_boost10 <- C5.0(credit_train[-17], credit_train$default,
trials = 10)
credit_boost10
summary(credit_boost10) credit_boost_pred10 <- predict(credit_boost10, credit_test)
CrossTable(credit_test$default, credit_boost_pred10,
prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
dnn = c('actual default', 'predicted default'))

总的错误率仍为30%。缺乏更大的提高可能是本身使用了一个相对较小的训练集。

将惩罚因子分配到不同类型的错误上

假阴性付出的代价比较大(给有违约的申请者放贷),可以通过拒绝大量处于边界线的申请者来规避风险。

将惩罚因子设定在一个代价矩阵中,用来指定每种错误相对于其他任何错误有多少倍的严重性。如错放一个贷款违约者的损失是错失一次基于损失的4倍:

# create dimensions for a cost matrix
matrix_dimensions <- list(c("no", "yes"), c("no", "yes"))
names(matrix_dimensions) <- c("predicted", "actual")
matrix_dimensions # build the matrix
error_cost <- matrix(c(0, 1, 4, 0), nrow = 2, dimnames = matrix_dimensions)
error_cost



可通过costs参数来指定代价矩阵:

# apply the cost matrix to the tree
credit_cost <- C5.0(credit_train[-17], credit_train$default,
costs = error_cost)
credit_cost_pred <- predict(credit_cost, credit_test) CrossTable(credit_test$default, credit_cost_pred,
prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
dnn = c('actual default', 'predicted default'))



虽然总的错误率增加到了33%,但假阴性率降低到了7%。以增加错误肯定为代价,减少错误否定的这种折中的方案是可以接受的。


机器学习与R语言系列推文汇总:

【机器学习与R语言】1-机器学习简介

【机器学习与R语言】2-K近邻(kNN)

【机器学习与R语言】3-朴素贝叶斯(NB)

【机器学习与R语言】4-决策树

【机器学习与R语言】5-规则学习

【机器学习与R语言】6-线性回归

【机器学习与R语言】7-回归树和模型树

【机器学习与R语言】8-神经网络

【机器学习与R语言】9-支持向量机

【机器学习与R语言】10-关联规则

【机器学习与R语言】11-Kmeans聚类

【机器学习与R语言】12-如何评估模型的性能?

【机器学习与R语言】13-如何提高模型的性能?

【机器学习与R语言】4-决策树的更多相关文章

  1. 【机器学习与R语言】13- 如何提高模型的性能?

    目录 1.调整模型参数来提高性能 1.1 创建简单的调整模型 2.2 定制调整参数 2.使用元学习来提高性能 2.1 集成学习(元学习)概述 2.2 bagging 2.3 boosting 2.4 ...

  2. 【机器学习与R语言】12- 如何评估模型的性能?

    目录 1.评估分类方法的性能 1.1 混淆矩阵 1.2 其他评价指标 1)Kappa统计量 2)灵敏度与特异性 3)精确度与回溯精确度 4)F度量 1.3 性能权衡可视化(ROC曲线) 2.评估未来的 ...

  3. 【机器学习与R语言】11- Kmeans聚类

    目录 1.理解Kmeans聚类 1)基本概念 2)kmeans运作的基本原理 2.Kmeans聚类应用示例 1)收集数据 2)探索和准备数据 3)训练模型 4)评估性能 5)提高模型性能 1.理解Km ...

  4. 【机器学习与R语言】7-回归树和模型树

    目录 1.理解回归树和模型树 2.回归树和模型树应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高模型性能 1.理解回归树和模型树 决策树用于数值预测: 回归树:基于到达 ...

  5. 【机器学习与R语言】5-规则学习算法

    目录 1.分类规则原理 1.1 1R单规则算法 1.2 RIPPER算法 2. 规则学习应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估性能 5)提高性能 6)选择决策树中的分类规则 ...

  6. 【机器学习与R语言】1-机器学习简介

    目录 1.基本概念 2.选择机器学习算法 3.使用R进行机器学习 1.基本概念 机器学习:发明算法将数据转化为智能行为 数据挖掘 VS 机器学习:前者侧重寻找有价值的信息,后者侧重执行已知的任务.后者 ...

  7. 【机器学习与R语言】10- 关联规则

    目录 1.理解关联规则 1)基本认识 2)Apriori算法 2.关联规则应用示例 1)收集数据 2)探索和准备数据 3)训练模型 4)评估性能 5)提高模型性能 1.理解关联规则 1)基本认识 购物 ...

  8. 【机器学习与R语言】9- 支持向量机

    目录 1.理解支持向量机(SVM) 1)SVM特点 2)用超平面分类 3)对非线性空间使用核函数 2. 支持向量机应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高性能 ...

  9. 【机器学习与R语言】8- 神经网络

    目录 1.理解神经网络 1)基本概念 2)激活函数 3)网络拓扑 4)训练算法 2.神经网络应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高性能 1.理解神经网络 1) ...

随机推荐

  1. .net 5.0 ref文件夹的作用

    ref目录里的dll是一个名为参考组件的东西,微软MSDN给的解释是 参考组件是一种特殊类型的程序集,仅包含表示库的公共API面所需的最小元数据数量.它们包括用于在构建工具中引用程序集时重要的所有成员 ...

  2. JDK里常见容器总结

    自己总结.   扩容 线程安全   是否支持null 的key 说明 hashmap 2*length 否   是 1.8以后增加红黑树.提高检索效率 hashtable   是   否 官方不建议使 ...

  3. objdump--反汇编查看

    转载:objdump命令_Linux objdump 命令用法详解:显示二进制文件信息 (linuxde.net) objdump命令 编程开发 objdump命令是用查看目标文件或者可执行的目标文件 ...

  4. 基于live555开发嵌入式linux系统的rtsp直播服务

    最近要搞一个直播服务,车机本身是个前后双路的Dvr,前路1080P 25fps,后路720P 50fps,现在要连接手机app预览实时画面,且支持前后摄像头画面切换. 如果要做直播,这个分辨率和帧率是 ...

  5. DP秒思维

    DP算法对于大部分题有着良好的能力,但有些题目我们要转换思维,不能直接的设具体的转态.... 最近做了两道秒题,在这里分享一下: https://ac.nowcoder.com/acm/contest ...

  6. (三)FastDFS 高可用集群架构学习---Client 接口开发

    一.Python3 与 FastDFS 交互 1.安装 py3fdfs模块 # pip3 install py3Fdfs 2.测试使用 py3Fdfs 与 Fastdfs 集群交互(上传文件) fro ...

  7. 痞子衡嵌入式:聊聊i.MXRT1xxx上的普通GPIO与高速GPIO差异及其用法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT上的普通GPIO与高速GPIO差异. GPIO 可以说是 MCU 上最简单最常用的外设模块了,当一些原生功能外设接口模块不能 ...

  8. 『动善时』JMeter基础 — 57、Linux系统中运行JMeter脚本

    目录 1.Linux系统中安装Java环境 (1)解压Java安装包 (2)配置Java环境变量 (3)验证Java环境是否配置成功 2.Linux系统中安装JMeter (1)下载JMeter (2 ...

  9. jenkins 安装与使用

    1.jenkins下载:https://jenkins.io/zh/download/ 2.将下载好的war包放到tomcat容器下的D:\apache-tomcat-9.0.10\webapps下( ...

  10. mysql根据条件决定是否插入数据

    这个问题其实分两个方面: 1.根据表的主键决定数据是否插入. 2.根据表的非主键决定是否插入. 假设有表DOC_INFO(医生表),联合主键HOS_ID(医院代码),DEPT_CODE(科室代码),D ...