1,初品随机森林

随机森林,森林就是很多决策树放在一起一起叫森林,而随机体现在数据集的随机采样中和特征的随机选取中,具体下面再讲。通俗的说随机森林就是建立多颗决策树(CART),来做分类(回归),以多数表决(平均法)来得出我们的分类(回归)结果。

这种思想就是一种集成思想,集成算法目前有两大类,一类是基学习器(可看做本文讲的决策树)之间存在强依赖性,基分类器的得出依赖于前面的分类器(前面分类器的结果会影响后面分类器的训练),可形象的看做个基学习器是串联的,代表是 Adaboost, Xgboost, GBDT(后面两种我们以后总结)。另一类是个体学习器之间不存在相关关系,相互独立,可形象的看做并联关系,代表是bagging和随机森林。

在建立独立的决策树时,有一些细节问题需要注意。

2, 随机选择样本

随机森林的随机之一就在样本的选择上,我们从样本集中有放回的随机采样,这种采样方法与bagging采样方法一致,具体采样过程如下:

  1. 有放回的从样本集中(

    个)随机采取
    个样本,这
    个样本中有重复样本。
  2. 进行
    轮采样(
    为决策树个数),采样方法如1。
def 

3, 随机选择特征

随机森林的另一随机就在特征选择上,随机森林本质就是对决策树的Bagging集成,只是在决策树的建立过程中加入了特征的随机选择。一直说特征选择,到底在哪用到了特征选择?接着说,每一棵决策树的每一个节点的建立不再是遍历每个特征的每一个取值,而是随机的选取预设个数的特征,要比原特征个数小,这样是为了使决策树有差异,这样的森林具有更好的泛化能力。然后在选取的特征上进行最优特征与最优切分点的选取。

def feature_sample(rows,n_feature):import randomfeature_index = [] #用于存放随机选取的特征对应的列号while len(feature_index)<n_feature:index = random.randrange(len(rows[0])-1)if index not in feature_index:  #选取的特征不重复feature_index.append(index)return feature_index

4, 集成方式

  1. 平均法:回归任务,对所有决策树的预测结果进行求平均
  2. 投票法:分类任务,少数服从多数

5, 随机森林代码实现

我们做一个随机森林的简单实现,使得更加理解随机森林。但如果在实际项目中使用,直接调用sklearn库中的函数即可。有一些辅助函数的实现,在上一篇决策树理论总结与代码实现 - 刘毛毛的文章 - 知乎 https://zhuanlan.zhihu.com/p/106833254文章中有实现,这里将直接使用。

def buildTree(rows,scoref,n_feature,min_size,min_gini,max_depth,depth):if len(rows)<=min_size:return decisionNode(results = uniquecounts(rows))if depth>=max_depth:return decisionNode(results = uniquecount(rows))best_gini = 0best_criteria = Nonebest_sets = None#特征抽样###features_index = feature_sample(rows,n_feature)#与决策树相比每个节点的最优特征候选集小了#根据抽取的特征对数据集进行拆分###for col in features_index:column_values={}for row in rows:column_values[row[col]]=1 #这样较决策树里的代码修改了一下,不重复的记录某特征的值values =[]for key in column_values.keys():#不在遍历某特征的所有值,只不重复的遍历values.append(key)for value in values:(set1,set2)=divideset(rows,col,value)p_set = float(len(set1))/len(rows)gini = p_set*scoref(set1)+(1-p_set)*scoref(set2)if gini>best_gini and len(set1)>0 and len(set2)>0:best_gini = ginibest_criteria=(col,value)best_sets = (set1,set2)if best_gini > min_gini:truebranch = buildTree(best_sets[0],scoref,n_feature,min_size,mini_gini,max_depth,depth+1)falsebranch = buildTree(best_sets[1],scoref,n_feature,min_size,mini_gini,max_depth,depth+1)return decisionnode(col = best_criteria[0],value = best_criteria[1],tb = truebranch,fb = falsebranch)else:return decisionnode(results=classcounts(rows))

添加预测函数,求准确率函数,结果集成函数(分类)

def predict_results(observation,tree):if tree.results != None:return tree.resultselse:v = observation[tree.col]Branch = Noneif isinstance(v,int) or isinstance(v,float):if v >= tree.value:Branch = tree.tbelse:Branch = tree.fbelse:if v == tree.value:Branch = tree.tbelse:Branch = tree.fbreturn predict_results(observation,Branch)def predict(observation,tree):results = predict_results(observation,tree)label = Noneb_count = 0for key in results.keys():if results[key] > b_count:b_count = results[key]label = keyreturn label
def accuracy(actual,predicted):correct =0for i in range(len(actual)):if actual[i]==predicted[i]:correct += 1accuracy = (float(correct)/len(actual))*100return accuracy
def bagging_predict(trees,row):predictions=[predict(row,tree) for tree in trees]return max(set(predictions),key=predictions.count)

随机森林实现

def RandomForest(train,test,ratio,max_depth=4,min_size=3,min_gini=0.3,n_trees=100,n_features=3,scoref=giniimpurity):trees = []for i in range(n_trees):subset = subsample(train,ratio)#subset = traintree=buildTree(subset,scoref,n_features,min_gini,min_size,max_depth,0)trees.append(tree)predictions=[bagging_predict(trees,row) for row in test]actual = [row[-1] for row in test]test_score = accuracy(actual,predictions)return test_score

