欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

03-集成算法总结

程序员文章站 2022-03-06 21:21:34
...

集成算法总结

bagging:并行式集成学习方法最著名的代表,基于自助采样法

自助抽样法:即可重复采样或者有放回的采样。我们这样采样的目的是减少训练样本规模不同造成的影响,同时还能比较高效地进行试验估计。适用于初始数据集较小,难以有效划分我们的训练集和测试集时的场景。

随机森林算法

1、定义及背景:由于单个决策树通常表现出较高的方差并且倾向于过度拟合,所以随机森林通过在分类器构造中引入随机性来创建多样化的分类器集。集合的预测作为各个分类器的平均预测给出。通俗的讲就是一次采样一颗树,多次采样多棵树,构成一片森林,多个分类器共同决定,即当有一个test时,代入所有的决策树,共同决策。

2、具体的使用

from sklearn.ensemble import RandomForestClassifier,ExtraTreesClassifier
score = 0 
for i in range(100):
    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2)
    
    clf = RandomForestClassifier(n_estimators=100) #参数很多,详情见官网文档或者函数说明文档

    clf.fit(X_train,y_train)

    score+=clf.score(X_test,y_test)/100
    
print('随机森林多次运行准确率:',score)

随机森林多次运行准确率: 0.9808333333333332

3、特点

  • 在随机森林中,默认情况下使用引导程序样本(bootstrap=True),即自助法抽样。统称扰动组合技术

重点记忆部分

  • 官方文档(随机森林及集成方法)sklearn链接

  • 随机化森林原理

    • 该sklearn.ensemble模块包括两种基于随机决策树的平均算法:RandomForest算法和Extra-Trees方法。两种算法都是专门为树木设计的扰动组合技术[B1998]。这意味着通过在分类器构造中引入随机性来创建多样化的分类器集。集合的预测作为各个分类器的平均预测给出。
    • 与其他分类器一样,森林分类器必须配备两个数组:一个大小稀疏或密集的数组X,用于存放训练样本;一个大小Y的数组Y,用于存放训练样本的目标值(类别标签):[n_samples, n_features] [n_samples]
  • 随机森林

    • 在随机森林(请参阅RandomForestClassifierRandomForestRegressor类)中,集合中的每棵树都是根据训练集中的替换样本(即引导样本)构建的。
    • 此外,在树的构造过程中拆分每个节点时,可以从所有候选特征的随机子集中找到最佳拆分属性及阈值 max_features。(有关更多详细信息,请参见参数调整准则)。
    • 这两个随机性来源的目的是减少森林估计量的方差。实际上,单个决策树通常表现出较高的方差并且倾向于过度拟合。森林中注入的随机性产生决策树,其预测误差有些解耦。通过取这些预测的平均值,可以消除一些误差。随机森林通过组合不同的树木来减少变化,有时会以略微增加偏差为代价。在实践中,方差减小通常很明显,因此产生了总体上更好的模型。
    • 与原始出版物[B2001]相比,scikit-learn实现通过平均分类器的概率预测来组合分类器,而不是让每个分类器对单个分类投票。

极限森林

1、定义: 在高度随机化的树中,随机性在计算分割的方式上进一步向前迈进了一步。像随机森林中一样,使用候选特征的随机子集,但不是寻找最有区别的阈值,而是为每个候选特征随机绘制阈值,并选择这些随机生成的阈值中的最佳阈值作为划分规则。这通常可以更大程度地减少模型的方差,但要以更大的偏差增加为代价

2、特点

  • 样本随机 、分裂条件随机
  • 极限森林分类器( ExtraTreesClassifier ) 默认策略是使用整个数据集(bootstrap=False)。当使用自举抽样(自助法抽样)时,可以对遗漏的样本或袋中样本进行概括精度估计。 (扰动组合技术)

3、相关代码

from sklearn.ensemble import ExtraTreesClassifier

from sklearn.model_selection import cross_val_score #交叉验证

clf = DecisionTreeClassifier()
cross_val_score(clf,X,y,cv = 6,scoring='accuracy').mean()

0.9521604938271605