概述
随机森林算法及其实现
算法理解
随机森林就是通过集成学习的思想将多棵决策树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(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)随机森林算法及其实现下周目标以及待完善的工作的全部内容,希望文章能够帮你解决随机森林算法及其实现(1)随机森林算法及其实现下周目标以及待完善的工作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复