决策树
首先区分树模型和线性模型的区别:
线性模型:
- 对所有特征给予权重相加得到一个新的值
(例:逻辑回归通过大于某一概率阈值的划分为一类,小于某一概率阈值的为另一类) - 逻辑回归只能找到线性的分割
(输入特征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()
输出:
结论:
其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个特征(自变量)
- 从M个数据中有放回地随机选择M个数据出来。这M个数据很可能是有重复的。这M个数据将作为每一个弱分类器(也就是CART决策树)的叶节点构成
- 在N个特征中随机取n个特征。我们要求n << N,一般我们取n=N−−√n = \sqrt Nn= N
- M*n组成了我们一个CART决策树的数据集,即我们使用重新抽取出来的M个样本以及n个特征来建立一个CART决策树
- 重复进行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))
输出:
**详解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:混淆矩阵:评估随机森林模型优劣的指标(这个说起来较麻烦,可以先百度下,后续如果个人有写文章会附在这里)
importance()函数用来提取randomForest拟合出来的模型里面的importance值,此处我们为了显示–MeanDecreaseGini
详见:https://www.jianshu.com/p/c4bcb2505360
从上面显示的随机森林,我们可以得出结论:
- 鞋码(当然这个也可以不算…)和成绩是决定如果某人是母语者或不是母语的重要因素。(MeanDecreaseGini: gini指数表示节点的纯度,gini指数越大纯度越低。所以gini值平均降低量–MeanDecreaseGini表示:所有树的变量分割节点平均减小的不纯度。)
- 此外,该模型只有1%的误差(class.error),这意味着我们可以预测精度为99%。