前情回顾

  1. 决策树
  2. CART树的实现
  3. 集成模式

结论速递

本次学习了两种并行集成的树模型,随机森林和孤立森林,并进行了相应的代码实践。其中对孤立森林的学习比较简略,有待后续补充。

这里写自定义目录标题

    • 前情回顾
    • 结论速递
  • 1 随机森林
    • 1.1 原理
    • 1.2 代码实现
  • 2 孤立森林
    • 2.1 原理
    • 2.2 代码实现
  • 3 思考题
  • 参考阅读

1 随机森林

1.1 原理

随机森林用的是bagging算法,基学习器常采用CART树。

处理回归问题时,输出值为各学习器的均值;处理分类问题时,则可以用投票法,或者是sklearn中的概率聚合策略。

随机森林中的随机主要来自三个方面:

  1. bootstrap抽样导致训练集随机
  2. 为每个节点随机选取特征子集进行不纯度计算
  3. 使用随机分割点选取时产生的随机性

特征重要性是通过所有树的重要性得分做简单平均来实现的。

经过抽样,对每个基学习器,总有 1 − e − 1 1-e^{-1} 1e1的数据集没有参与训练,我们把这一部分数据称为out-of-bag样本,简称oob样本。此时,对每一个基学习器训练完毕后,我们都对oob样本进行预测,每个样本对应的oob_prediction_值为所有没有采样到该样本进行训练的基学习器预测结果均值,这一部分的逻辑参见此处的源码实现。在得到所有样本的oob_prediction_后,对于回归问题,使用r2_score来计算对应的oob_score_,而对于分类问题,直接使用accuracy_score来计算oob_score_

【思考题】r2_score和均方误差的区别是什么?它具有什么优势?
r2_score即决定系数,反映因变量的全部变异能通过回归系数被自变量解释的比例。
R 2 = 1 − S S E S S T R^2 = 1 - \frac {SSE}{SST} R2=1SSTSSE

R 2 = 1 − ∑ i = 1 n ( y i − y ^ i ) 2 ∑ i = 1 n ( y i − y 2 ) 2 R^2 = 1 - \frac {\sum_{i=1}^{n} (y_i - \hat y_i)^2}{\sum_{i=1}^{n} (y_i - y^2)^2} R2=1i=1n(yiy2)2i=1n(yiy^i)2
进一步化简
R 2 = 1 − R M S E V a r R^2 = 1 - \frac {RMSE}{Var} R2=1VarRMSE
分子就变成了常用的评价指标均方误差MSE,分母就变成了方差。可以通俗地理解为使用均值作为误差基准,看预测误差是否大于或者小于均值基准误差。
R2_score = 1,样本中预测值和真实值完全相等,没有任何误差,表示回归分析中自变量对因变量的解释越好。
R2_score = 0。此时分子等于分母,样本的每项预测值都等于均值。
R2_score不是r的平方,也可能为负数(分子>分母),模型等于盲猜,还不如直接计算目标变量的平均值。

下面的方法很好地描述了样本隐式特征的表示方法。

最后,我们来介绍一种Totally Random Trees Embedding方法,它能够基于每个样本在各个决策树上的叶节点位置,得到一种基于森林的样本特征嵌入。具体地说,假设现在有4棵树且每棵树有4个叶子节点,我们依次对它们进行从0至15的编号,记样本i在4棵树叶子节点的位置编号为[0,7,8,14],样本j的编号为[1,7,9,13],此时这两个样本的嵌入向量即为[1,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0]和[0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0]。假设样本k对应的编号为[0,6,8,14],那么其对应嵌入向量的距离应当和样本i较近,而离样本j较远,即两个样本在不同树上分配到相同的叶子结点次数越多,则越接近。因此,这个方法巧妙地利用树结构获得了样本的隐式特征。

【思考题】假设使用闵氏距离来度量两个嵌入向量之间的距离,此时对叶子节点的编号顺序会对距离的度量结果有影响吗?
(闵可夫斯基距离是一组距离的定义,包括曼哈顿距离,欧氏距离和切比雪夫距离)对叶结点的编号顺序对距离的度量结果没有影响,因为特征嵌入后,向量的各位置顺序在距离计算中是无关的。

1.2 代码实现