亲测有效,只是对样本量小,特征又小的数据集效果不好,原因应该是在数据集较小的情况下,采样的数据就更加简单化,训练的模型自然不好。

基于python的随机森林回归实现_随机森林理论与python代码实现相关推荐

  1. Python实现Stacking回归模型(随机森林回归、极端随机树回归、AdaBoost回归、GBDT回归、决策树回归)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 Stacking通常考虑的是异质弱学习器(不同的学习算法被组合在 ...

  2. 基于python的随机森林回归实现_PYTHON | 随机森林实战(代码+详解)

    大家好,我是菜鸟君,之前跟大家聊过R语言的随机森林建模,指路 R语言 | 随机森林建模实战(代码+详解),作为刚过完1024节日的码农算法工程师来说,怎么可能只会用一种语言呢?今天就来说说Python ...

  3. python随机森林 交叉验证_随机森林算法详解及Python实现

    一 简介 随机森林是一种比较有名的集成学习方法,属于集成学习算法中弱学习器之间不存在依赖的一部分,其因为这个优点可以并行化运行,因此随机森林在一些大赛中往往是首要选择的模型. 随机森立中随机是核心,通 ...

  4. python随机森林 交叉验证_随机森林是否需要交叉验证+特征的重要性

    随机森林不需要交叉验证! 随机森林属于bagging集成算法,采用Bootstrap,理论和实践可以发现Bootstrap每次约有1/3的样本不会出现在Bootstrap所采集的样本集合中.故没有参加 ...

  5. Scikit-learn_回归算法_随机森林回归算法

    一.描述 随机森林回归模型能够通过组合不同的决策树降低方差,但有时会略微增加偏差.在实际应用中,方差降低通常比偏差增加更加显著,所以随机森林回归模型能够取得更好的效果. 二.用法和参数 n_estim ...

  6. python网络编程要学吗_总算发现如何学习python网络编程

    为了提高模块加载的速度,每个模块都会在__pycache__文件夹中放置该模块的预编译模块,命名为module.version.pyc,version是模块的预编译版本编码,一般都包含Python的版 ...

  7. python的gui库哪个好_常用的13 个Python开发者必备的Python GUI库

    [Python](http://www.blog2019.net/tag/Python?tagId=4)是一种高级编程语言,它用于通用编程,由Guido van Rossum 在1991年首次发布.P ...

  8. python要和什么一起学_跟哥一起学Python(1) - python简介

    01-写在前面 我做了十几年的程序猿,码过代码.带过项目.做过产品经理.做过软件架构师.因为我是做通信设备软件的,面向底层操作系统,所以我的工作主要以C语言为主.Python在我的工作中通常用来写一些 ...

  9. python做后端开发的优点_【后端开发】python语言的特点是什么

    python语言的特点是什么? python语言的特点 简单 Python是一门简单而文字简约的语言.阅读好的Python程序感觉就像阅读英语,尽管是非常严格的英语.Python的这种伪代码特性是其最 ...

最新文章

  1. JAVA面试解析(有赞二面)
  2. clickhouse修改时区
  3. 【Android】Android中使用JNI调用底层C++代码
  4. 比较两个文件夹图像相似度
  5. JVM_04 对象的实例化+内存布局+访问定位+直接内存
  6. JAva面试题(微信分享)
  7. java Split 用法
  8. Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:排序和连接数据...
  9. 产品迭代发布如何更快速?阿里持续集成与持续交付实践之路全解析
  10. 《零基础学习Liunx之三》 The following takes place between 04:00PM and 05:00PM
  11. java QQ向另一个QQ发信息(可以是好友,也可以是非好友)
  12. 客户端Connection reset by peer怎么办?——可能只是服务端挂了
  13. 【数据库】数据库入门(五): 实体关系模型 (Entity-Relationship Model)
  14. 进阶-第28__深度探秘搜索技术_实战掌握误拼写时的fuzzy模糊搜索技术
  15. python学习笔记(面向对象,类)
  16. 这几个万里挑一的良心App,个顶个好用,保证一用就再舍不得删
  17. MYSQL之You can't specify target table for update in FROM clause解决办法
  18. Android类似钉钉类的APP 实现禁止用户虚拟定位
  19. java反射 interface_Java反射
  20. 《The One!团队》第八次作业:ALPHA冲刺(二)

热门文章

  1. 中芯国际第二代FinFET工艺有望与2020年底试产
  2. 作为一个有理想的程序员,必读的书都有哪些?
  3. 优化 Azure 成本,实现财务目标
  4. ASP.NET Core分布式项目实战(集成ASP.NETCore Identity)--学习笔记
  5. [Asp.net core 3.1] 通过一个小组件熟悉Blazor服务端组件开发
  6. 博客园升级有感一点建议
  7. [译]聊聊C#中的泛型的使用
  8. BXUG第11期活动
  9. 本土开源、立足全球 | COSCon'17
  10. 介绍Portable PDB