转载地址:https://blog.csdn.net/flying_sfeng/article/details/64133822/

在讲随机森林前,我先讲一下什么是集成学习。集成学习通过构建并结合多个分类器来完成学习任务。集成学习通过将多个学习器进行结合,常可获得比单一学习器更好的泛化性能。

考虑一个简单例子:在二分类任务中,假定三个分类器在三个测试样本上的表现如下图,其中√表示分类正确,×表示分类错误,集成学习的结果通过投票法产生,即“少数服从多数”。如下图,在(a)中,每个分类器都只有66.6%的精度,但集成学习却达到了100%;在(b)中,三个分类器没有差别,集成之后性能没有提高;在(c)中,每个分类器的精度都只有33.3%,集成学习的结果变得更糟。这个简单地例子显示出:要获得好的集成,个体学习器应“好而不同”,即个体学习器要有一定的“准确性”,即学习器不能太差,并且要有“多样性”,即学习器间具有差异。

根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类,即个体学习器之间存在强依赖关系,必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系,可同时生成的并行化方法;前者的代表是Boosting,后者的代表是Bagging和“随机森林”(Random Forest)

Bagging与随机森林

要得到泛化性能强的集成,集成中的个体学习器应尽可能相互独立,虽然这在现实任务中很难做到,但我们可以设法使基学习器尽可能具有较大的差异。

在我的实验中,使用“自助采样法”:给定包含m个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过m次随机操作,我们得到含m个样本的采样集,初始训练集中有的样本在采样集里多次出现,有的则从未出现。

按照这种方法,我们可以采样出T个含m个训练样本的采样集,然后基于每个采样集训练处一个基学习器,再将这些基学习器进行结合,这就是Bagging的基本流程。在对预测输出进行结合时,Bagging通常对分类任务使用简单投票法,对回归任务使用简单平均法。

随机森林是Bagging的一个扩展。随机森林在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择(即引入随机特征选择)。传统决策树在选择划分属性时时在当前节点的属性集合(假定有d个属性)中选择一个最优属性;而在随机森林中,对基决策树的每个节点,先从该节点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。这里的参数k控制了随机性的引入程度:若令k=d,则基决策树的构建与传统决策树相同;若令k=1,则是随机选择一个属性进行划分。

在这篇文章中,我们只讲随机森林的分类部分。随机森林用于分类时,即采用n个决策树分类,将分类结果用简单投票法得到最终分类,提高分类准确率。

对于决策树不太了解的童鞋,可以看我的上一篇博客:决策树原理及Python代码实现

简单来说,随机森林就是对决策树的集成,但有两点不同:

(1)采样的差异性:从含m个样本的数据集中有放回的采样,得到含m个样本的采样集,用于训练。这样能保证每个决策树的训练样本不完全一样。

(2)特征选取的差异性:每个决策树的n个分类特征是在所有特征中随机选择的(n是一个需要我们自己调整的参数)

随机森林需要调整的参数有:

(1)    决策树的个数

(2)    特征属性的个数

(3)    递归次数(即决策树的深度)

下面,讲一下如何用代码实现随机森林。

代码实现流程:

(1)    导入文件并将所有特征转换为float形式

(2)    将数据集分成n份,方便交叉验证

(3)    构造数据子集(随机采样),并在指定特征个数(假设m个,手动调参)下选取最优特征

(4)    构造决策树

(5)    创建随机森林(多个决策树的结合)

(6)    输入测试集并进行测试,输出预测结果

(1)    导入文件并将所有特征转换为float形式

[python] view plaincopy
  1. #加载数据
  2. def loadCSV(filename):
  3. dataSet=[]
  4. with open(filename,'r') as file:
  5. csvReader=csv.reader(file)
  6. for line in csvReader:
  7. dataSet.append(line)
  8. return dataSet
  9. #除了判别列,其他列都转换为float类型
  10. def column_to_float(dataSet):
  11. featLen=len(dataSet[0])-1
  12. for data in dataSet:
  13. for column in range(featLen):
  14. data[column]=float(data[column].strip())

(2)    将数据集分成n份,方便交叉验证

[python] view plaincopy
  1. #将数据集分成N块,方便交叉验证
  2. def spiltDataSet(dataSet,n_folds):
  3. fold_size=int(len(dataSet)/n_folds)
  4. dataSet_copy=list(dataSet)
  5. dataSet_spilt=[]
  6. for i in range(n_folds):
  7. fold=[]
  8. while len(fold) < fold_size:   #这里不能用if,if只是在第一次判断时起作用,while执行循环,直到条件不成立
  9. index=randrange(len(dataSet_copy))
  10. fold.append(dataSet_copy.pop(index))  #pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
  11. dataSet_spilt.append(fold)
  12. return dataSet_spilt

