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

1.决策树原理

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

    ①选择最佳分割
    确定根据哪个特征来进行分割。
    纯类:一组数据中只包含单一的类。
  • 熵Entropy(S):用来度量纯度,取值0-1。0表示样本完全同质,1表示样本凌乱最大。


    c为类的水平,pi为落入类水平i的特征值比例

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

    任何可能的两个类划分的熵的图形(一个类比例x,另一个1-x):
curve(-x*log2(x)-(1-x)*log2(1-x),
      col='red',xlab = 'x',ylab = 'Entropy',lwd=4)
0.5时最大熵值
  • 信息增益:用熵值计算每一个可能特征的分割引起的同质性(均匀性)变化,即分割前与分割后的数据分区熵值之差。


    image.png

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


    比例wi加权的n个分区

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

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

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

②修剪决策树

  • 修建决策树减少它的大小,避免过拟合。
  • 提前终止法/预剪枝决策树法:决策节点达到一定数量的案例就停止。
  • 后剪枝决策树法(更有效):根据节点处的错误率使用修剪准则将树减少到更合适的大小。
  • 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'))
image.png

错误率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'))
image.png

总的错误率仍为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
image.png

可通过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'))
image.png

虽然总的错误率增加到了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-如何提高模型的性能?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343