在前面线性回归,线性回归要拟合全部样本,这个是不显示的,因为问题不一定就是线性模型,其中一种可行的方法是将数据集切分成多分易建模的数据,然后利用前面线性回归的方法来建模。如果第一个切分之后的数据还不好拟合的话,那就继续切分。

这就是决策树中一种叫分类回归树CART。这个算法即可以用于分类也可以用于回归。

在这个学习中,介绍了树剪枝算法。

CART算法实现

先看一下之前的树分类

from numpy import *

def loadDataSet(fileName):      #general function to parse tab -delimited floats
    dataMat = []                #assume last column is target value
    fr = open(fileName)
    for line in fr.readlines():
        curLine = line.strip().split('\t')
        fltLine = map(float,curLine) #map all elements to float()
        dataMat.append(fltLine)
    return dataMat

def binSplitDataSet(dataSet, feature, value):
    mat0 = dataSet[nonzero(dataSet[:,feature] > value)[0],:][0]
    mat1 = dataSet[nonzero(dataSet[:,feature] <= value)[0],:][0]
    return mat0,mat1

我们大概看一下结果:

>>> import regTrees
>>> testMat = mat(eye(4))
>>> testMat
matrix([[ 1.,  0.,  0.,  0.],
        [ 0.,  1.,  0.,  0.],
        [ 0.,  0.,  1.,  0.],
        [ 0.,  0.,  0.,  1.]])
>>> mat0,mat1 = regTrees.binSplitDataSet(testMat,1,0.5)
>>> mat0
matrix([[ 0.,  1.,  0.,  0.]])
>>> mat1
matrix([[ 1.,  0.,  0.,  0.],
        [ 0.,  0.,  1.,  0.],
        [ 0.,  0.,  0.,  1.]])

第二个函数以第二个特征进行分类,以0.5作为切分。下面给出CART算法流程

机器学习9树回归

具体代码先不贴了,下面看看这个算法的树剪枝算法。

对于一棵树来说,如果节点过多,这个模型可能对数据过拟合,我们之前采用了交叉验证来发现过拟合,这个决策树也是一样。

通过降低决策树的复杂度来避免过拟合的过程称为剪枝。剪枝分为预剪枝跟后剪枝。

学习的这个事需要坚持,这几天感觉状态不佳,看这些算法有点囫囵吞枣了,目前先这样吧,先匆匆看完吧。