(3)    构造数据子集(随机采样),并在指定特征个数(假设m个,手动调参)下选取最优特征

[python] view plaincopy
  1. #构造数据子集
  2. def get_subsample(dataSet,ratio):
  3. subdataSet=[]
  4. lenSubdata=round(len(dataSet)*ratio)
  5. while len(subdataSet) < lenSubdata:
  6. index=randrange(len(dataSet)-1)
  7. subdataSet.append(dataSet[index])
  8. #print len(subdataSet)
  9. return subdataSet
  10. #选取任意的n个特征,在这n个特征中,选取分割时的最优特征
  11. def get_best_spilt(dataSet,n_features):
  12. features=[]
  13. class_values=list(set(row[-1] for row in dataSet))
  14. b_index,b_value,b_loss,b_left,b_right=999,999,999,None,None
  15. while len(features) < n_features:
  16. index=randrange(len(dataSet[0])-1)
  17. if index not in features:
  18. features.append(index)
  19. #print 'features:',features
  20. for index in features:
  21. for row in dataSet:
  22. left,right=data_spilt(dataSet,index,row[index])
  23. loss=spilt_loss(left,right,class_values)
  24. if loss < b_loss:
  25. b_index,b_value,b_loss,b_left,b_right=index,row[index],loss,left,right
  26. #print b_loss
  27. #print type(b_index)
  28. return {'index':b_index,'value':b_value,'left':b_left,'right':b_right}

(4)    构造决策树

[python] view plaincopy
  1. #构造决策树
  2. def build_tree(dataSet,n_features,max_depth,min_size):
  3. root=get_best_spilt(dataSet,n_features)
  4. sub_spilt(root,n_features,max_depth,min_size,1)
  5. return root

(5)    创建随机森林(多个决策树的结合)

[python] view plaincopy
  1. #创建随机森林
  2. def random_forest(train,test,ratio,n_feature,max_depth,min_size,n_trees):
  3. trees=[]
  4. for i in range(n_trees):
  5. subTrain=get_subsample(train,ratio)
  6. tree=build_tree(subTrain,n_features,max_depth,min_size)
  7. #print 'tree %d: '%i,tree
  8. trees.append(tree)
  9. #predict_values = [predict(trees,row) for row in test]
  10. predict_values = [bagging_predict(trees, row) for row in test]
  11. return predict_values

(6)    输入测试集并进行测试,输出预测结果

[python] view plaincopy
  1. #预测测试集结果
  2. def predict(tree,row):
  3. predictions=[]
  4. if row[tree['index']] < tree['value']:
  5. if isinstance(tree['left'],dict):
  6. return predict(tree['left'],row)
  7. else:
  8. return tree['left']
  9. else:
  10. if isinstance(tree['right'],dict):
  11. return predict(tree['right'],row)
  12. else:
  13. return tree['right']
  14. # predictions=set(predictions)

对以上代码的一点总结:

训练部分:假设我们取dataset中的m个feature来构造决策树,首先,我们遍历m个feature中的每一个feature,再遍历每一行,通过spilt_loss函数(计算分割代价)来选取最优的特征及特征值,根据是否大于这个特征值进行分类(分成left,right两类),循环执行上述步骤,直至不可分或者达到递归限值(用来防止过拟合),最后得到一个决策树tree。

测试部分:对测试集的每一行进行判断,决策树tree是一个多层字典,每一层为一个二分类,将每一行按照决策树tree中的分类索引index一步一步向里层探索,直至不出现字典时探索结束,得到的值即为我们的预测值。

附上:随机森林完整代码

编程环境:Python2.7

参考:

《机器学习》作者:周志华

从头开始:用Python实现随机森林算法

