精华内容
下载资源
问答
  • 预测蛋白质-蛋白质相互作用位点级联随机森林算法
  • 随机森林

    2019-09-27 01:02:23
    随机森林 随机森林是一种比较新的机器学习模型。 概述 2001年Breiman把分类树组合成随机森林...随机森林对多元公线性不敏感,结果对缺失数据和非平衡的数据比较稳健,可以很好地预测多达几千个解释变量的作用(Bre...

    随机森林

    随机森林是一种比较新的机器学习模型。

    概述

    2001年Breiman把分类树组合成随机森林(Breiman 2001a)。即,在变量(列)的使用和数据(行)的使用上进行随机化,生成很多分类树,再汇总分类树的结果。
    随机森林在运算量没有显著提高的前提下提高了预测精度。
    随机森林对多元公线性不敏感,结果对缺失数据和非平衡的数据比较稳健,可以很好地预测多达几千个解释变量的作用(Breiman 2001b),被誉为当前最好的算法之一(Iverson et al. 2008)。

    随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。
    在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。

    随机森林主要应用于回归和分类

    随机森林基本原理

    1 从原始训练样本集N中有放回地重复随机抽取k个样本生成新的训练样本集合 。

    随机森林的优点

    • 两个随机性的引入,使得随机森林不容易陷入过拟合。
    • 两个随机性的引入,使得随机森林具有很好的抗噪声能力
    • 既能处理离散型数据,也能处理连续型数据,数据集无需规范化。(对数据集的适应能力强)
    • 训练速度快,实现比较简单 、 容易做成并行化方法
    • 在训练过程中,能够检测到feature间的互相影响
    • 在创建随机森林的时候,对generlization error使用的是无偏估计
    • 可生成一个Proximities=(pij)矩阵,用于度量样本之间的相似性: pij=aij/N, aij表示样本i和j出现在随机森林中同一个叶子结点的次数,N随机森林中树的颗数

    转载于:https://www.cnblogs.com/sunny1901/p/11259183.html

    展开全文
  • 随机森林是由许多决策树构成,是一种有监督机器学习方法,可以用于分类和回归,通过合并汇总来自个体决策树结果来进行预测,采用多数选票作为分类结果,采用预测结果平均值作为回归结果。 “森林”概念很好理解...
  • 使用基于药物关联矩阵后处理程序的随机森林进行GPCR-药物相互作用预测
  • 通过支持向量机和样本加权随机森林相结合蛋白质-蛋白质相互作用位点预测
  • 随机森林的简单实现

    千次阅读 2015-11-08 16:51:31
    随机森林(randomforest)是一种利用多个分类树对数据进行判别与分类的方法,它在对数据进行分类的同时,还可以给出各个变量(基因)的重要性评分,评估各个变量在分类中所起的作用随机森林是一个最近比较火的...

    近日听了七月天空周博的课。现在对随机森林进行一下,简单的实现。

    随机森林(randomforest)是一种利用多个分类树对数据进行判别与分类的方法,它在对数据进行分类的同时,还可以给出各个变量(基因)的重要性评分,评估各个变量在分类中所起的作用。

    随机森林是一个最近比较火的算法,它有很多的优点:

    a. 在数据集上表现良好,两个随机性的引入,使得随机森林不容易陷入过拟合

    b. 在当前的很多数据集上,相对其他算法有着很大的优势,两个随机性的引入,使得随机森林具有很好的抗噪声能力

    c. 它能够处理很高维度(feature很多)的数据,并且不用做特征选择,对数据集的适应能力强:既能处理离散型数据,也能处理连续型数据,数据集无需规范化

    d. 可生成一个Proximities=pij)矩阵,用于度量样本之间的相似性: pij=aij/N, aij表示样本ij出现在随机森林中同一个叶子结点的次数,N随机森林中树的颗数

    e. 在创建随机森林的时候,对generlization error使用的是无偏估计

    f. 训练速度快,可以得到变量重要性排序(两种:基于OOB误分率的增加量和基于分裂时的GINI下降量

    g. 在训练过程中,能够检测到feature间的互相影响

    h. 容易做成并行化方法

    i. 实现比较简单


    /*
     * RF.h
     *
     *  Created on: Nov 8, 2015
     *      Author: shenjiyi
     */
    
    #ifndef RF_H_
    #define RF_H_
    
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <cmath>
    #include <map>
    #include <set>
    #include <vector>
    
    using namespace std;
    
    #define MAX_RANDOM 10000
    #define MAXN 10000
    
    struct Data{
    	vector<int> x;
    	int y;
    };
    
    typedef vector<Data> Datas;
    
    struct SubTreeType {
    	double v;
    	Datas right, left;
    };
    
    struct TreeNodeType {
    	double splitValue;
    	double splitFeature;
    	int winClass;
    	Datas samp;
    };
    
    typedef vector<TreeNodeType> Tree;
    
    typedef vector<Tree> Forest;
    
    struct Option {
    	int treeNumber;
    	int bagNumber;
    	int depth;
    	int bestSelect;
    };
    
    class RF {
    private:
    
    	Forest forest;
    
    	double calGini(Datas &data, int &winClass) {
    		map<int, int> mp; mp.clear();
    
    		for (auto d : data) {
    			mp[d.y]++;
    		}
    		double sum = 0;
    		int winNumber = 0;
    		for (auto k : mp) {
    //			cout << k.first << "\t" << k.second << endl;
    			int key = k.first;
    			sum = sum + mp[key] * mp[key] /(data.size() + 0.0)/ (data.size() + 0.0);
    			if (mp[key] > winNumber) {
    				winClass = key;
    				winNumber = mp[key];
    			}
    		}
    		return 1 - sum;
    	}
    
    	double splitGini(Datas &left, Datas &right) {
    		int totalNumber = left.size() + right.size();
    		int idx = -1;
    		double sum = (left.size() + 0.0 / totalNumber) * calGini(left, idx)
    		+ (right.size() + 0.0 / totalNumber) * calGini(right, idx);
    		return sum;
    	}
    
    	double randomf(double a,double b){
    		return (rand()%(int)((b-a)*MAX_RANDOM))
    			/(double)MAX_RANDOM+a;
    	}
    
    	double randomi(double a, double b) {
    		return floor(randomf(a, b));
    	}
    
    	double randoms() {
    		return (rand()%(int)(MAX_RANDOM))
    			/(double)MAX_RANDOM;
    	}
    
    	void randomSplit(Datas &data, int feature, SubTreeType& subTree) {
    		int a = randomi(0, data.size());
    		int b = randomi(0, data.size());
    		while (a == b) {b = randomi(0, data.size());}
    		double s = randoms();
    		double splitValue = s * data[a].x[feature]
    			+ (1 - s) * data[b].x[feature];
    //		cout << "a = "<<a<<" b = "<<b <<" s= " << s << " splitvalue= " << splitValue << endl;
    		subTree.v = splitValue;
    		for (int i = 0; i < data.size(); ++i) {
    			if (data[i].x[feature] > splitValue) {
    				subTree.right.push_back(data[i]);
    			} else {
    				subTree.left.push_back(data[i]);
    			}
    		}
    	}
    
    	void createSingleTree(Datas &data, int depth, int bestSelect, Tree& singleTree) {
    
    		int featureNumber = data[0].x.size();
    		int allNumber = pow(2, depth + 1) - 1;
    		int nodeNumber = pow(2, depth) - 1;
    		singleTree.clear();
    		for (int i = 0; i < allNumber; ++i) {
    			TreeNodeType tmp;
    			singleTree.push_back(tmp);
    			singleTree[i].splitValue = -1;
    			singleTree[i].winClass = -1;
    			singleTree[i].splitFeature = -1;
    			singleTree[i].samp.clear();
    		}
    
    		for (int i = 0; i < data.size(); ++i) {
    			singleTree[0].samp.push_back(data[i]);
    		}
    
    		for (int i = 0; i < nodeNumber; i++) {
    			Datas &samples = singleTree[i].samp;
    			if (samples.size() == 0 || samples.size() == 1) {
    				continue;
    			}
    
    			int feature = randomi(0, featureNumber);
    			int idx;
    
    			double bestGini = calGini(samples, idx);
    
    //			cout << "bestSelect" << bestSelect << "bestGini " << bestGini << endl;
    			SubTreeType *bestTree = NULL;
    			SubTreeType subTree;
    			for (int j = 0; j < bestSelect && bestGini > 0; ++j) {
    				subTree.left.clear(); subTree.right.clear();
    				subTree.v = -1;
    				randomSplit(samples, feature, subTree);
    				double newGini = splitGini(subTree.left, subTree.right);
    				if (newGini < bestGini) {
    					bestGini = newGini;
    					bestTree = &subTree;
    				}
    			}
    
    
    			if (bestTree != NULL) {
    				singleTree[i].splitValue = bestTree->v;
    				singleTree[i].splitFeature = feature;
    				singleTree[i * 2 + 1].samp = move(bestTree->left);
    				singleTree[i * 2 + 2].samp = move(bestTree->right);
    			}
    		}
    
    //		cout << "sss" << endl;
    		for (int i = 0; i < allNumber; ++i) {
    			if (singleTree[i].splitValue == -1 && singleTree[i].samp.size() > 0) {
    				int idx = -1;
    				calGini(singleTree[i].samp, idx);
    				singleTree[i].winClass = idx;
    			}
    		}
    	}
    
    	Datas bagging(Datas &data, int bagNumber) {
    		Datas bag; bag.clear();
    		for (int i = 0; i < bagNumber; ++i) {
    			int n = randomi(0, data.size());
    			bag.push_back(data[n]);
    		}
    		return bag;
    	}
    
    	void createForest(Datas &data, Option option) {
    		int treeNumber = option.treeNumber;
    		int bagNumber = option.bagNumber;
    		int depth = option.depth;
    		int bestSelect = option.bestSelect;
    
    		forest.clear();
    		Tree tmp;
    		for (int i = 0; i < treeNumber; ++i) {
    			Datas subData = bagging(data, bagNumber);
    			createSingleTree(subData, depth, bestSelect, tmp);
    			forest.push_back(tmp);
    		}
    	}
    
    	int predWithTree(Tree &tree, vector<int> &x) {
    	//	cout <<"tree size " << tree.size() << endl;
    		for (int i = 0;;) {
    			if (i >= tree.size()) {
    				return -1;
    			}
    			if (tree[i].winClass != -1) {
    			//	cout << "tree winclass " << tree[i].winClass << endl;
    				return tree[i].winClass;
    			}
    			if (x[tree[i].splitFeature] < tree[i].splitValue) {
    				i = 2 * i + 1;
    			} else {
    				i = 2 * i + 2;
    			}
    		}
    		return -1;
    	}
    public:
    
    //Gini
    	RF() {
    		forest.clear();
    	}
    	int predWithForest(vector<int> x, int &prob) {
    		map<int, int> mp; mp.clear();
    
    		for (int i = 0; i < forest.size(); ++i) {
    			int pred = predWithTree(forest[i], x);
    			if (pred != -1) {
    				mp[pred]++;
    			}
    		}
    		int winClass = -1, winNumber = -1;
    		for (auto v : mp) {
    			cout << "first " << v.first << " second " << v.second << endl;
    			if (v.second > winNumber) {
    				winClass = v.first;
    				winNumber = v.second;
    				prob = winNumber;
    			}
    		}
    		return winClass;
    	}
    
    	void print() {
    		cout << "forest size " << forest.size() << endl;
    
    		for (auto ts : forest) {
    
    			for (auto t : ts) {
    				cout << "[";
    				cout << "(" << t.splitFeature << "," << t.splitValue << "," << t.winClass << ")" << "|";
    				for (auto tt:t.samp) {
    					cout << tt.x[0] <<"," <<tt.y <<" ";
    				}
    				cout << "]";
    			}
    			cout << endl;
    		}
    	}
    
    	void Training(Datas &data, int treeNumber, int bagNumber, int depth, int bestSelect) {
    		Option option;
    		option.treeNumber = treeNumber;
    		option.bagNumber = 	bagNumber;
    		option.depth = depth;
    		option.bestSelect = bestSelect;
    
    		createForest(data, option);
    	}
    };
    
    
    #endif /* RF_H_ */
    


    展开全文
  • 随机森林的优缺点

    千次阅读 2017-08-14 21:24:39
    随机森林是建立在决策树基础上,决策树在分类时是选择所有变量,而随机森林则是产生很多决策树,然后每根决策树选择不同变量,进行分析,最后选取决策树中众数,作为最终结果 优点:不会产生过拟合...

    随机森林是建立在决策树的基础上,决策树在分类时是选择所有变量,而随机森林则是产生很多决策树,然后每根决策树选择不同的变量,进行分析,最后选取决策树中的众数,作为最终结果



    优点:不会产生过拟合现象

    可以作用在高维数据中

    能够展现出那些变量重要

    具有很好的抗干扰能力

    可以并行处理



    缺点:可能有很多相似的决策树,掩盖了真实的结果

    对小数据或者底维数据可能不能产生最好的分类

    执行数据虽然比bossting等快,单比单只决策树慢多了

    ····

    展开全文
  • 随机森林 RF

    2018-08-23 20:34:50
    Bagging与随机森林有什么区别呢? Bagging 随机有放回抽样。 RF在以决策树为基学习器构建Bagging集成基础上,进一步在决策树训练过程中引入随机属性选择。 传统决策树在选择划分属性时是在当前结点属性...

    bagging的代价是不用单棵决策树来做预测,具体哪个变量起到重要作用变得未知,所以bagging改进了预测准确率但损失了解释性。

    Bagging与随机森林有什么区别呢?
    Bagging 随机有放回抽样。
    RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入随机属性选择。

    传统决策树在选择划分属性时是在当前结点的属性集合中选择一个最优属性;而在RF中,基决策树的每个结点,先从该结点的属性集合(假定有d个属性)中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。这里的参数k控制了随机性的引入程度。

    https://blog.csdn.net/u012151283/article/details/78104678
    http://www.cnblogs.com/maybe2030/p/4585705.html

    展开全文
  • 对大量分类树的汇总提高了模型的预测精度 是取代神经网络等传统机器学习方法的新的模型 随机森林的运 算速度很快 在处理大数据时表现优异 随机森林不需要顾虑一般回归分析面临的多元共线性的问题 不用做变 量选择 ...
  • 为了研究该问题有效性,采用了降维技术,例如PCA,其次是随机森林分类器,而另一种是深度卷积神经网络。 为解决这个问题而创建相对较大数据集证明了所提出模型。 每个12-15岁47名儿童纵向面部图像总数...
  • sklearn-随机森林

    2021-01-04 22:05:26
    基本上所有的机器学习领域都可以看到集成学习的身影,在现实中集成学习也有相当大的作用,它可以用来做市场营销模拟的建模,统计客户来源,保留和流失,也可用来预测疾病的风险和病患者的易感性。在现在的各种算法...
  • 机器学习-随机森林

    千次阅读 2016-08-10 21:56:09
    OpenCV包含随机森林(random forest)类,随机森林可以通过收集很多树的子节点对各个类别的投票,然后选择获得最多投票的类别作为...如果所有的树都很相似,随机森林就没有很大的作用。为了克服这点,随机森林通过在树
  • 分类算法之决策树、随机森林分类算法之决策树特征选择信息度量和作用信息增益信息增益计算sklearn.tree.DecisionTreeClassifiermethod决策树本地保存决策树优缺点分析集成方法(分类)之随机森林学习算法...
  • 基于随机森林的植物环状RNA识别软件 摘要 环状RNA是一种新型的闭合RNA。越来越多的环状RNA在植物中被发现,研究表明环状RNA具有很重要的调控作用。 因此,从RNA序列中识别环状RNA非常重要。但是传统的环状RNA识别...
  • 使用随机森林算法,并依照其对特征评价准则,来计算肌电信号126个初始特征在不同情感模式分类中贡献度。依照每个特征重要程度,优先组合贡献度大特征并将其用于情感分类。实验数据验证了该方法有效性...
  • Task1 随机森林

    2019-08-07 18:10:26
    随机森林算法梳理 集成学习概念 集成学习(ensemble learning)是时下非常流行机器学习算法,它本身不是一个单独机器学习算法,而是通过在数据上构建多个模型,集成所有模型建模结果。基本上所有机器...
  • 为了准确评价高校毕业生质量, 本文基于某高校计算机类毕业生历史数据, 采用一种改进的随机森林算法构建人才培养质量评价模型. 在训练分类器之前, 利用RF Ranking方法来度量特征重要性并选取75%特征进行降维...
  • 提出一种优化的随机森林模型,该模型在进行Bootstrap抽样前,引入Poisson过程并将其与深度信息相融合组建一个滤过网对原始训练数据集进行过滤,将一部分对后续分类起到非积极作用的特征样本点滤除,使训练数据集得到...
  • 集成学习思想: 集成学习主要的作用是为了解决单个模型在运行时固有的缺陷,从而将多个单个模型组合到一起,取长补短,共同发挥功效。简单的理解人多力量大。随机森林就是这个思想下的产物。这里借用另一个博主的...
  • 1. 什么是随机森林? 定义:随机森林是指利用多棵决策树对样本数据进行训练、分类并预测的一种方法,它在对数据进行分类的同时,还可以给出各个变量(基因)的重要性评分,评估各个变量...3. 随机森林的构建 首...
  • 将基因相互作用信息整合到加权随机生存森林方法中,以进行准确生存预测和生存生物标志物发现
  • 数据科学是当今世纪最现代技术之一。 机器学习系统最敏感和最有价值输入是数据数量和准确性。... 本文实现并研究了应用于零售数据集两种算法(ARIMA和随机森林性能。 根据观察结果讨论结果。
  • 自动分析财务数据是投资... 在这项研究中,随机森林(RF)用于调查公司财务绩效和财务比率与Google指数之间关系。 从RF模型结果可以看出,除了股指和营业利润率外,Google趋势在决定公司利润方面也起着重要作用
  • 使用随机森林算法实现鸢尾花案例

    千次阅读 2019-07-28 16:13:30
    """ 随机森林算法实现对iris数据集的分类 随机森林主要应用于回归和分类两种...随机森林的构建:首先利用bootstrap方法有放回地从原始训练集中随机抽取n个样本,并构建n个决策树; 然后假设在训练样本数据中有m个特...
  • 随机森林原理-R语言简单实例

    万次阅读 2017-04-07 19:34:37
    随机森林是由多个回归树组合而成模型,广泛用于分类研究,随机森林回归能够有效分析非线性、具有共线性和交互作用的数据,效果要优于多元线性回归,并且不需要预先给定模型形式假定,回归效果比回归树更好。...
  • 在各位算法竞赛中,随机森林,梯度提升树(GBDT),Xgboost等继承算法身影也随处可见 集成算法会考虑多个评估其建模结果,汇总之后得导一个综合结果,以此来获取比单个模型更好回归或分类表现 多个模型集成模型...
  • 一、概述 1、 集成算法 集成学习(ensemble learning)是时下非常流行机器学习...在现在各种算法竞赛中,随机森林,梯度提升树(GBDT),Xgboost等集成 算法身影也随处可见,可见其效果之好,应用之广。 集成算
  • 关于随机森林实现注意事项:我们尝试在python中实现我们自己randomforests类。 目前,它不起作用,必须进行调试。 而是使用scikit-learnrandomforest分类器类使用RF_builtin.py进行分类。 和以前一样,编辑...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 193
精华内容 77
关键字:

随机森林的作用