python机器学习实战之树回归详解
本文实例为大家分享了树回归的具体代码,供大家参考,具体内容如下
#-*-coding:utf-8-*- #!/usr/bin/python ''''' 回归树连续值回归预测的回归树 ''' #测试代码 #importregTreesasRTRT.RtTreeTest()RT.RtTreeTest('ex0.txt')RT.RtTreeTest('ex2.txt') #importregTreesasRTRT.RtTreeTest('ex2.txt',ops=(10000,4)) #importregTreesasRTRT.pruneTest() #模型树测试 #importregTreesasRTRT.modeTreeTest(ops=(1,10) #模型回归树和普通回归树效果比较计算相关系数 #importregTreesasRTRT.MRTvsSRT() fromnumpyimport* #Tab键值分隔的数据提取成列表数据集成浮点型数据 defloadDataSet(fileName):# dataMat=[]#目标数据集列表 fr=open(fileName) forlineinfr.readlines(): curLine=line.strip().split('\t') fltLine=map(float,curLine)#转换成浮点型数据 dataMat.append(fltLine) returndataMat #按特征值的数据集二元切分特征(列)对应的值 #某一列的值大于value值的一行样本全部放在一个矩阵里,其余放在另一个矩阵里 defbinSplitDataSet(dataSet,feature,value): mat0=dataSet[nonzero(dataSet[:,feature]>value)[0],:][0]#数组过滤 mat1=dataSet[nonzero(dataSet[:,feature]<=value)[0],:][0]# returnmat0,mat1 #常量叶子节点 defregLeaf(dataSet):#最后一列为标签为数的叶子节点 returnmean(dataSet[:,-1])#目标变量的均值 #方差 defregErr(dataSet): returnvar(dataSet[:,-1])*shape(dataSet)[0]#目标变量的平方误差*样本个数(行数)的得到总方差 #选择最优的分裂属性和对应的大小 defchooseBestSplit(dataSet,leafType=regLeaf,errType=regErr,ops=(1,4)): tolS=ops[0]#允许的误差下降值 tolN=ops[1]#切分的最少样本数量 iflen(set(dataSet[:,-1].T.tolist()[0]))==1:#特征剩余数量为1则返回 returnNone,leafType(dataSet)####返回1#### m,n=shape(dataSet)#当前数据集大小形状 S=errType(dataSet)#当前数据集误差均方误差 bestS=inf;bestIndex=0;bestValue=0 forfeatIndexinrange(n-1):#遍历可分裂特征 forsplitValinset(dataSet[:,featIndex]):#遍历对应特性的属性值 mat0,mat1=binSplitDataSet(dataSet,featIndex,splitVal)#进行二元分割 if(shape(mat0)[0]tree['spVal']:#左树 ifisTree(tree['left']): returntreeForeCast(tree['left'],inData,modelEval)#还是树则递归调用 else: returnmodelEval(tree['left'],inData)#计算叶子节点的值并返回 else: ifisTree(tree['right']):#右树 returntreeForeCast(tree['right'],inData,modelEval) else: returnmodelEval(tree['right'],inData)#计算叶子节点的值并返回 #得到预测值 defcreateForeCast(tree,testData,modelEval=regTreeEval): m=len(testData) yHat=mat(zeros((m,1)))#预测标签 foriinrange(m): yHat[i,0]=treeForeCast(tree,mat(testData[i]),modelEval) returnyHat #常量回归树和线性模型回归树的预测结果比较 defMRTvsSRT(): TestMat=mat(loadDataSet('bikeSpeedVsIq_test.txt')) TrainMat=mat(loadDataSet('bikeSpeedVsIq_train.txt')) #普通回归树预测结果 #得到普通回归树树 StaTree=createTree(TrainMat,ops=(1,20)) #得到预测结果 StaYHat=createForeCast(StaTree,TestMat[:,0],regTreeEval)#第一列为自变量 #预测结果和真实标签的相关系数 StaCorr=corrcoef(StaYHat,TestMat[:,1],rowvar=0)[0,1]#NumPy库函数 #模型回归树预测结果 #得到模型回归树 ModeTree=createTree(TrainMat,leafType=modelLeaf,errType=modelErr,ops=(1,20)) #得到预测结果 ModeYHat=createForeCast(ModeTree,TestMat[:,0],modelTreeEval) #预测结果和真实标签的相关系数 ModeCorr=corrcoef(ModeYHat,TestMat[:,1],rowvar=0)[0,1]#NumPy库函数 print"普通回归树预测结果的相关系数R2:%f"%(StaCorr) print"模型回归树预测结果的相关系数R2:%f"%(ModeCorr) ifModeCorr>StaCorr: print"模型回归树效果优于普通回归树" else: print"回归回归树效果优于模型普通树"
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。