决策树

首先区分树模型和线性模型的区别:

线性模型:

  • 对所有特征给予权重相加得到一个新的值
    (例:逻辑回归通过大于某一概率阈值的划分为一类,小于某一概率阈值的为另一类)
  • 逻辑回归只能找到线性的分割
    (输入特征x与logit之间是线性的,除非对x进行多维映射)
    树型模型:
  • 决策树对每一个特征做一个划分
  • 决策树可以找到非线性分割
  • 树模型拟合出来的函数是分区间的阶梯函数,可以产生可视化的分类规则

决策树原理:

采用自顶向下的递归的方法,基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子节点处熵值为0(叶节点中的实例都属于一类)

决策树的使用的例子是 :

预测电子邮件是垃圾邮件或非垃圾邮件,预测肿瘤癌变,或者基于这些因素预测贷款的信用风险。

R----决策树应用:

关于R包
“party”包具有用于创建和分析决策树的函数ctree()。

install.packages("party")

ctree()函数:

ctree(formula, data)
  • formula是描述预测变量(自变量x)和响应变量(因变量y)的公式。
  • data是所使用的数据集的名称。

举个栗子:
我们将使用名为readingSkills的R内置数据集来创建决策树。

输入:

# Load the party package. It will automatically load other dependent packages.
library(party)
# Print some records from data set readingSkills.
print(head(readingSkills))

输出:

nativeSpeaker age shoeSize    score
1           yes   5 24.83189 32.29385
2           yes   6 25.95238 36.63105
3            no  11 30.42170 49.60593
4           yes   7 28.66450 40.28456
5           yes  11 31.88207 55.46085
6           yes  10 30.07843 52.83124

它描述了某人的readingSkills的分数,如果我们知道变量“age”,“shoesize”,“score”,以及该人是否为母语者(“nativeSpeaker”)。

我们将使用ctree()函数创建决策树并查看其图形。

输入:

# Load the party package. It will automatically load other dependent packages.
library(party)

# Create the input data frame.
input.dat <- readingSkills[c(1:105),]

# Give the chart file a name.
png(file = "decision_tree.png")

# Create the tree.
  output.tree <- ctree(
  nativeSpeaker ~ age + shoeSize + score, 
  data = input.dat)

# Plot the tree.
plot(output.tree)

# Save the file.
dev.off()

输出:

R语言 决策树分类如何优化 r语言决策树模型_R语言 决策树分类如何优化


结论:

其readingSkills数据集中,节点(Node4、5、6、7中):

亮灰色----母语者(“nativeSpeaker”)为“no”;

深灰色----母语者(“nativeSpeaker”)为“yes”;

分数(socre)低于30.7和年龄(age)超过6的人,母语者(“nativeSpeaker”)判定为“no”,在分数(socre)大于38.3时,母语者(“nativeSpeaker”)判定0.6+的概率为“yes”,剩余概率为“no”。

由上我们就得出了一个简单的决策树模型,可以带入测试集进行预测了

随机森林

一棵树的生成的结果肯定不如多棵树,因此就有了随机森林,解决决策树泛化能力弱的缺点

构造过程:

假设我们的数据是M*N的,即有M个观测、N个特征(自变量)

  1. 从M个数据中有放回地随机选择M个数据出来。这M个数据很可能是有重复的。这M个数据将作为每一个弱分类器(也就是CART决策树)的叶节点构成
  2. 在N个特征中随机取n个特征。我们要求n << N,一般我们取n=N−−√n = \sqrt Nn= N
  3. M*n组成了我们一个CART决策树的数据集,即我们使用重新抽取出来的M个样本以及n个特征来建立一个CART决策树
  4. 重复进行Step 1 ~ Step 3,不断的建立新的决策树,最后形成一个森林

注意事项:

  • 每一个CART树生成时的观测抽取都是随机有放回抽取的
  • 我们不仅仅要对数据观测(行)进行随机抽取,同时在每一个CART树生成过程中,我们还要对特征(列)进行随机抽取,也就是说每一个CART树的生成并不是用所有的特征来分类的,而只选用了一部分。同时,由于我们生成了很多CART树,这样每一个变量都会被照顾到。
  • 这里的CART树是不需要剪枝的,因为我们大概有35%的数据集没有取到,也有很多特征没有取到,所以这里不存在过拟合问题
  • 每棵CART树之间是相互独立的

每一个CART树都会有一个判断结果,假设我们最后生成了K个CART树,也就是说现在有K个结果。在分类问题中,我们使用投票法的方式,即观察一个样本被判断的结果,选择被分得最多的类别,作为最后的类别。即如果有200次被分为+,100次分为-,则最终的结果为+。

R----随机森林应用:

关于R包
包“randomForest”具有函数randomForest(),用于创建和分析随机森林。

install.packages("randomForest)

randomForest()函数

randomForest(formula, data)
  • formula是描述预测变量和响应变量的公式。
  • data是所使用的数据集的名称。

举个栗子:

我们将使用名为readingSkills的R语言内置数据集来创建决策树。 它描述了某人的readingSkills的分数,同上决策树例子中我们知道变量“age”,“shoesize”,“score”,以及该人是否是母语。

我们将使用randomForest()函数来创建决策树并查看它。

输入:

# Load the party package. It will automatically load other required packages.
library(party)
library(randomForest)

# Create the forest.
output.forest <- randomForest(nativeSpeaker ~ age + shoeSize + score, 
           data = readingSkills)

# View the forest results.
print(output.forest) 

# Importance of each predictor.
print(importance(output.forest,type = 2))

输出:

R语言 决策树分类如何优化 r语言决策树模型_r语言_02


**详解print(output.forest): **

  • Type of random forest:随机森林的类型: 分类
  • Number of trees:决策树的数量:500
  • No. of variables tried at each split:每次拆分的变量数:1
  • OOB estimate of error rate: ODB错误率估计:1%(对每次构建决策树时未使用的情况进行错误估计。 这称为OOB(袋外)误差估计,其被提及为百分比)
  • Confusion matrix:混淆矩阵:评估随机森林模型优劣的指标(这个说起来较麻烦,可以先百度下,后续如果个人有写文章会附在这里)

R语言 决策树分类如何优化 r语言决策树模型_R语言 决策树分类如何优化_03


importance()函数用来提取randomForest拟合出来的模型里面的importance值,此处我们为了显示–MeanDecreaseGini

详见:https://www.jianshu.com/p/c4bcb2505360

从上面显示的随机森林,我们可以得出结论:

  • 鞋码(当然这个也可以不算…)和成绩是决定如果某人是母语者或不是母语的重要因素。(MeanDecreaseGini: gini指数表示节点的纯度,gini指数越大纯度越低。所以gini值平均降低量–MeanDecreaseGini表示:所有树的变量分割节点平均减小的不纯度。)
  • 此外,该模型只有1%的误差(class.error),这意味着我们可以预测精度为99%。