一. 原理推导
0. 随机含义
- 样本随机
- 特征随机
1. 分类
决策时的是cart分类树
分裂的准则就是gini最小化
2. 回归
决策树是cart回归树
分裂的准则就是方差或标准差
3. 特征重要性
- 方法一: 根据oob数据计算原始错误率 err1,对特征加入随机噪声(可以直接随机改变特征值),计算错误率err2 ,特征重要性 ∑(err2-err1)/ nTrees
- 方法二:特征作为分裂条件的分支的gini指数之和就是重要性比例
二. 手把手实现
1. 数据抽样—数据集抽样+列抽样
def getSubDataSet(dataSet ,feaNames , numFeat, ratio = 1.0):
'''
para:
dataSet 数据集
ratio 抽样比例
return:
抽样之后的数据集
'''
subData = []
length = round(len(dataSet) * ratio)
while len(subData) < length:
index = random.randrange(len(dataSet))
subData.append(dataSet[index])
lengthCol = len(dataSet[0])
# 随机抽取特征列索引
indexSet = set()
if numFeat is not None:
if numFeat <= lengthCol - 1:
while len(indexSet) != numFeat:
indexSet.add(random.randrange(lengthCol-1))
subFeaNames = []
dataMat = np.mat(dataSet)
feaMat = np.mat(feaNames)
m , n = dataMat.shape
index = list(indexSet)
index = sorted(index)
subFeaNames = feaMat[ : , index].tolist()
index.append(-1)
retMat = dataMat[: , index]
subData = retMat.tolist()
return subData ,subFeaNames[0]
2. 创建随机森林
def createRandomForest(dataSet ,feaNames , numTree ,numFeat =None, ratio =1 , depth =-1, leafSize =1):
'''
'''
subDataSets = []
subFeaNames = []
for i in range(numTree):
subData ,subFeaNames= getSubDataSet(dataSet ,feaNames ,numFeat , ratio)
subDataSets.append(subData)
allTree = []
for subData in subDataSets:
myTree = bt.buildTree(subData ,subFeaNames ,None , depth , leafSize)
allTree.append(myTree)
return allTree
三. sklearn实现
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
X , y = make_classification(n_samples=1000 , n_features=4,
n_informative=2 , n_redundant=0,
random_state=0 , shuffle=False )
clf = RandomForestClassifier(n_estimators=100 , max_depth=2 ,
random_state=0, oob_score=True)
clf.fit(X, y)
# 这里是输出每个特征重要比例 ,这里从侧面也可以理解生成的数据
print clf.feature_importances_
print clf.predict_proba([[0,0,0,0]])
oob = clf.oob_score_
print clf.oob_decision_function_

本文深入解析随机森林算法的原理,包括决策树的分类与回归、特征重要性的计算方法,以及如何通过数据抽样和列抽样创建随机森林。同时,提供了Python代码实现,并展示了使用sklearn库进行随机森林分类器训练的过程。
2万+

被折叠的 条评论
为什么被折叠?



