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"回归回归树效果优于模型普通树" 
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。