随机森林 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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。