天天看点

决策树的剪枝策略

决策树剪枝的目的去除训练树的过拟合问题,以维持树合理的深度及广度。按照剪枝的时段分可分为预剪枝及后剪枝。预剪枝是在树的生长时提前停止树的生长,后剪枝是在决策树生长完成后根据分枝节点的误差进行剪枝。

不管是预剪枝还是后剪枝,在代码实现时,一个关键点是记录下节点的相关信息,包括到达该节点的训练样本数、当该节点作为叶子节点时的判定类别、错误样本数、节点的信息熵等。在此,首先定义节点类:

//节点名称
	public String name;
	//节点深度
	public int lever;
	//节点分割属性
	public String attStr;
	public String splitStr;
	//分割属性对应的属性索引
	public int att_index;
	//属性值类型 1:连续型 2:离散型
	public int attValueType;
	//分割属性取值点
	public String attVal;//离散型
	public double con_attVal;//连续型
	//与分割属性取值的关系 1:大于,2:等于,3小于,4大于等于,5小于等于,0根节点
	public int attType;
	//节点样本数
	public int    sampleCount;
	//错误标签样本数
	public int    lossCount;
	//节点标签
	public String yVal;
	//标签分布概率
	public double[] yprob;
	public Vector<String> yprobName;
	//是否叶子节点
	public int    terminalNode;
	//节点熵
	public double entropyVal;
	//基于误差剪枝 EBP
	public double ebp_val;
	
	public Vector<Node> childs;
	//剪枝数据样本数
	public int prun_sampleCount;
	//剪枝数据错误标签样本数
	public int prun_lossCount;
	//剪枝数据的标签分布概率
	public double[] prun_yprob;
	//剪枝数据的错误率
	public double prun_error_ratio;
	
	//PER修正误差数
	public double per_error_leaf;//作为叶子节点的修正误差数
	public double per_error_st;//作为非叶子节点的修正误差数
           

一、预剪枝

预剪枝的方法主要包括以下几种:

1、树的高度限制:设定树的高度最大值,当达到限定值时,停止树的生长;

2、训练样本限制:对一个拥有较少训练样本的节点进行分裂时容易出现过拟合现象,因此设定样本量阀值,当样本量少于阀值时停止生长;

3、系统性能增益:当属性的信息增益小于某个指定的阀值时停止增长;

4、纯度限制:当该节点中某个类别的占比超过指定阀值时,停止生长。

根据上述的节点定义,预剪枝的1、2、4直接根据节点属性就可以判断,而3的实现则需要先按照生成孩子节点的方式先选择出最优分类属性,再根据最优分裂属性所带来的增益决定是否需要停止生长。

/**预剪枝
	 * @param node 节点统计
	 * @param minSampleCount 最小可分割样本数
	 * @param purity 最小不分割纯度
	 * @param maxLever 最大树深度
	 * @return
	 */
	public static boolean conSeg(Node node,int minSampleCount,double purity,int maxLever){	if(node.lever<maxLever&&node.sampleCount>=minSampleCount&&(double)(node.sampleCount-node.lossCount)/node.sampleCount<purity){
			return true;
		}else{
			return false;
		}
	}
           

二、后剪枝

剪枝是一个判断把非叶子节点替代为叶子节点时是否更有利于分类的过程。在实际的应用中,后剪枝比预剪枝具有更广的应用。后剪枝算法之间的差异包括以下几个方面:自上而下还是自下而上、是否需要独立的剪枝数据集、节点的误差估计方法、剪枝条件。主要的剪枝方法有降低错误剪枝、悲观错误剪枝、基于错误剪枝、代价-复杂度剪枝、最小错误剪枝。

1、降低错误剪枝REP(Reduced Error Pruning)

把数据分割成训练数据集及剪枝数据集,首先通过训练数据集构建出一棵决策树,然后使用该树对剪枝数据集样例进行预测,统计各个节点的误差,当该节点作为叶子节点时的误差比作为一棵子树时的误差要小则进行剪枝。采用自底向上的方式,当所有子树均不被剪枝时停止生长。

决策树的剪枝策略

继续阅读