随机森林 python实现,Python画森林图

  随机森林 python实现,Python画森林图

  博主试图对一个数据集构建两类随机森林。所有的特征都是连续的属性,我们还画了随机森林的流程图

  代码

  #-* -编码:utf-8-* -

  -

  # @作者:崔健

  -

  进口熊猫作为螺纹中径

  导入编号为公证人

  来自随机导入随机范围

  从数学导入楼层,sqrt

  froms kle arn。预处理导入标签

  froms kle arn。交叉验证导入训练测试分割

  classrandomforest(对象) :

  ""

  随机森林模型

  ""

  defload_data(自身,文件名) :

  ""

  从开放源代码的声纳数据中加载当前测试数据

  文件名称文件路径文件的名称

  ""

  DATA=PD.read_CSV(文件名,头=无)))))).

  target=data.iloc[:-1]

  自我目标=标签编码器(。拟合_变换)列表(目标) )

  自我。数据=数据。iloc[:0:data。形状[1]-2]

  定义子样本(自身,比率) :

  ""

  比例是划分训练样本和测试样本的比例

  例如:0.7-70%正样品30%负样品

  ""

  Traindata,Testdata,Traintarget,test target=train _ test _ split(self。数据,自身目标,测试大小=比率)

  返回测试数据、测试目标、训练数据和列车目标

  defbuildtree(自身,训练数据,训练目标,最大深度,最小尺寸,n个特征) :

  ""

  构建决策树

  最大深度树深度

  最小_大小树的大小

  n _特征随机采样特征的数量

  ""

  root=self.get_root(traindata,traintarget,n_features))。

  self.construct_tree(root,traindata,traintarget,max_depth,min_size,n_features,1))。

  返回根

  efnode_end(自身,组,目标) :

  ""

  树节点结束处理,输出预测分类

  ""

  returnmax(set ) target[group],key=lambdax:list ) target[group].计数(x ) x)

  efconstruct_tree(自身,节点,数据,目标,最大深度,最小大小,n个特征,深度) ) :

  leftgroup,rightgroup=node[groups]

  德尔(节点(组 ) )

  如果不是左组或右组:

  节点[左]=节点[右]=自身。node _ end(leftgrouprightgroup,target)

  返回

  如果深度=最大深度:

  node [左],node[右]=self.node_end(左组,目标),self.node _ end ) rightgroup,目标

  返回

  iflen(leftgroup )=min_size:

  node [ left ]=self.node _ end(左组,目标)).

  否则:

  node[ left ]=自身。get _ root(数据。iloc[左组,],target[左组],n_features).

  self.construct_tree(node[le])

  ft],data.iloc[leftgroup,target[leftgroup],max_depth,min_size,n_features,depth 1)

  如果len(rightgroup)=min_size:

  节点[右]=自身。node _ end(右组,目标)

  否则:

  节点[右]=自身。get _ root(数据。iloc[右组,],目标[右组],n_features)

  自我。construct _ tree(node[右],data . iloc[右组,],target[右组],max_depth,min_size,n_features,depth 1)

  def get_root(self,traindata,traintarget,n_features):

  获取每棵决策树的节点

  列车数据训练数据

  b_index,b_value,b_score,b _ groups=999,999,999,无

  功能=列表()

  而len(特征)n _特征:

  指数=随机范围(训练数据。形状[1])

  如果索引不在特征中:

  功能。追加(索引)

  对于特征中的索引:

  对于范围内的行(traindata.shape[0]):

  groups=self.groups_split(index,traindata.iloc[rows,index],traindata)

  gini=self.giniscore(组,训练目标)

  如果基尼b _分数:

  b_index,b_value,b_score,b_groups=index,traindata.iloc[rows,index],基尼,组

  返回{ 索引:b _索引,值:b _值,组:b _组}

  定义组_拆分(自身、索引、节点值、数据):

  根据当前所选属性,通过比较其他数据,将数据集划分为两个子集

  指数特征属性索引值

  节点值选取样本节点对应属性特征的数据值

  数据原始训练数据

  返回值:

  左组,右组记录根据当期属性分类之后的样本的数字索引值,左组为左节点,右组右节点

  leftgroup,rightgroup=list(),list()

  datalength=data.shape[0]

  对于范围中的行(数据长度):

  if data.iloc[row,index]

  leftgroup.append(行)

  否则:

  rightgroup.append(行)

  返回左组,右组

  定义训练(自身,n _树,最大深度,最小大小,n _特征,比率):

  训练模型

  n _树森林树的数量

  trees=list()

  对于范围内的I(n _ trees):

  测试数据,测试目标,训练数据,训练目标=自身。子样本(比率)

  tree=self.buildtree(Traindata,Traintarget,max_depth,min_size,n_features)

  trees.append(树)

  测试数据,测试目标,训练数据,训练目标=自身。子样本(比率)

  预测=self.bagging_predict(Testdata,Testtarget,trees)

  返回预测

  定义打包_预测(自我、数据、目标、树):

  投票表决

  数据测试数据

  目标测试数据标签

  树训练得到的多棵树

  结果=[]

  对于范围内的x(数据。形状[0]):

  tmp=[]

  对于树中树:

  tmp。追加(自我。预测(数据。iloc[x,target[x],tree))

  result.append(max(set(tmp),key=x:tmp . count(x))

  返回sum([1 if target[x]==result[x]else 0 for x in range(data。shape[0])* 1.0/len(结果)

  定义预测(自身、数据、目标、树):

  功能:单棵树的决策

  数据测试数据

  目标测试数据标签

  树单棵树

  如果数据[树[索引]]

  if isinstance(tree[left],dict):

  回归自我预测(数据,目标,树[左])

  否则:

  返回树[左]

  否则:

  if isinstance(tree[right],dict):

  回归自我预测(数据,目标,树[右])

  否则:

  返回树[右]

  定义基尼系数(自我、小组、训练目标):

  计算基尼系数,基尼系数是计算划分后的数值,基尼系数越小反映数据的纯度越高,也就是划分效果越好

  基尼=0.0

  目标=设置(训练目标)

  对于组中的子组:

  groupgini=0.0

  如果不是len(子组):

  继续

  对于目标值:

  子数据=训练目标[子组]

  prob=sum(子数据==值)*1.0/len(子数据)

  groupgini=prob*(1-prob)

  基尼=groupgini/len(子组)

  回归基尼系数

  def main():

  Test=randomforest()

  Test.load_data(sonar.csv )

  ntrees=8

  max_depth=10

  min_size=1

  比率=0.8

  n _ features=floor(sqrt(test。数据。形状[1]-1))

  打印测试序列(树,最大深度,最小尺寸,n个特征,比率)

  if __name__==__main__ :

  主()

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: