理论
CART(Classification and Regression Tree)是决策树的一种。
决策树是每次以某个属性为准,将数据集划分为几个类,最终数据集中的元素都被划分到相应的类中。典型的决策树算法是ID3。ID3与CART不同之处:ID3生成的决策树是n叉树,CART是二叉树;两种算法在每次迭代时都需要寻找最优的划分属性,不同的是,ID3用来度量划分是否为优的准则是:信息增益(Information Gain),而CART使用的准则是Gini impurity(基尼杂质)或Variance reduction。
Gini impurity
(来自维基百科)
Gini impurity用来衡量一个元素被错误分类的概率大小。当所有节点只能分到一个类中时,Gini imputiry达到最小0.
Gini impurity的计算:加上所有项被选择的概率
fi
与被错分的概率
1−fi
的乘积(不懂)
IG(f)=∑i=1mfi(1−fi)=∑i=1m(fi−f2i)=∑i=1mfi−∑i=1mf2i=1−∑i=1mf2i=∑i≠kfifk
后剪枝
getMean(tree):计算树所有叶子节点值的平均值
由底向上剪枝,如果合并两棵子树后的方差比未合并时小,那么合并子树。
程序学习
- numpy中的函数:nonzero
返回非零元素值的下标,返回数组的数组,包含某一维(二维矩阵的话,会返回包含两个array的tuple,其中一个array代表x维,另一个代表y维)中非零元素的下标。相应的非零元素值可以通过a[nonzero(a)]
来得到。
Examples:
python
>>> x = np.eye(3)
>>> x
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
>>> np.nonzero(x)
(array([0, 1, 2]), array([0, 1, 2]))
>>> x[np.nonzero(x)]
array([ 1., 1., 1.])
>>> np.transpose(np.nonzero(x))
array([[0, 0],
[1, 1],
[2, 2]])
- numpy中的matrix
在其函数中,有axis参数,其中0表示每列,1表示每行。
example:
python
>>> a
matrix([[1, 0],
[3, 4]])
>>> argmax(a,0) #argmax返回matrix中沿某个轴最大数的下标
matrix([[1, 1]])
>>> argmax(a,1)
matrix([[0],
[1]])
- 这个程序中使用的准则是Variance reduction
在根据属性的大小将数据集一分为二时(函数binSplitDataSet),有三种情况直接返回叶子节点(返回的数值是此数据集的平均):
- 1 数据集的类别或数值只有一个时
- 2 在根据某个属性划分数据集后,划分的左子树或右子树中元素的个数小于实现设置的阈值
- 3 在确定了最好的划分属性后,方差和划分前的方差相差很小(方差没有什么改进)