机器学习06-随机森林-python

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

一. 原理推导

0. 随机含义

  1. 样本随机
  2. 特征随机

1. 分类

决策时的是cart分类树
分裂的准则就是gini最小化

2. 回归

决策树是cart回归树
分裂的准则就是方差或标准差

3. 特征重要性

  1. 方法一: 根据oob数据计算原始错误率 err1,对特征加入随机噪声(可以直接随机改变特征值),计算错误率err2 ,特征重要性 ∑(err2-err1)/ nTrees
  2. 方法二:特征作为分裂条件的分支的gini指数之和就是重要性比例

二. 手把手实现

github完整程序

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_

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值