from sklearn.tree import DecisionTreeClassifier
import numpy as np
from sklearn.utils import resampleclass RandomForest():def __init__(self,tree_count = 10):self.tree_count = tree_countself.sample_rate = 0.8def fit(self,x,y):self._bagging(x,y)def predict(self,x):return self._vote(x)def _bagging(self,x,y):clfLis = []for i in range(self.tree_count):clf = DecisionTreeClassifier()#connect = np.concatenate((x, y), axis=1)bootstrapX,bootstrapy = resample(x,y,n_sample = int(self.sample_rate*len(y)))clf.fit(bootstrapX,bootstrapy)clfLis.append(clf)self.treeList = clfLisdef _vote(self,x):y_predict = np.zeros(x.shape[0],len(self.treeLis))for i in range(len(self.treeLis)):clf = self.treeLis[i]y_predict[:,i] = clf.predict(x)y = np.array([np.argmax(np.bincount(y_predict[i,:])) for i in range(x.shape[0])])return y

2 孤立森林

2.1 原理

孤立森林也是一种使用树来进行集成的算法,其功能是用于连续特征数据的异常检测。孤立森林的基本思想是:多次随机选取特征和对应的分割点以分开空间中样本点,那么异常点很容易在较早的几次分割中就已经与其他样本隔开,正常点由于较为紧密故需要更多的分割次数才能将其分开。

下图中体现了两个特征下的4次分割过程,可见右上角的异常点已经被单独隔离开。

规定树的生长停止当且仅当树的高度(路径的最大值)达到了给定的限定高度,或者叶子结点样本数仅为1,或者叶子节点样本数的所有特征值完全一致(即空间中的点重合,无法分离)。

给定的限定高度为 log ⁡ n \log n logn

则训练伪代码如下


在预测阶段,还需要计算样本在每棵树上被分配到叶子的路径。

2.2 代码实现

(待补)

from pyod.utils.data import generate_data
import matplotlib.pyplot as plt
import numpy as npclass Node:def __init__(self, depth):self.depth = depthself.left = Noneself.right = Noneself.feature = Noneself.pivot = Noneclass Tree:def __init__(self, max_height):self.root = Node(0)self.max_height = max_heightself.c = Nonedef _build(self, node, X,):if X.shape[0] == 1:returnif node.depth+1 > self.max_height:node.depth += self._c(X.shape[0])returnnode.feature = np.random.randint(X.shape[1])pivot_min = X[:, node.feature].min()pivot_max = X[:, node.feature].max()node.pivot = np.random.uniform(pivot_min, pivot_max)node.left, node.right = Node(node.depth+1), Node(node.depth+1)self._build(node.left, X[X[:, node.feature]<node.pivot])self._build(node.right, X[X[:, node.feature]>=node.pivot])def build(self, X):self.c = self._c(X.shape[0])self._build(self.root, X)def _c(self, n):if n == 1:return 0else:return 2 * ((np.log(n-1) + 0.5772) - (n-1)/n)def _get_h_score(self, node, x):if node.left is None and node.right is None:return node.depthif x[node.feature] < node.pivot:return self._get_h_score(node.left, x)else:return self._get_h_score(node.right, x)def get_h_score(self, x):return self._get_h_score(self.root, x)class IsolationForest:def __init__(self, n_estimators=100, max_samples=256):self.n_estimator = n_estimatorsself.max_samples = max_samplesself.trees = []def fit(self, X):for tree_id in range(self.n_estimator):random_X = X[np.random.randint(0, X.shape[0], self.max_samples)]tree = Tree(np.log(random_X.shape[0]))tree.build(X)self.trees.append(tree)def predict(self, X):result = []for x in X:h = 0for tree in self.trees:h += tree.get_h_score(x) / tree.cscore = np.power(2, - h/len(self.trees))result.append(score)return np.array(result)

3 思考题

  1. 什么是随机森林的oob得分?
    oob就是out of bag,因为随机森林的基学习器是随机采样的,所以最后会有一定数量的样本没有被采集到,oob得分就是学习器对这部分样本的预测效果得分。
  2. 随机森林是如何集成多个决策树模型的?
    处理回归问题时,集成输出值为各学习器的均值;处理分类问题时,则可以用投票法,或者是sklearn中的概率聚合策略。
  3. 请叙述孤立森林的算法原理和流程。
    大致可以分为两个阶段,第一个阶段需要训练出t颗孤立树,组成孤立森林。随后将每个样本点带入森林中的每棵孤立树,计算平均高度,之后再计算每个样本点的异常值分数。

参考阅读

  1. 深度研究:回归模型评价指标R2_score

