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

4248cd2099a3c53f44aa1fc467ebf3d4.png

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux之dd命令详解

Linux-dd命令详解 dd 是 Linux/UNIX 下的一个非常有用的命令&#xff0c;作用是用指定大小的块拷贝一个文件&#xff0c;并在拷贝的同时进行指定的转换。 名称: dd 使用权限: 所有使用者dd 这个指令在 manual 里的定义是 convert and copy a file 使用方式: dd [option]…

C++ 标准模板库

转载于:https://www.cnblogs.com/Flyzhcong/p/3977865.html

.NET Conf 2021 回顾

.NET Conf 2021是有史以来规模最大的.NET Conf,全球演讲者举办了80多场会议!我们非常感谢所有收看直播、在分享会上的提问、参与我们的乐趣和游戏的人。学习将持续到1月底&#xff0c;社区活动将持续进行&#xff0c;所以一定要查看这些活动&#xff0c;并关注我们的会议 GitHu…

男厕改女厕能多敷衍......

1 搓澡时最好不要闲聊&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 弟弟需要充电多久才能回家&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 这都什么野史&#xff1f;▼4 脚崴了怎么办&#xff1f;▼5 钥匙在老地方▼6 被红绿灯伤透…

shell之什么时候使用shell以及最简单的shell程序

因为Shell似乎是各UNIX系统之间通用的功能&#xff0c;并且经过了POSIX的标准化。因此&#xff0c;Shell脚本只要“用心写”一次&#xff0c;即可应用到很多系统上。因此&#xff0c;之所以要使用Shell脚本是基于&#xff1a; 简单性&#xff1a;Shell是一个高级语言&#xff…

《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)...

最新的效果见 &#xff1a;http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例&#xff1a;视频去雾效果 在图像去雾这个领域&#xff0c;几乎没有人不知道《Single Image Haze Removal Using Dark Channel Prior》这篇文章&#xff0c;该文是2009年C…

python 运算符重载_Python3面向对象-运算符重载

1&#xff1a;运算符重载介绍运算符重载&#xff0c;就是在某个类的方法中&#xff0c;拦截其内置的操作(比如&#xff1a;&#xff0c;-&#xff0c;*&#xff0c;/,比较&#xff0c;属性访问&#xff0c;等等)&#xff0c;使其实例的行为接近内置类型。当类的实例出现在内置操…

docker Failed to get D-Bus connection 报错

在centos7的容器里面出现了一个BUG&#xff0c;就是serveice启动服务的时候出现报错&#xff0c;不能用service启动服务。[roote13c3d3802d0 /]# service httpd startRedirecting to /bin/systemctl start httpd.serviceFailed to get D-Bus connection: Operation not permit…

牛顿法、拟牛顿法、高斯-牛顿法、共轭梯度法推导总结

原文&#xff1a;http://ihoge.cn/2018/newton1.html 前言&#xff1a; 线性最小二乘问题&#xff0c;我们可以通过理论推导可以得到其解析解&#xff0c;但是对于非线性最小二乘问题&#xff0c;则需要依赖迭代优化的方法&#xff0c;牛顿算法是解决非线性最优的常见算法之一…

WD 蓝盘、绿盘、黑盘、红盘的区别

绿盘&#xff0c;蓝盘、黑盘和红盘是西部数据根据旗下所产硬盘的特点所做的分类&#xff0c;通俗点讲&#xff1a;所谓的黑盘、蓝盘、绿盘、红盘就是指的西部数据硬盘上贴的那张纸&#xff0c;是黑色、蓝色、绿色、或红色。 黑盘&#xff1a;高性能&#xff0c;大缓存&#xff…

不用变量交换2个值

题目: 不使用变量交换2个值 代码如下: #include <iostream> using namespace std;int main() { int a = 3;int b = 4;cout<<"a="<<a<<endl;cout<<"b="<<b<<endl;a = a ^ b;b = a ^ b;a = a ^ b;cout<&…

基于事件驱动架构构建微服务第16部分:Azure Active Directory B2C

原文链接: https://logcorner.com/building-micro-services-through-event-driven-architecture-part16-azure-active-directory-b2c/在本教程中&#xff0c;我将展示如何通过使用Azure AD B2C启用Oauth2和OpenId Connect来保护微服务。Azure Active Directory B2C将B2C身份认证…

SAP basis事务代码笔记

SU01 用户维护&#xff0c;可创建、删除、编辑、解锁/锁定、修改密码SU03 Maintain Authorization 配置权限&#xff08;基于权限对象authorization object&#xff09;SU10 Mass Changes to User Master Records 对用户主记录的大量修改&#xff0c;批量维护账号用。SU12 Ma…

Swift数据类型简介(二)

整数 整数就是没有小数部分的数字&#xff0c;比如42和-23。整数可以是有符号&#xff08;正、负、零&#xff09;或者无符号&#xff08;正、零&#xff09;。 Swift 提供了8&#xff0c;16&#xff0c;32和64位的有符号和无符号整数类型。这些整数类型和 C 语言的命名方式很像…

java jar包收集

activation~与javaMail有关的jar包&#xff0c;使用javaMail时应与mail.jar (mail.jar和activation.jar)一起加入到lib中去&#xff0c;具体负责mail的数据源和类型等。 ApacheActiveMQ~Apache出品&#xff0c;最流行的&#xff0c;能力强劲的开源消息总线。ActiveMQ是一个完全…

java 栈和队列实现迷宫代码_LeetCode每日一题--剑指 Offer 09. 用两个栈实现队列(Java)

DailyChallenge剑指 Offer 09. 用两个栈实现队列Easy20200630Description用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;d…

提升方法之AdaBoost算法

提升方法之AdaBoost算法 作为非数学专业出身看到密密麻麻的数学公式刚开始真的是非常头疼。算法的物理逻辑的时候尚能理解&#xff0c;但是涉及到具体的数学公式实现就开始懵逼了&#xff1a;为什么要用这个公式&#xff0c;这个公式是怎么推到的&#xff0c;这个公式达到什么…

C的|、||、、、异或、~

位运算 位运算的运算分量只能是整型或字符型数据&#xff0c;位运算把运算对象看作是由二进位组成的位串信息&#xff0c;按位完成指定的运算&#xff0c;得到位串信息的结果。 位运算符有&#xff1a; &(按位与)、|(按位或)、^(按位异或)、~ (按位取反)。 …

C# 开源一个基于 yarp 的 API 网关 Demo,支持绑定 Kubernetes Service

关于 Neting刚开始的时候是打算使用微软官方的 Yarp 库&#xff0c;实现一个 API 网关。目前写完了查看 Kubernetes Service 信息、创建 Route 和 Cluster 和绑定 Kubernetes Service。简单来说&#xff0c;就是完成了基础部分&#xff0c;配置路由和后端服务绑定&#xff0c;如…