阿飞飞飞

学而时习之

导航

机器学习——随机森林和极限森林

随机森林

  在机器学习中,随机森林是一个包含多个决策树的分类器,其中每个决策树之间互不关联,其输出的类别是由个别树输出的类别的众数而定。

算法步骤:

  对于N个训练样例,有M个特征,对于每一个决策树来说,都选取m个特征数目,其远远小于M,用来确定每一个决策树上一个节点的决策结果,从训练样例上有放回抽样,形成一个多决策树的训练集,对于每一个决策树都计算出其最佳的分裂方式,最终合并成一个结果。

 

优点:

1. 可以用来解决分类和回归问题:随机森林可以同时处理分类和数值特征。
2. 抗过拟合能力:通过平均决策树,降低过拟合的风险性。
3. 只有在半数以上的基分类器出现差错时才会做出错误的预测:随机森林非常稳定,即使数据集中出现了一个新的数据点,整个算法也不会受到过多影响,它只会影响到一颗决策树,很难对所有决策树产生影响。
4. 能够处理很高维度的数据,并且不用做特征选择(特征列采样)
5. 对于不平衡的分类资料集来说,它可以平衡误差
 
缺点:
1. 比决策树算法更复杂,计算成本更高。
2. 由于其本身的复杂性,它们比其他类似的算法需要更多的时间来训练。
 
极限森林
  极限森林和随机森林类似,但是在每一个决策树的采样上不同,RF是随机采取训练样例的部分数据,而极限森林中每一个决策树都采用原始训练集;同时,RF在每一个决策树上,都会选取最优特征值划分点,而极限森林会随机选取一个特征值来进行划分。
 
决策树&随机森林&极限森林 代码对比:
import sklearn.datasets as dt
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier,ExtraTreesClassifier    #随机森林 极限森林
from sklearn.model_selection import train_test_split,cross_val_score
import time
import re

if __name__ == '__main__':
    datas=dt.load_iris(return_X_y=True)
    train,test=datas[0],datas[1]
    # print(train)
    # print(test)
    print()
    x_data,x_test,y_target,y_real=train_test_split(train,test,test_size=0.2,random_state=1024)  #random_state 随机种子
    #print(x_data)
    #print(y_target)

    #决策树
    t1 = float(re.findall('^\d{13}', str(time.time()).replace('.', ''))[0])
    dtc=DecisionTreeClassifier(criterion='entropy')
    print(cross_val_score(dtc,x_data,y_target,cv=10).mean())
    t_dtc = float(re.findall('^\d{13}', str(time.time()).replace('.', ''))[0])-float(t1)
    print(t_dtc)
    print('----------------')

    #随机森林
    t2 = float(re.findall('^\d{13}', str(time.time()).replace('.', ''))[0])
    rfc=RandomForestClassifier(n_estimators=128,criterion='entropy')
    print(cross_val_score(rfc,x_data,y_target,cv=10).mean())
    t_rfc = float(re.findall('^\d{13}', str(time.time()).replace('.', ''))[0])-float(t2)
    print(t_rfc)
    print('----------------')

    #极限森林
    t3 = float(re.findall('^\d{13}', str(time.time()).replace('.', ''))[0])
    etc=ExtraTreesClassifier(n_estimators=128,criterion='entropy')
    print(cross_val_score(etc,x_data,y_target,cv=10).mean())
    t_etc = float(re.findall('^\d{13}', str(time.time()).replace('.', ''))[0])-float(t3)
    print(t_etc)

#结果如下:
0.925
12.0
----------------
0.95
1571.0
----------------
0.95
1074.0

 可以看出随机森林和极限森林的精确度高于决策树,但是其计算消耗时间是远远大于决策树的。

posted on 2020-11-07 20:15  阿飞飞飞  阅读(717)  评论(0编辑  收藏  举报