使用随机森林作为 adaboost 的基本分类器

问题描述

我可以将 AdaBoost 与随机森林一起用作基本分类器吗?我在互联网上搜索,我没有找到任何人这样做。

就像下面的代码;我尝试运行它,但需要很多时间:

estimators = Pipeline([('vectorizer',CountVectorizer()),('transformer',TfidfTransformer()),('classifier',AdaBoostClassifier(learning_rate=1))])

RF=RandomForestClassifier(criterion='entropy',n_estimators=100,max_depth=500,min_samples_split=100,max_leaf_nodes=None,max_features='log2')


param_grid={
    'vectorizer__ngram_range': [(1,2),(1,3)],'vectorizer__min_df': [5],'vectorizer__max_df': [0.7],'vectorizer__max_features': [1500],'transformer__use_idf': [True,False],'transformer__norm': ('l1','l2'),'transformer__smooth_idf': [True,'transformer__sublinear_tf': [True,'classifier__base_estimator':[RF],'classifier__algorithm': ("SAMME.R","SAMME"),'classifier__n_estimators':[4,7,11,13,16,19,22,25,28,31,34,43,50]
}

我尝试使用 gridsearchcv,将 RF 分类添加到 AdaBoost 参数中。 如果我使用它会提高准确性吗?

解决方法

简答: 这不是不可能的。 我不知道这样做理论上有没有问题,但我试过一次,准确率提高了。

长答案:

我在具有 n 行 p 实值特征和长度为 n 的标签列表的典型数据集上进行了尝试。如果重要,它们是通过 DeepWalk 算法获得的图中节点的嵌入,并且节点被分为两类。我使用 5 折交叉验证对这些数据训练了一些分类模型,并测量了它们的常用评估指标(精度、召回率、AUC 等)。我使用的模型是 SVM、逻辑回归、随机森林、2 层感知器和带有随机森林分类器的 Adaboost。最后一个模型,带有随机森林分类器的 Adaboost,产生了最好的结果(95% 的 AUC 与多层感知器的 89% 和随机森林的 88% 相比)。当然,现在运行时间增加了 100 倍,但它仍然是大约 20 分钟,所以这对我来说不是限制。

这就是我的想法:首先,我正在使用交叉验证,因此可能不会出现过拟合的情况。其次,两者都是集成学习方法,但随机森林是一种装袋方法,而 Adaboost 是一种增强技术。也许它们仍然有足够的不同,以至于它们的组合才有意义?

,

难怪您实际上没有看到有人这样做 - 这是一个荒谬而糟糕的主意。

您正在尝试构建一个集成 (Adaboost),它本身由集成基分类器 (RF) 组成——本质上是一个“集成平方”;所以,难怪计算时间长。

但即使它是实用的,也有很好的理论上理由不这样做;引用我自己在 Execution time of AdaBoost with SVM base classifier 中的回答:

Adaboost(和类似的集成方法)是使用决策树作为基本分类器(更具体地说,决策树桩,即深度仅为 1 的 DT)构思的;今天仍然有充分的理由,如果您没有明确指定 base_classifier 参数,它会假定值为 DecisionTreeClassifier(max_depth=1)。 DTs 适用于这种集成,因为它们本质上是不稳定分类器,而 SVM 并非如此,因此当用作基分类器时,预计后者不会提供太多。

最重要的是,SVM 在计算上比决策树(更不用说决策树桩)要昂贵得多,这就是您观察到的处理时间长的原因。

这个论点也适用于 RFs - 它们不是不稳定分类器,因此在将它们用作增强算法(如 Adaboost)的基本分类器时,没有任何理由实际期望性能改进。 >