随机森林的原理分析及Python代码实现相关推荐

  1. 数学建模_随机森林分类模型详解Python代码

    数学建模_随机森林分类模型详解Python代码 随机森林需要调整的参数有: (1) 决策树的个数 (2) 特征属性的个数 (3) 递归次数(即决策树的深度)''' from numpy import ...

  2. 随机森林分类算法python代码_随机森林的原理及Python代码实现

    原标题:随机森林的原理及Python代码实现 最近在做kaggle的时候,发现随机森林这个算法在分类问题上效果十分的好,大多数情况下效果远要比svm,log回归,knn等算法效果好.因此想琢磨琢磨这个 ...

  3. MATLAB机器学习系列-9:决策树和随机森林的原理及其例子代码实现

    决策树 原理 决策树通过把样本实例从根节点排列到某个叶子节点来对其进 行分类.树上的每个非叶子节点代表对一个属性取值的测试, 其分支就代表测试的每个结果:而树上的每个叶子节点均代表 一个分类的类别,树 ...

  4. Spark 随机森林算法原理、源码分析及案例实战

    图 1. Spark 与其它大数据处理工具的活跃程度比较 回页首 环境要求 操作系统:Linux,本文采用的 Ubuntu 10.04,大家可以根据自己的喜好使用自己擅长的 Linux 发行版 Jav ...

  5. sklearn的系统学习——随机森林分类器与随机森林回归器(含有python完整代码及案例)

    目录 集成算法 sklearn中的随机森林 随机森林分类器 随机性参数 属性 案例代码 随机森林回归器 案例代码 在前面的内容中,已经对决策树解决分类回归问题分别做了阐述,今天走进随机森林的世界. 什 ...

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

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在集成学习原理小结中,我们讲到了集成学习有两个流派,一个是boos ...

  7. Adaboost算法原理分析和实例+代码(简明易懂)

    Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333   ...

  8. 数学建模——层次分析法Python代码

    数学建模--层次分析法Python代码 import numpy as np class AHP: """ 相关信息的传入和准备 """ d ...

  9. 辗转相除法求最大公约数原理分析(附代码实现)

    辗转相除法求最大公约数原理分析(附代码实现) 前言 解释 原理分析 代码 结语 前言 辗转相除法用起来很简单,但是其原理却自己想不明白.于是乎看了几篇有关辗转相除法原理的分析,在这里自己写下自己的理解 ...

  10. BP神经网络原理分析及c++代码实现(下)

    本部分主要是BP神经网络的C++代码部分,在这里简单的介绍下代码的头文件,具体代码的实现以及测试数据,请在csdn资源里下载:http://download.csdn.net/detail/hjkhj ...

最新文章

  1. IT 系统巡检时,需要关注哪些指标?
  2. java面试题大合集(开发者必看二)
  3. 微服务feignclient_微服务-(声明式调用feign)
  4. 74cms 注入exp
  5. 提取多个字段_【博客翻译】建筑物轮廓线提取以及损坏分类
  6. linux---基础01
  7. HTML+CSS+JS实现 ❤️canvas 3D立体图片相册幻灯片❤️
  8. php mysql grant_mysql grant命令详解_MySQL
  9. 001_关于选中的磁盘具有MBR分区表。在 EFI 系统上,Windows 只能安装到 GPT 磁盘。问题解决
  10. Codeforces #499 Div2 E (1010C) Border
  11. 读书日当天冲上销量榜Top1和Top3,来听听携程人写书背后的故事
  12. 错误解决办法:exec /usr/lib/ssh/ssh-askpass : No such file or directory error.
  13. 威信游戏小程序源码-合成大西瓜小游戏(合成版)源码 附带流量主功能
  14. shell执行curl_Linux curl命令详解
  15. openCV学习资料整理
  16. [项目记录]用vue-electron搭建pc网易云音乐程序(2)——搭建基本页面
  17. 百度、华为、京东、B站最新面试题汇集,含泪整理面经
  18. git 提交报错 Incorrect username or password ( access token )
  19. html在线编辑器代码运行,JSRun - 在线JS、HTML编辑器(同时也支持各种后台代码的编辑运行)...
  20. Severance:BoD[官方英文版][资源收集分享]

热门文章

  1. 请求头显示Provisional headers are shown问题
  2. hdoj 2586 How far away ?
  3. Winform面试题
  4. Leetcode第904题
  5. 自然语言理解和自然语言处理_4种自然语言处理和理解的方法
  6. 西电计算机科学与技术排名,2020最新世界学科排名:西电3个学科跻身全球10强,发展势头强劲...
  7. 2010考研数学二第(13)题——导数应用题
  8. perl:DNA序列翻译成氨基酸序列的若干方法,直接法,简并法,哈希法,以及perl中的uc和lc函数(上)
  9. android 模拟内存不足,雷电模拟器内存不足怎么办?雷电安卓模拟器怎么修改内存大小?...
  10. 小程序微信官方推荐登录流程设计