Анализируя ошибки (ошибочные классификации) sklearn.ensemble.AdaBoostClassifier, используя в качестве базовых оценок заглушки DecisionTreeClassifier, я обнаружил, что в ансамбле большое количество дублированных оценок. Типично ли иметь такое количество избыточности? Подробности ниже.
Информация о версии
питон: 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 оценки в ансамбле алгоритм повышения выбрал 71 из оценок, которые должны быть основаны на delta_win_pct. Как примечание, процент оценок 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](https://i.stack.imgur.com/QIatM.png)
На графике показаны уникальные 27 значений пороговых значений, используемые для разделения функции delta_win_pct в ансамбле оценок, в диапазоне от -25,1% до 22,2%.
Проблема в том, что 71-27 = 44, или 61,98% заглушек дерева 'delta_win_pct', используют повторяющиеся пороговые значения, содержащиеся на графике.
Разве это не неэффективно? Разве весы оценщика не должны отражать вклад оценщиков в классификатор, а не полагаться на дублирующие оценки для получения большего количества голосов?
Должен ли алгоритм гарантировать, что для одинаковых оценок на основе признаков не выбраны повторяющиеся пороговые значения?
С 71 оценщиком, используемым для функции delta_win_pct и исключающим дублирующиеся пороговые значения, разбиения могут происходить через гораздо большее количество интервалов, что обеспечивает более высокую степень детализации при выделении функции. Или, если более тонкая гранулярность не помогает в создании заглушки дерева решений, то удаление дублирующих значений уменьшит размер ансамбля.
Правильно ли это мышление?
Пытались ли другие практикующие минимизировать дублирование оценок в ансамбле?
Обновление 1/29/2019
Количество дублированных оценок, безусловно, зависит от количества запрашиваемых оценок и от того, как пень функции дерева решений можно разделить с помощью Entropy или Gini. Разделение прутка объекта выполняется независимо от других пней в лесу, так как не поддерживается список предыдущих порогов для определенного пня объекта. По-видимому, пороговые значения определяются исключительно алгоритмом расщепления.
Эмпирически я обнаружил, что большое количество дублированных заглушек деревьев указывает на то, что требуется слишком много оценок. Просто уменьшая запрошенные оценки, дубликаты уменьшаются без потери предсказательной силы алгоритма.