随机森林是一个包含多个决策树的分类器,该分类器的输出结果是由所有决策树输出结果的众数而定,
每个决策树都生长于一个被称为bootstrap样本的训练数据集之上,所谓“bootstrap样本”的构造原理为:
对于容量为n原始训练数据,采取重复抽样的方式抽样n次,形成一组新的训练数据,被称为原始数据
的一个bootstrap样本。在bootstrap样本上构造决策树的原理与传统的构造决策树的方法大致相同,但也
存在一些差别,不同之处在于:在对非叶节点分裂时,需要从所有的m个属性中随机地选取p个属性
(一般建议取p的值为m的平方根),再从这p个属性中选取最佳分裂属性以及相应的最佳分裂阀值,在该
bootstrap样本上最终生成的决策树不需要剪枝。在原始训练数据上生成多个bootstrap样本,利用上述
方法就会得到多颗完全生长的决策树,因为取样过程以及变量选取过程都是随机的,因此被形象地称为
随机森林。
算法的为代码如下:
本文利用Python语言实现随机森林算法,构建的每颗决策树都基于CART算法,所有代码都位于一个文件
randomforests.py中,
- from __future__ import division
- import numpy as np
- import math
- class node:
- def __init__(self, col=-1, value=None, results=None, trueBranch=None, falseBranch=None):
- self.col = col
- self.value = value
- self.results = results
- self.trueBranch = trueBranch
- self.falseBranch = falseBranch
- def getLabel(self):
- if self.results == None:
- return None
- else:
- max_counts = 0
- for key in self.results.keys():
- if self.results[key] > max_counts:
- label = key
- max_counts = self.results[key]
- return label
- class RandomForestsClassifier:
- def __init__(self, n_bootstrapSamples=20):
- self.n_bootstrapSamples = n_bootstrapSamples
- self.list_tree = []
- def divideSet(self, samples, column, value):
- splitFunction = None
- if isinstance(value,int) or isinstance(value,float):
- splitFunction = lambda row: row[column] >= value
- else:
- splitFunction = lambda row: row[column] == value
- set1 = [row for row in samples if splitFunction(row)]
- set2 = [row for row in