sklearn.ensemble.AdaBoostClassifier是否应该依赖重复的估计量(弱学习者)?

时间:2019-01-13 22:39:51

标签: python scikit-learn decision-tree adaboost

在使用DecisionTreeClassifier存根作为基本估计量来分析sklearn.ensemble.AdaBoostClassifier的错误(错误分类)时,我发现集合中存在大量重复的估计量。具有这种数量的冗余通常吗?详细信息如下。

版本信息

python:3.6.5 sklearn版本:0.20.2

以下是使用GridSearchCV识别的估计数和学习率的设置。

    number_estimators = 501
    bdt= AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), 
    algorithm=algorithm_choice, n_estimators=number_estimators,
                   learning_rate = 1)

一些重要功能供参考:

    important_features = utils.display_important_features( bdt.feature_importances_, X_train)
    Coefficient Values
    delta_sos   0.14770459081836326
    delta_win_pct   0.14171656686626746
    delta_dol   0.06786427145708583
    delta_fg_pct   0.0658682634730539
    delta_col   0.06387225548902195
    ...

检查估算器:

    feature_dict={}
    threshold_dict = {}
    for stub_estimator in bdt.estimators_:
        stub_tree = stub_estimator.tree_
        stub_feature_index = stub_tree.feature[0]
        stub_feature = X_train.columns[stub_feature_index]
        if stub_feature in feature_dict:
           feature_dict[stub_feature] +=1
           threshold_dict[stub_feature].append(stub_tree.threshold[0])
        else:
           feature_dict[stub_feature] = 1
           threshold_dict[stub_feature] = []
           threshold_dict[stub_feature].append(stub_tree.threshold[0])

     feature_dict
     {'delta_srs': 31,
      'delta_win_pct': 71,
      'delta_sos': 74,
      'delta_sag': 13,
      'delta_dol': 34,
       ... }

让我们考虑一下“ delta_win_pct”功能。在集合中的501个估计器中,boosting算法已基于'delta_win_pct'选择了71个估计器。请注意,“ delta_win_pct”估计量的百分比71/501 = 14.17%,是与上述与分类器相关的重要要素属性相关的值。

在71个“ delta_win_pct”估计量中,阈值也收集在上面的代码块中,可以通过以下方式访问:

   delta_win_partitions = threshold_dict['delta_win_pct']
   delta_win_partitions = [i*100 for i in delta_win_partitions]
   df_win = pd.DataFrame(columns=['Delta_Win_Pct','Y'])
   df_win['Delta_Win_Pct'] = delta_win_partitions
   df_win['Y'] = 1
   df_win.sort_values(by='Delta_Win_Pct', inplace=True)

   print("Number of unique partitions= 
        ",df_win['Delta_Win_Pct'].unique().shape[0], " out of ", 
         df_win.shape[0], ' estimators')

   splot = sns.scatterplot(x='Delta_Win_Pct', y='Y', data=df_win)
   splot.figure.set_size_inches(20,6)
   splot.set_title('Partitions of Delta Win Percentage')  

   ------------
   Number of unique partitions=  27  out of  71  estimators

enter image description here

该图描绘了用于对估计器集合中的“ delta_win_pct”特征进行分区的唯一27个阈值,范围从-25.1%到22.2%。

问题是71-27 = 44,即61.98%的“ delta_win_pct”树桩使用重复的阈值。

这不是效率低下吗?估计量权重是否应该反映出估计量对分类器的贡献,而不应该依靠重复的估计量来获得更多投票?

该算法是否应确保没有为相同的基于特征的估计量选择重复的阈值?

通过将71个估算器用于“ delta_win_pct”功能并消除重复的阈值,可以以更多的间隔进行分区,从而在划分功能时产生更精细的粒度。或者,如果更精细的粒度对构建决策树存根没有帮助,那么消除重复值将减小整体大小。

这种想法正确吗?

其他从业者是否尝试过最小化集合中估计量的重复?


更新1/29/2019

重复的估算器的数量肯定由请求的估算器的数量以及如何通过熵或基尼拆分决策树特征树桩驱动。与森林中的其他树桩无关地执行特征树桩的拆分,因为不会保留特定特征树桩的先前阈值列表。阈值似乎完全由拆分算法确定。

根据经验,我发现大量重复的树桩会指示请求过多的估计量。通过简单地减少请求的估计量,可以减少重复项而不会损失算法的预测能力。

0 个答案:

没有答案