随机森林算法及其实现(1)

随机森林算法及其实现

算法理解

随机森林就是通过集成学习的思想将多棵决策树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法。

这里随机的意思涉及到了另一个思想,也就是 Bagging 思想。

Bagging 是 bootstrap aggregating 的简写,又称为装袋算法,是一种有放回的抽样方法,目的是为了得到统计量的分布以及置信区间,该算法可与其它分类、回归算法结合,提高其准确率、稳定形的同时,通过降低结果的方差,避免过拟合的发生。具体的步骤如下:

  • 采用重抽样方法(有放回抽样)从原始样本中抽取一定数量的样本
  • 根据抽出的样本计算想要得到的统计量T
  • 重复上述N次(一般大于1000),得到N个统计量T
  • 根据这N个统计量,即可计算出统计量的置信区间

随即森林就属于 Bagging。 通过随机的方式去构造不同的决策树形成一个森林,这些决策树之间相互没有关联,最后的结果便是通过这些决策树的预测结果统计得到。

算法实现

首先实现决策树,这里具体的代码就不贴出来了,可以贴贴结果。一是有点长,而是还有点小问题有待完善,用西瓜书上的伪代码表示一下决策树的算法步骤:

请添加图片描述
测试代码:

void RandomForestClassifier::unitTest()
{
	std::string fileName = ".\\data\\testRandomForest.txt";

	char* testFile = (char*)fileName.c_str();

	DataReader testReader(testFile, ",");


	testReader.train_test_split(0.3);
	IntArray* availableInstances = new IntArray(testReader.getTrainLabels()->getLength());
	IntArray* availableAttributes = new IntArray(testReader.getTrainData()->getColumns());
	DoubleMatrix* trainData = testReader.getTrainData();
	IntArray* trainLabels = testReader.getTrainLabels();
	DoubleMatrix* testData = testReader.getTestData();
	IntArray* testLabels = testReader.getTestLabels();
	Tree* tree = new Tree(trainData, testReader.getTrainLabels(), availableInstances, availableAttributes, testReader.getNumClasses(), 3);

	
	/*std::cout << "The Data:" << std::endl << testReader.getAllData()->toString() << std::endl;

	std::cout << "The tree:" << std::endl << tree->toString() << std::endl;*/

	tree->train();

	IntArray* predictLabels = new IntArray(testLabels->getLength());
	DoubleMatrix* oneLineData = new DoubleMatrix(1, testData->getColumns());


	for (int i = 0; i < testData->getRows(); i++)
	{
		oneLineData = oneLineData->getOneLine(testData, i);
		predictLabels->setValue(i, tree->predict(oneLineData));
	}


	/*std::cout << "trainData:" << std::endl << trainData->toString() << std::endl;
	std::cout << "trainLabels:" << std::endl << trainLabels->toString() << std::endl;*/
	std::cout << "testData:" << std::endl << testData->toString() << std::endl;
	std::cout << "testLabels:" << std::endl << testLabels->toString() << std::endl;
	std::cout << "predictLabels:" << std::endl << predictLabels->toString() << std::endl;

	double accuracy = 0;
	for (int i = 0; i < testData->getRows(); i++)
	{
		if (testLabels->getValue(i) == predictLabels->getValue(i))
		{
			accuracy++;
		}
	}
	accuracy /= testData->getRows();

	std::cout << "accuracy:"  << accuracy << std::endl;
	/*for (int i = 0; i < trainData->getColumns(); i++)
	{
		std::cout << tree->getNumValues(i) << std::endl;
	}*/
}

在这里插入图片描述

随机森林的实现步骤就和上面 Bagging 的步骤差不多,通过多个决策树分类得到的结果来投票获得最终的预测值。

实现过程出现的问题以及解决方式

实现方式是利用C++去实现,目前实现了ID3决策树算法的大部分代码,不过测试还有点小问题,正在更改,同时需要考虑数据的特性,目前只实现了基于离散属性的决策树,在这个过程中需要结合该框架下的基础类进行编码,因此需要添加很多未存在的方法,感觉会使代码比较臃肿,比如 DoubleMatrix 类,因此有些方法还是放在了当前实现的类中以单独使用。

下周目标以及待完善的工作

继续完善随机森林的代码,实现基于连续属性的决策树,比如 C4.5决策树。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值