设为首页 加入收藏

TOP

随机森林和GBDT的学习(六)
2015-07-24 11:55:25 来源: 作者: 【 】 浏览:15
Tags:随机 森林 GBDT 学习
node.setAlpha(alpha); } /** * 筛选出节点所包含的叶子节点数 * * @param node * 待筛选节点 * @param leafNode * 叶子节点列表容器 */ private void addLeafNode(TreeNode node, ArrayList leafNode) { ArrayList dataIndex; if (node.getChildAttrNode() != null) { for (TreeNode childNode : node.getChildAttrNode()) { dataIndex = childNode.getDataIndex(); if (dataIndex != null && dataIndex.size() > 0) { // 说明此节点为叶子节点 leafNode.add(childNode); } else { // 如果还是非叶子节点则继续递归调用 addLeafNode(childNode, leafNode); } } } } } 测试类Client.java:
package DataMining_RandomForest;

import java.text.MessageFormat;

/**
 * 随机森林算法测试场景
 * 
 * @author lyq
 * 
 */
public class Client {
	public static void main(String[] args) {
		String filePath = "C:\\Users\\lyq\\Desktop\\icon\\input.txt";
		String queryStr = "Age=Youth,Income=Low,Student=No,CreditRating=Fair";
		String resultClassType = "";
		// 决策树的样本占总数的占比率
		double sampleNumRatio = 0.4;
		// 样本数据的采集特征数量占总特征的比例
		double featureNumRatio = 0.5;

		RandomForestTool tool = new RandomForestTool(filePath, sampleNumRatio,
				featureNumRatio);
		tool.constructRandomTree();

		resultClassType = tool.judgeClassType(queryStr);

		System.out.println();
		System.out
				.println(MessageFormat.format(
						"查询属性描述{0},预测的分类结果为BuysCompute:{1}", queryStr,
						resultClassType));
	}
}

?

算法的输出

?

下面是随机森林中的决策树:

决策树1

    --!--【1:Income】
        --Medium--【2】类别:Yes[1, 2, ]
        --!Medium--【3:Student】
                --No--【4】类别:No[3, 5, ]
                --!No--【5】类别:Yes[4, ]
决策树2

    --!--【1:Student】
        --No--【2】类别:No[1, 3, ]
        --!No--【3】类别:Yes[2, 4, 5, ]
查询属性描述Age=Youth,Income=Low,Student=No,CreditRating=Fair,预测的分类结果为BuysCompute:No

?

输出的结果决策树建议从左往右看,从上往下,【】符号表示一个节点,---XX---表示属性值的划分,你就应该能看懂这棵树了,在console上想展示漂亮的树形效果的确很难。。。这里说一个算法的重大不足,数据太少,导致选择的样本数据不足,所选属性太少,,构造的决策树数量过少,自然分类的准确率不见得会有多准,博友只要能领会代码中所表达的算法的思想即可。

GBDT

下面来说说随机森林的兄弟算法GBDT,梯度提升决策树,他有很多的决策树,他也有组合的思想,但是他不是随机森林算法2,GBDT的关键在于Gradient Boosting,梯度提升。这个词语理解起来就不容易了。学术的描述,每一次建立模型是在之前建立模型的损失函数的梯度下降方向。GBDT的核心在于,每一棵树学的是之前所有树结论和的残差,这个残差你可以理解为与预测值的差值。举个例子:比如预测张三的年龄,张三的真实年龄18岁,第一棵树预测张的年龄12岁,此时残差为18-12=6岁,因此在第二棵树中,我们把张的年龄作为6岁去学习,如果预测成功了,则张的真实年龄就是A树和B树的结果预测值的和,但是如果B预测成了5岁,那么残差就变成了6-5=1岁,那么此时需要构建第三树对1岁做预测,后面一样的道理。每棵树都是对之前失败预测的一个补充,用公式的表达就是如下的这个样子:

\

F0在这里是初始值,Ti是一棵棵的决策树,不同的问题选择不同的损失函数和初始值。在阿里内部对于此算法的叫法为TreeLink。所以下次听到什么Treelink算法了指的就是梯度提升树算法,其实我在这里省略了很大篇幅的数学推导过程,再加上自己还不是专家,无法彻底解释清数学的部分,所以就没有提及,希望以后有时间可以深入学习此方面的知识。

首页 上一页 3 4 5 6 下一页 尾页 6/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇【翻译自mos文章】在alter/drop表.. 下一篇干货分享:DBA专家门诊一期:索引..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Announcing October (2025-12-24 15:18:16)
·MySQL有什么推荐的学 (2025-12-24 15:18:13)
·到底应该用MySQL还是 (2025-12-24 15:18:11)
·进入Linux世界大门的 (2025-12-24 14:51:47)
·Download Linux | Li (2025-12-24 14:51:44)