旋转随机森林算法

  当输入数据中存在非线性关系的时候,基于线性回归的模型就会失效,而基于树的算法则不受数据中非线性关系的影响,基于树的方法最大的一个困扰时为了避免过拟合而对树进行剪枝的难度,对于潜在数据中的噪声,大型的树倾向于受影响,导致低偏差(过度拟合)或高方差(极度不拟合)。不过如果我们生成大量的树,最终的预测值采用集成所有树产生的输出的平均值,就可以避免方差的问题。

1. 随机森林:集成技术,采用大量的树来建模,但这里我们要保证树之间没有相互关联,不能选择所有属性,而是随机选择一个属性的子集给某个树。虽然我们再随机森林中构建最大深度的树,这样它们可以很好适应自举的样本,得到的偏差较低,后果是引入了高方差,但通过构建大量树,使用平均法则作为最后的预测值,可以解决方差问题。

2. 超随机树:比随机森林引入更多随机化,可以更高效地解决方差问题,它的运算复杂度也略有降低。随机森林是自举部分实例来给每棵树,但超随机树是使用完整的训练集数据,另外关于给定K作为给定节点随机选择的属性数量,它随机选择割点,不考虑目标变量,不像随机森林那样基于基尼不纯度或熵标准。这种更多随机化带来的架构可以更好的降低方差。而且由于划分节点不需要相关标准,因此不需要花费时间来鉴定最适合用来划分数据集的属性。

3. 旋转森林:前两种需要集成大量的树才能获得好效果,而旋转森林可以用较小的树来获取相同甚至更好的效果。算法场景是投票场景,属性被划分为大小相等的K个不重叠的子集,然后结合PCA、旋转矩阵来完成模型的构建。

下面是代码:

  1 # -*- coding: utf-8 -*-
  2 """
  3 Created on Wed Apr 11 17:01:22 2018
  4 @author: Alvin AI
  5 """
  6
  7 from sklearn.datasets import make_classification
  8 from sklearn.metrics import classification_report
  9 from sklearn.cross_validation import train_test_split
 10 from sklearn.decomposition import PCA
 11 from sklearn.tree import DecisionTreeClassifier
 12 import numpy as np
 13
 14
 15 # 加载数据
 16 def get_data():
 17     no_features = 50
 18     redundant_features = int(0.1 * no_features)
 19     informative_features = int(0.6 * no_features)
 20     repeated_features = int(0.1 * no_features)
 21     x, y = make_classification(n_samples=500, n_features=no_features,  22                                flip_y=0.03, n_informative=informative_features,  23                                n_redundant=redundant_features,  24                                n_repeated=repeated_features, random_state=7)
 25     return x, y
 26
 27
 28 # 得到随机子集
 29 def get_random_subset(iterable, k):
 30     subsets = []
 31     iteration = 0
 32     np.random.shuffle(iterable)  # 打乱特征索引
 33     subset = 0
 34     limit = len(iterable) / k
 35     while iteration < limit:
 36         if k <= len(iterable):
 37             subset = k
 38         else:
 39             subset = len(iterable)
 40         subsets.append(iterable[-subset:])
 41         del iterable[-subset:]
 42         iteration += 1
 43     return subsets
 44
 45
 46 # 建立旋转森林模型
 47 def build_rotationtree_model(x_train, y_train, d, k):
 48     models = []  # 决策树
 49     r_matrices = []  # 与树相关的旋转矩阵
 50     feature_subsets = []  # 迭代中用到的特征子集
 51     for i in range(d):
 52         x, _, _, _ = train_test_split(x_train, y_train, test_size=0.3, random_state=7)
 53         # 特征的索引
 54         feature_index = range(x.shape[1])
 55         # 获取特征的子集
 56         # 10个子集,每个子集包含5个索引
 57         random_k_subset = get_random_subset(feature_index, k)  # 10个子集
 58         feature_subsets.append(random_k_subset)  # 25个树,每个树10个子集
 59         R_matrix = np.zeros((x.shape[1], x.shape[1]), dtype=float)  # 旋转矩阵
 60         for each_subset in random_k_subset:
 61             pca = PCA()
 62             x_subset = x[:, each_subset]  # 提取出子集内索引对应的x值
 63             pca.fit(x_subset)  # 主成分分析
 64             for ii in range(0, len(pca.components_)):
 65                 for jj in range(0, len(pca.components_)):
 66                     R_matrix[each_subset[ii], each_subset[jj]] =  67                         pca.components_[ii, jj]
 68         x_transformed = x_train.dot(R_matrix)
 69
 70         model = DecisionTreeClassifier()
 71         model.fit(x_transformed, y_train)
 72         models.append(model)
 73         r_matrices.append(R_matrix)
 74     return models, r_matrices, feature_subsets
 75
 76
 77 def model_worth(models, r_matrices, x, y):
 78     predicted_ys = []
 79     for i, model in enumerate(models):
 80         x_mod = x.dot(r_matrices[i])
 81         predicted_y = model.predict(x_mod)
 82         predicted_ys.append(predicted_y)
 83
 84         predicted_matrix = np.asmatrix(predicted_ys)  # 转化为矩阵 25*350
 85
 86         final_prediction = []
 87         for i in range(len(y)):
 88             pred_from_all_models = np.ravel(predicted_matrix[:, i])  # 将多维数组降为一维
 89             non_zero_pred = np.nonzero(pred_from_all_models)[0]  # nonzeros(a)返回数组a中值不为零的元素的下标
 90             is_one = len(non_zero_pred) > len(models) / 2  # 如果非0预测大于模型内树的总数的一半则为1
 91             final_prediction.append(is_one)
 92         print classification_report(y, final_prediction)
 93     return predicted_matrix
 94
 95
 96 # 主函数
 97 if __name__ == "__main__":
 98     x, y = get_data()
 99     # 数据集划分