datawhale 10月学习——树模型与集成学习:两种并行集成的树模型相关推荐

  1. 【树模型与集成学习】(task4)两种并行集成的树模型

    学习总结 (1)随机森林中的随机主要来自三个方面: 其一为bootstrap抽样导致的训练集随机性, 其二为每个节点随机选取特征子集进行不纯度计算的随机性, 其三为当使用随机分割点选取时产生的随机性( ...

  2. python多分类混淆矩阵代码_深度学习自学记录(3)——两种多分类混淆矩阵的Python实现(含代码)...

    深度学习自学记录(3)--两种多分类混淆矩阵的Python实现(含代码),矩阵,样本,模型,类别,真实 深度学习自学记录(3)--两种多分类混淆矩阵的Python实现(含代码) 深度学习自学记录(3) ...

  3. gensim中动态主题模型(DTM)两种实现方法(二)

    第一部分内容请点此阅读:gensim中动态主题模型(DTM)两种实现方法(一) 目录 (二)gensim.models.wrappers.dtmmodel.DtmModel包 1.如何使用呢? 2.c ...

  4. ML:基于葡萄牙银行机构营销活动数据集(年龄/职业等)利用Pipeline框架(两种类型特征并行处理)+多种模型预测(分层抽样+调参交叉验证评估+网格/随机搜索+推理)客户是否购买该银行的产品二分类案

    ML之pipeline:基于葡萄牙银行机构营销活动数据集(年龄/职业/婚姻/违约等)利用Pipeline框架(两种类型特征并行处理)+多种模型预测(分层抽样+调参交叉验证评估+网格搜索/随机搜索+模型 ...

  5. ML之RF:基于葡萄牙银行机构营销活动数据集(年龄/职业/婚姻/违约等)利用Pipeline框架(两种类型特征并行处理)+RF模型预测(调参+交叉验证评估+模型推理)客户是否购买该银行的产品二分类案例

    ML之RF:基于葡萄牙银行机构营销活动数据集(年龄/职业/婚姻/违约等)利用Pipeline框架(两种类型特征并行处理)+RF模型预测(调参+交叉验证评估+模型推理)客户是否购买该银行的产品二分类案例 ...

  6. Java学习笔记:创建线程的两种方法

    Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程

  7. 数据集成的两种架构:ELT和ETL

    数据集成的两种架构:ELT和ETL 集成是数据工程师要做的工作之一.一般来说,数据工程师的工作包括了数据的ETL和数据挖掘算法的实现.算法实现 可以理解,就是通过数据挖掘算法,从数据仓库中找到&quo ...

  8. gensim中动态主题模型(DTM)两种实现方法(一)

    目录 (一)gensim.models.ldaseqmodel包 1.基本使用方法 2.缩水的地方 (二)gensim.models.wrappers.dtmmodel.DtmModel包 1.没有c ...

  9. 水平集方法引入主动轮廓模型算法中的两种方法

    水平集方法引入主动轮廓模型算法中的两种方法 1.传统的基于主动轮廓模型和水平集理论的方法 2.变分水平集方法 在讲解水平集理论在主动轮廓模型中的应用前,我们先用流程图说明一下常见的处理主动轮廓模型的流 ...

最新文章

  1. PowerDesigner 常用设置
  2. 网络安全导论课程-windows开启远程
  3. C# switch嵌套语法
  4. RaspberryPI 3 系统安装及常见问题
  5. 精选30张炫酷的动态交互式图表,Pandas一键生成,通俗易懂
  6. 以嵌入式系统设计师考试成绩,开始嵌入式博客之旅
  7. mysql 用户密码md5_使用MD5编码实现数据库用户密码字段的加密
  8. mac使用allure_制作测试报告,allure,生成
  9. 深度学习之神经网络核心原理与算法-caffekeras框架图片分类
  10. HTML URL编码
  11. 一个Java程序员对2011年的回顾
  12. python题库填空_Python题库
  13. Java实现 LeetCode 741 摘樱桃(DFS || 递推 || 传纸条)
  14. 跑步到底伤不伤膝盖?励建安教授给你权威解答
  15. 低代码开发平台是什么?
  16. day3----部署duboo微服务值部署zk和Jenkins(3)
  17. 怎么在线免费压缩图片
  18. c语言程序项目任务教程 杨东芳 答案,c语言项目化教程 c语言程序设计
  19. 使用 kindeditor 编辑器无法上传图片
  20. svn: E155009: Failed to run the WC DB work queue associated with原因分析及解决方案

热门文章

  1. 为DELL品牌的ESXI服务器安装OMSA,实现硬件监控
  2. Django REST Framework——4. 请求与响应
  3. Node.js b站教学视频汇总笔记(完)CommonJS模块规范、 require、npm、Express(中间件)、MongoDB、MySQL
  4. 【北京之旅】--程序员应聘技巧之笔试
  5. zerossl通配符证书申请教程
  6. 计算机的投资:量化投资
  7. 只要10分钟,搭建属于个人的炫酷网站,你还在犹豫什么?
  8. 磁盘分区魔法师Norton PartitionMagic(PQ8.0)使用图解和使用
  9. 毕业设计网站开发学习笔记(一)
  10. bacnet协议--BAC0使用