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

随机森林需要调整的参数有:
(1)    决策树的个数
(2)    特征属性的个数
(3)    递归次数(即决策树的深度)'''
from numpy import inf
from numpy import zeros
import numpy as np
from sklearn.model_selection import train_test_split#生成数据集。数据集包括标签,全包含在返回值的dataset上
def get_Datasets():from sklearn.datasets import make_classificationdataSet,classLabels=make_classification(n_samples=200,n_features=100,n_classes=2)#print(dataSet.shape,classLabels.shape)return np.concatenate((dataSet,classLabels.reshape((-1,1))),axis=1)#切分数据集,实现交叉验证。可以利用它来选择决策树个数。但本例没有实现其代码。
#原理如下:
#第一步,将训练集划分为大小相同的K份;
#第二步,我们选择其中的K-1分训练模型,将用余下的那一份计算模型的预测值,
#这一份通常被称为交叉验证集;第三步,我们对所有考虑使用的参数建立模型
#并做出预测,然后使用不同的K值重复这一过程。
#然后是关键,我们利用在不同的K下平均准确率最高所对应的决策树个数
#作为算法决策树个数def splitDataSet(dataSet,n_folds):     #将训练集划分为大小相同的n_folds份;fold_size=len(dataSet)/n_foldsdata_split=[]begin=0end=fold_sizefor i in range(n_folds):data_split.append(dataSet[begin:end,:])begin=endend+=fold_sizereturn data_split
#构建n个子集
def get_subsamples(dataSet,n):subDataSet=[]for i in range(n):index=[]     #每次都重新选择k个 索引for k in range(len(dataSet)):  #长度是kindex.append(np.random.randint(len(dataSet)))  #(0,len(dataSet)) 内的一个整数subDataSet.append(dataSet[index,:])return subDataSet#    subDataSet=get_subsamples(dataSet,10)
##############################################################################根据某个特征及值对数据进行分类
def binSplitDataSet(dataSet,feature,value):mat0=dataSet[np.nonzero(dataSet[:,feature]>value)[0],:]mat1=dataSet[np.nonzero(dataSet[:,feature]<value)[0],:]return mat0,mat1'''feature=2 value=1dataSet=get_Datasets()mat0,mat1= binSplitDataSet(dataSet,2,1)
'''#计算方差,回归时使用
def regErr(dataSet):return np.var(dataSet[:,-1])*np.shape(dataSet)[0]#计算平均值,回归时使用
def regLeaf(dataSet):return np.mean(dataSet[:,-1])def MostNumber(dataSet):  #返回多类#number=set(dataSet[:,-1])len0=len(np.nonzero(dataSet[:,-1]==0)[0])len1=len(np.nonzero(dataSet[:,-1]==1)[0])if len0>len1:return 0else:return 1#计算基尼指数   一个随机选中的样本在子集中被分错的可能性   是被选中的概率乘以被分错的概率
def gini(dataSet):corr=0.0for i in set(dataSet[:,-1]):           #i 是这个特征下的 某个特征值corr+=(len(np.nonzero(dataSet[:,-1]==i)[0])/len(dataSet))**2return 1-corrdef select_best_feature(dataSet,m,alpha="huigui"):f=dataSet.shape[1]                                            #拿过这个数据集,看这个数据集有多少个特征,即f个index=[]bestS=inf;bestfeature=0;bestValue=0;if alpha=="huigui":S=regErr(dataSet)else:S=gini(dataSet)for i in range(m):index.append(np.random.randint(f))                        #在f个特征里随机,注意是随机!选择m个特征,然后在这m个特征里选择一个合适的分类特征。 for feature in index:for splitVal in set(dataSet[:,feature]):                  #set() 函数创建一个无序不重复元素集,用于遍历这个特征下所有的值mat0,mat1=binSplitDataSet(dataSet,feature,splitVal)  if alpha=="huigui":  newS=regErr(mat0)+regErr(mat1)   #计算每个分支的回归方差else:newS=gini(mat0)+gini(mat1)                        #计算被分错率if bestS>newS:bestfeature=featurebestValue=splitValbestS=newS                      if (S-bestS)<0.001 and alpha=="huigui":                      # 对于回归来说,方差足够了,那就取这个分支的均值return None,regLeaf(dataSet)elif (S-bestS)<0.001:#print(S,bestS)return None,MostNumber(dataSet)                          #对于分类来说,被分错率足够下了,那这个分支的分类就是大多数所在的类。#mat0,mat1=binSplitDataSet(dataSet,feature,splitVal)return bestfeature,bestValuedef createTree(dataSet,alpha="huigui",m=20,max_level=10):             #实现决策树,使用20个特征,深度为10,bestfeature,bestValue=select_best_feature(dataSet,m,alpha=alpha)if bestfeature==None:return bestValueretTree={}max_level-=1if max_level<0:   #控制深度return regLeaf(dataSet)retTree['bestFeature']=bestfeatureretTree['bestVal']=bestValuelSet,rSet=binSplitDataSet(dataSet,bestfeature,bestValue)      #lSet是根据特征bestfeature分到左边的向量,rSet是根据特征bestfeature分到右边的向量retTree['right']=createTree(rSet,alpha,m,max_level)retTree['left']=createTree(lSet,alpha,m,max_level)            #每棵树都是二叉树,往下分类都是一分为二。#print('retTree:',retTree)return retTreedef RondomForest(dataSet,n,alpha="huigui"):   #树的个数#dataSet=get_Datasets()Trees=[]        # 设置一个空树集合for i in range(n):X_train, X_test, y_train, y_test = train_test_split(dataSet[:,:-1], dataSet[:,-1], test_size=0.33, random_state=42)X_train=np.concatenate((X_train,y_train.reshape((-1,1))),axis=1)Trees.append(createTree(X_train,alpha=alpha))return Trees     # 生成好多树
####################################################################预测单个数据样本,重头!!如何利用已经训练好的随机森林对单个样本进行 回归或分类!
def treeForecast(trees,data,alpha="huigui"):      if alpha=="huigui":if not isinstance(trees,dict):                       #isinstance() 函数来判断一个对象是否是一个已知的类型return float(trees)if data[trees['bestFeature']]>trees['bestVal']:      # 如果数据的这个特征大于阈值,那就调用左支if type(trees['left'])=='float':                 #如果左支已经是节点了,就返回数值。如果左支还是字典结构,那就继续调用, 用此支的特征和特征值进行选支。 return trees['left']else:return treeForecast(trees['left'],data,alpha)else:if type(trees['right'])=='float':return trees['right']else:return treeForecast(trees['right'],data,alpha)   else:if not isinstance(trees,dict):                      #分类和回归是同一道理return int(trees)if data[trees['bestFeature']]>trees['bestVal']:if type(trees['left'])=='int':return trees['left']else:return treeForecast(trees['left'],data,alpha)else:if type(trees['right'])=='int':return trees['right']else:return treeForecast(trees['right'],data,alpha)   #随机森林 对 数据集打上标签   0、1 或者是 回归值
def createForeCast(trees,test_dataSet,alpha="huigui"):cm=len(test_dataSet)                      yhat=np.mat(zeros((cm,1)))for i in range(cm):                                     #yhat[i,0]=treeForecast(trees,test_dataSet[i,:],alpha)    #return yhat#随机森林预测
def predictTree(Trees,test_dataSet,alpha="huigui"):      #trees 是已经训练好的随机森林   调用它!cm=len(test_dataSet)   yhat=np.mat(zeros((cm,1)))   for trees in Trees:yhat+=createForeCast(trees,test_dataSet,alpha)    #把每次的预测结果相加if alpha=="huigui": yhat/=len(Trees)            #如果是回归的话,每棵树的结果应该是回归值,相加后取平均else:for i in range(len(yhat)):                  #如果是分类的话,每棵树的结果是一个投票向量,相加后,#看每类的投票是否超过半数,超过半数就确定为1if yhat[i,0]>len(Trees)/2:            yhat[i,0]=1else:yhat[i,0]=0return yhatif __name__ == '__main__' :dataSet=get_Datasets()  print(dataSet[:,-1].T)                                     #打印标签,与后面预测值对比  .T其实就是对一个矩阵的转置RomdomTrees=RondomForest(dataSet,4,alpha="fenlei")         #这里我训练好了 很多树的集合,就组成了随机森林。一会一棵一棵的调用。print("---------------------RomdomTrees------------------------")#print(RomdomTrees[0])test_dataSet=dataSet                               #得到数据集和标签yhat=predictTree(RomdomTrees,test_dataSet,alpha="fenlei")  # 调用训练好的那些树。综合结果,得到预测值。print(yhat.T)
#get_Datasets()print(dataSet[:,-1].T-yhat.T)

数学建模_随机森林分类模型详解Python代码相关推荐

  1. 数学建模——智能优化之模拟退火模型详解Python代码

    数学建模--智能优化之模拟退火模型详解Python代码 #本功能实现最小值的求解#from matplotlib import pyplot as plt import numpy as np imp ...

  2. 数学建模——支持向量机模型详解Python代码

    数学建模--支持向量机模型详解Python代码 from numpy import * import random import matplotlib.pyplot as plt import num ...

  3. 数学建模——智能优化之粒子群模型详解Python代码

    数学建模--智能优化之粒子群模型详解Python代码 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplo ...

  4. 数学建模——一维、二维插值模型详解Python代码

    数学建模--一维.二维插值模型详解Python代码 一.一维插值 # -*-coding:utf-8 -*- import numpy as np from scipy import interpol ...

  5. 数学建模——线性规划模型详解Python代码

    数学建模--线性规划模型详解Python代码 标准形式为: min z=2X1+3X2+x s.t x1+4x2+2x3>=8 3x1+2x2>=6 x1,x2,x3>=0 上述线性 ...

  6. 清风数学建模学习笔记——K-means聚类模型详解及SPSS操作流程

    聚类模型   聚类模型,就是将样本划分为有类似的对象组成的多个类的过程.聚类后,我们可以更加准确的在每个类中单独使用统计模型进行估计.分析或预测:也可以探究不同类之间的相关性和主要差异.此外,聚类与分 ...

  7. 【自然语言处理】Word2Vec 词向量模型详解 + Python代码实战

    文章目录 一.词向量引入 二.词向量模型 三.训练数据构建 四.不同模型对比 4.1 CBOW 4.2 Skip-gram 模型 4.3 CBOW 和 Skip-gram 对比 五.词向量训练过程 5 ...

  8. Python实现GWO智能灰狼优化算法优化随机森林分类模型(RandomForestClassifier算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 灰狼优化算法(GWO),由澳大利亚格里菲斯大学学者 Mirjal ...

  9. 数学建模——智能优化之遗传算法详解Python代码

    数学建模--智能优化之遗传算法详解Python代码 import numpy as np import matplotlib.pyplot as plt from matplotlib import ...

最新文章

  1. epoll 入门例子 tcp server/client
  2. python06-集合和序列
  3. NLP(自然语言处理)详细笔记
  4. 全球及中国抗甲状腺药物行业应用现状调研及未来产销需求预测报告2021-2027年
  5. 「后端小伙伴来学前端了」Vue中为什么直接安装less-loader会报版本过高错误?你有没有思考过?
  6. 面向消息的中间件 (Message-Oriented Middleware, MOM)
  7. 使用SAP iRPA创建一个最简单的hello world项目并部署到SAP云平台上
  8. Data Analysis: What are the skills needed to become a data analyst?
  9. Linux 内核宏 time_after解析
  10. Linux命令j解释之cp
  11. 从零开始学UC(1)之Microsoft Lync Server介绍
  12. MMIO与PIO区别
  13. 关于Vue Element组件el-checkbox与el-select默认选中值的几点注意事项
  14. Python如何快速爬取淘宝MM呢?教你一招
  15. java计算机毕业设计培训学校教学管理平台源码+程序+lw文档+mysql数据库
  16. 2014最火的10分钟6块腹肌动图gif教程,男人不能没有腹肌!
  17. android 瘦脸模式 sdk,大眼瘦脸加磨皮通通不能少,论美颜SDK是如何实现的
  18. linux的历史演绎
  19. 邦纳超声波传感器T30UXDA
  20. MySQL中的char和varcharmysql中varchar能存多少汉字、数字,以及varchar(100)和varchar(10)的区别

热门文章

  1. php执行只读文件,php实现以只读方式打开文件的方法
  2. micropython解释器原理_了解一下 MicroPython 的项目整体架构
  3. 成功解决Exception “unhandled ModuleNotFoundError“No module named ‘sklearn.neighbors.classification‘
  4. ML之FE:基于BigMartSales数据集利用Featuretools工具(1个dataframe表结构切为2个Entity表结构)实现自动特征工程之详细攻略
  5. ML之MLiR:利用多元线性回归法,从大量数据(csv文件)中提取五个因变量(输入运输任务总里程数、运输次数、三种不同的车型,预测需要花费的小时数)来预测一个自变量
  6. 成功解决ValueError: Shape of passed values is (1, 332), indices imply (1, 1)
  7. ML之4PolyR:利用四次多项式回归4PolyR模型+两种正则化(Lasso/Ridge)在披萨数据集上拟合(train)、价格回归预测(test)
  8. TF之DD:利用Inception模型+GD算法生成更高质量的Deep Dream高质量图片
  9. Win:如何查看自己的电脑是否通过代理服务器进行上网
  10. 成功解决UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xd3 in position 238: invalid continuation b