100     x_train, x_test_all, y_train, y_test_all = train_test_split(x, y, 101                                                                 test_size=0.3, random_state=9)
102     x_dev, x_test, y_dev, y_test = train_test_split(x_test_all, y_test_all, 103                                                     test_size=0.3, random_state=9)
104     models, r_matrices, features = build_rotationtree_model(x_train, y_train, 25, 5)  # 输的数量25,要用的特征子集5
105     predicted_matrix1 = model_worth(models, r_matrices, x_train, y_train)
106     predicted_matrix2 = model_worth(models, r_matrices, x_dev, y_dev)

详情参见https://blog.csdn.net/qq_33704653/article/details/80090175

原文地址:https://www.cnblogs.com/babyfei/p/9606582.html

时间: 2024-11-09 22:20:39

旋转随机森林算法的相关文章

Bagging与随机森林算法原理小结

在集成学习原理小结中,我们讲到了集成学习有两个流派,一个是boosting派系,它的特点是各个弱学习器之间有依赖关系.另一种是bagging流派,它的特点是各个弱学习器之间没有依赖关系,可以并行拟合.本文就对集成学习中Bagging与随机森林算法做一个总结. 随机森林是集成学习中可以和梯度提升树GBDT分庭抗礼的算法,尤其是它可以很方便的并行训练,在如今大数据大样本的的时代很有诱惑力. 1.  bagging的原理 在集成学习原理小结中,我们给Bagging画了下面一张原理图. 从上图可以看出,

R语言︱决策树族——随机森林算法

笔者寄语:有一篇<有监督学习选择深度学习还是随机森林或支持向量机?>(作者Bio:SebastianRaschka)中提到,在日常机器学习工作或学习中,当我们遇到有监督学习相关问题时,不妨考虑下先用简单的假设空间(简单模型集合),例如线性模型逻辑回归.若效果不好,也即并没达到你的预期或评判效果基准时,再进行下换其他更复杂模型来实验. ---------------------------------------------- 一.随机森林理论介绍 1.1 优缺点 优点. (1)不必担心过度拟合

spark 随机森林算法案例实战

