0
回答
机器学习实战之树回归的代码是否功能多余问题
科大讯飞通用文字识别100000次/天免费使用。立即申请   

各位好,小弟初学机器学习,在学习机器学习实战第九章树回归中,(书中164页)程序清单9-2:回归树的切分函数遇到一个疑惑,书中代码如下:

def chooseBestSplit(dataSet, leafType=regLeaf, errType=regErr, ops=(1,4)):
    #第一种情况
    tolS = ops[0]; tolN = ops[1] 	   							# tolS 表示容许的误差下降值, tolN 表示切分的样本数
    if len(set(dataSet[:,-1].T.tolist()[0])) == 1: #exit cond 1 # 如果所有值(最后一列即为特征)相等, 说明无需再划分
        return None, leafType(dataSet)
	#第二种情况
    m,n = shape(dataSet)
    S = errType(dataSet)
    bestS = inf; bestIndex = 0; bestValue = 0
    for featIndex in range(n-1):								#遍历特征寻求最佳划分特征
        for splitVal in set(dataSet[:,featIndex]):				#遍历每个特征值寻求最佳划分值
            mat0, mat1 = binSplitDataSet(dataSet, featIndex, splitVal)
            if (shape(mat0)[0] < tolN) or (shape(mat1)[0] < tolN): continue
            newS = errType(mat0) + errType(mat1)
            if newS < bestS: 
                bestIndex = featIndex
                bestValue = splitVal
                bestS = newS
    if (S - bestS) < tolS: 	·									# 如果拆分后的误差下降值小于设定阀值, 则不进行拆分
        return None, leafType(dataSet) 
    #第三种情况
    mat0, mat1 = binSplitDataSet(dataSet, bestIndex, bestValue)
    if (shape(mat0)[0] < tolN) or (shape(mat1)[0] < tolN):  #exit cond 3
        return None, leafType(dataSet)
	return bestIndex,bestValue   								#返回最终处理结果

#同时附上数据集拆分函数
def binSplitDataSet(dataSet, feature, value):
    mat0 = dataSet[nonzero(dataSet[:,feature] > value)[0],:][0]
    mat1 = dataSet[nonzero(dataSet[:,feature] <= value)[0],:][0]
    return mat0,mat1

我的疑惑在于最后一种处理方式是否多余,因为假设第二种的循环成功得到最佳分类属性和分类值,则最后一种方式的判断无法满足而无效;假设第二种方法的循环都不满足条件,则最佳分类属性与最佳分类值均为初始定义的值为0,按照第二种处理方式后的if函数可判定(S-bestS)为负无穷,必然小于tolS而满足条件,返回空节点,第三种处理方式根本不用执行,所以第三种处理方式的代码是否多余?

望各位大牛不吝赐教,谢谢!

举报
splended
发帖于2年前 0回/318阅
顶部