赞
踩
随机森林就是通过集成学习的思想将多棵决策树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法。
这里随机的意思涉及到了另一个思想,也就是 Bagging 思想。
Bagging 是 bootstrap aggregating 的简写,又称为装袋算法,是一种有放回的抽样方法,目的是为了得到统计量的分布以及置信区间,该算法可与其它分类、回归算法结合,提高其准确率、稳定形的同时,通过降低结果的方差,避免过拟合的发生。具体的步骤如下:
随即森林就属于 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决策树。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。