随机森林算法 由多个决策树构成的森林,算法分类结果由这些决策树投票得到,决策树在生成的过程当中分别在行方向和列方向上添加随机过程,行方向上构建决策树时采用放回抽样(bootstraping)得到训练数据,列方向上采用无放回随机抽样得到特征子集,并据此得到其最优切分点,这便是随机森林算法的基本原理.图 3 给出了随机森林算法分类原理,从图中可以看到,随机森林是一个组合模型,内部仍然是基于决策树,同单一的决策树分类不同的是,随机森林通过多个决策树投票结果进行分类,算法不容易出现过度拟合问题. 图 3

R语言︱机器学习模型评估方案(以随机森林算法为例)

R语言︱机器学习模型评估方案(以随机森林算法为例) 笔者寄语:本文中大多内容来自<数据挖掘之道>,本文为读书笔记.在刚刚接触机器学习的时候,觉得在监督学习之后,做一个混淆矩阵就已经足够,但是完整的机器学习解决方案并不会如此草率.需要完整的评价模型的方式. 常见的应用在监督学习算法中的是计算平均绝对误差(MAE).平均平方差(MSE).标准平均方差(NMSE)和均值等,这些指标计算简单.容易理解:而稍微复杂的情况下,更多地考虑的是一些高大上的指标,信息熵.复杂度和基尼值等等. 本篇可以用于情感挖

随机森林 算法过程及分析

简单来说,随机森林就是Bagging+决策树的组合(此处一般使用CART树).即由很多独立的决策树组成的一个森林,因为每棵树之间相互独立,故而在最终模型组合时,每棵树的权重相等,即通过投票的方式决定最终的分类结果. 随机森林算法主要过程: 1.样本集的选择. 假设原始样本集总共有N个样例,则每轮从原始样本集中通过Bootstraping(有放回抽样)的方式抽取N个样例,得到一个大小为N的训练集.在原始样本集的抽取过程中,可能有被重复抽取的样例,也可能有一次都没有被抽到的样例. 共进行k轮的抽取,

随机森林算法demo python spark

关键参数 最重要的,常常需要调试以提高算法效果的有两个参数:numTrees,maxDepth. numTrees(决策树的个数):增加决策树的个数会降低预测结果的方差,这样在测试时会有更高的accuracy.训练时间大致与numTrees呈线性增长关系. maxDepth:是指森林中每一棵决策树最大可能depth,在决策树中提到了这个参数.更深的一棵树意味模型预测更有力,但同时训练时间更长,也更倾向于过拟合.但是值得注意的是,随机森林算法和单一决策树算法对这个参数的要求是不一样的.随机森林由于

【机器学习基础】随机森林算法

引入 我们回顾一下之前学习的两个算法,Bagging算法中,通过bootstrapping得到不一样的数据,通过这些数据送到一个基本算法之后,得到不同的g,最后对这些g取平均得到G:决策树算法中,通过递归方式建立子树,最终得到一棵完整的树. 这两种算法都有其鲜明的特点,决策树对于不同的数据相对会敏感一些,即其算法的variance很大,而Bagging的特点是通过投票和平均的方式来降低variance的效果.如果将这两种方法结合起来,就是该文要介绍的随机森林,random forest. 1.

机器学习——随机森林算法及原理

1. 随机森林使用背景 1.1 随机森林定义 随机森林是一种比较新的机器学习模型.经典的机器学习模型是神经网络,有半个多世纪的历史了.神经网络预测精确,但是计算量很大.上世纪八十年代Breiman等人发明分类树的算法(Breiman et al. 1984),通过反复二分数据进行分类或回归,计算量大大降低.2001年Breiman把分类树组合成随机森林(Breiman 2001a),即在变量(列)的使用和数据(行)的使用上进行随机化,生成很多分类树,再汇总分类树的结果.随机森林在运算量没有显著提

web安全之机器学习入门——3.2 决策树与随机森林算法

目录 简介 决策树简单用法 决策树检测P0P3爆破 决策树检测FTP爆破 随机森林检测FTP爆破 简介 决策树和随机森林算法是最常见的分类算法: 决策树,判断的逻辑很多时候和人的思维非常接近. 随机森林算法,利用多棵决策树对样本进行训练并预测的一种分类器,并且其输出的类别是由个别决策树输出的类别的众数决定. 决策树简单用法 使用sklearn自带的iris数据集 # -*- coding: utf-8 -*- from sklearn.datasets import load_iris from