Уроки Kaggle: сравнивайте алгоритмы ансамблей с точки зрения точности модели, надежности и обобщения. Реализация включена!

Вступление

Мы ранее обсуждали некоторые из распространенных способов использования возможностей прогнозирования моделей машинного обучения (ML). Эти методы в основном используются для улучшения обобщаемости модели путем разделения данных на конкретные схемы.

Однако существуют более продвинутые методы повышения производительности моделей, такие как ансамблевые алгоритмы. В этом посте мы обсудим и сравним производительность нескольких ансамблевых алгоритмов. Итак, приступим!

Метод ансамбля нацелен на объединение прогнозов нескольких базовых оценок вместо одной оценки, которые усиливают обобщение и надежность модели.

Обновление 13.02.2021: включите ссылку на класс StackingClassifier () в модуль sklearn.ensemble.

Предварительные условия

  1. Я буду использовать набор данных игрушек из публичного репозитория UCIML, который размещен на Kaggle; Он состоит из девяти столбцов, включая целевую переменную. Блокнот размещен на GitHub, если вы хотите продолжить.
  2. Я использовал Kaggle API для получения набора данных во время работы с записной книжкой. Если у вас нет учетной записи на Kaggle, просто загрузите набор данных на свой локальный компьютер и пропустите эту часть в записной книжке. Вы можете следить за этой публикацией в StackOverflow for step-by-step инструкциях.

Я включил сценарий для получения и загрузки данных в Google Colab, просто убедитесь, что вы создали свой собственный токен перед его запуском.

3. Я выполнил базовую предварительную обработку набора данных перед построением модели - например, ввел недостающие данные, чтобы избежать ошибок.

4. Я создал две отдельные тетради, одну для сравнения первых трех ансамблей. Второй - реализация стекированного ансамбля с нуля и с использованием библиотеки MLens.

Методы ансамблей

Ансамбли - это процедуры, которые создают различные модели, а затем смешивают их для получения улучшенных прогнозов. Ансамбли позволяют получать более точные прогнозы по сравнению с одной моделью. Использование ансамблей обычно давало преимущество командам-победителям в соревнованиях по ML. Вы можете найти интервью победителей CrowdFlower - Team Quartet, которые использовали Ensemble для победы в конкурсе.

1. Бэггинг - агрегирование начальной загрузки:

B ootstrap agg regat ing имеет тенденцию создавать несколько моделей (с использованием одного и того же типа алгоритмов) из разных подвыборок с заменой из набора обучающих данных.

Бэггинг заключается в объединении нескольких хороших моделей, чтобы уменьшить дисперсию модели.

Бэггинг имеет три типа ансамблей:

1.2 Деревья решений по упаковке

Бэггинг лучше всего работает с алгоритмами, которые производят прогнозы с высокой дисперсией. В следующем примере мы разработаем BaggingClassifier () в сочетании с DecisionTreeClassifier () в библиотеке sklearn.

Обратите внимание, что результаты могут отличаться из-за природы стохастического обучения!

Бэггинг производит модели и параллельно разделяет образцы.

from sklearn.ensemble import BaggingClassifier
tree = DecisionTreeClassifier()
bagging_clf = BaggingClassifier(base_estimator=tree, n_estimators=1500, random_state=42)
bagging_clf.fit(X_train, y_train)

evaluate(bagging_clf, X_train, X_test, y_train, y_test)
TRAINIG RESULTS: 
===============================
CONFUSION MATRIX:
[[350   0]
 [  0 187]]
ACCURACY SCORE:
1.0000
CLASSIFICATION REPORT:
               0      1  accuracy  macro avg  weighted avg
precision    1.0    1.0       1.0        1.0           1.0
recall       1.0    1.0       1.0        1.0           1.0
f1-score     1.0    1.0       1.0        1.0           1.0
support    350.0  187.0       1.0      537.0         537.0
TESTING RESULTS: 
===============================
CONFUSION MATRIX:
[[126  24]
 [ 38  43]]
ACCURACY SCORE:
0.7316
CLASSIFICATION REPORT:
                    0          1  accuracy   macro avg  weighted avg
precision    0.768293   0.641791  0.731602    0.705042      0.723935
recall       0.840000   0.530864  0.731602    0.685432      0.731602
f1-score     0.802548   0.581081  0.731602    0.691814      0.724891
support    150.000000  81.000000  0.731602  231.000000    231.000000

1.2 Случайный лес (РФ)

Случайный лес (RF) - это метаоценка, которая соответствует различным классификаторам дерева решений на нескольких подвыборках и оценивает среднюю точность.

Размер подвыборки является постоянным, но образцы рисуются с заменой, если bootstrap = True (по умолчанию).

Теперь давайте сделаем снимок и попробуем модель случайного леса (RF). RF работает как класс дерева решений в пакетах; однако это снижает корреляцию между отдельными классификаторами. RF учитывает только случайное подмножество функций на разбиение вместо того, чтобы следовать жадному подходу к выбору наилучшей точки разделения.

from sklearn.ensemble import RandomForestClassifier

rf_clf = RandomForestClassifier(random_state=42, n_estimators=1000)
rf_clf.fit(X_train, y_train)
evaluate(rf_clf, X_train, X_test, y_train, y_test)
TRAINIG RESULTS: 
===============================
CONFUSION MATRIX:
[[350   0]
 [  0 187]]
ACCURACY SCORE:
1.0000
CLASSIFICATION REPORT:
               0      1  accuracy  macro avg  weighted avg
precision    1.0    1.0       1.0        1.0           1.0
recall       1.0    1.0       1.0        1.0           1.0
f1-score     1.0    1.0       1.0        1.0           1.0
support    350.0  187.0       1.0      537.0         537.0
TESTING RESULTS: 
===============================
CONFUSION MATRIX:
[[127  23]
 [ 38  43]]
ACCURACY SCORE:
0.7359
CLASSIFICATION REPORT:
                    0          1  accuracy   macro avg  weighted avg
precision    0.769697   0.651515  0.735931    0.710606      0.728257
recall       0.846667   0.530864  0.735931    0.688765      0.735931
f1-score     0.806349   0.585034  0.735931    0.695692      0.728745
support    150.000000  81.000000  0.735931  231.000000    231.000000

1.3 Дополнительные деревья - ET

Extra Trees (ET) - это модификация мешков. ExtraTreesClassifier () - это класс из библиотеки sklearn, который создает мета-оценку для соответствия нескольким рандомизированным деревьям решений (также известным как ET) различных подвыборок. Затем ET вычисляет средний прогноз среди подвыборок. Это позволяет повысить точность модели и контролировать переоснащение.

from sklearn.ensemble import ExtraTreesClassifier

ex_tree_clf = ExtraTreesClassifier(n_estimators=1000, max_features=7, random_state=42)
ex_tree_clf.fit(X_train, y_train)
evaluate(ex_tree_clf, X_train, X_test, y_train, y_test)
TRAINIG RESULTS: 
===============================
CONFUSION MATRIX:
[[350   0]
 [  0 187]]
ACCURACY SCORE:
1.0000
CLASSIFICATION REPORT:
               0      1  accuracy  macro avg  weighted avg
precision    1.0    1.0       1.0        1.0           1.0
recall       1.0    1.0       1.0        1.0           1.0
f1-score     1.0    1.0       1.0        1.0           1.0
support    350.0  187.0       1.0      537.0         537.0
TESTING RESULTS: 
===============================
CONFUSION MATRIX:
[[124  26]
 [ 32  49]]
ACCURACY SCORE:
0.7489
CLASSIFICATION REPORT:
                    0          1  accuracy   macro avg  weighted avg
precision    0.794872   0.653333  0.748918    0.724103      0.745241
recall       0.826667   0.604938  0.748918    0.715802      0.748918
f1-score     0.810458   0.628205  0.748918    0.719331      0.746551
support    150.000000  81.000000  0.748918  231.000000    231.000000

2. Повышение

Повышение - это еще один метод построения нескольких моделей (также из одного и того же типа); однако каждая модель учится исправлять ошибки прогнозирования предыдущей модели во всей последовательности моделей. Повышение в первую очередь используется для уравновешивания смещения и дисперсии в моделях контролируемого машинного обучения. Boosting - это алгоритм, который превращает слабых учеников в сильных.

Повышение позволяет построить базовый оценщик последовательно из слабых, а затем уменьшить смещение комбинированных оценщиков.

2.1 AdaBoost (AD)

AdaBoost (AD) взвешивает экземпляры набора данных, классифицируя функции. Это позволяет алгоритму учитывать эти особенности при построении последующей модели.

from sklearn.ensemble import AdaBoostClassifier

ada_boost_clf = AdaBoostClassifier(n_estimators=30)
ada_boost_clf.fit(X_train, y_train)
evaluate(ada_boost_clf, X_train, X_test, y_train, y_test)
TRAINIG RESULTS: 
===============================
CONFUSION MATRIX:
[[314  36]
 [ 49 138]]
ACCURACY SCORE:
0.8417
CLASSIFICATION REPORT:
                    0           1  accuracy   macro avg  weighted avg
precision    0.865014    0.793103  0.841713    0.829059  0.839972
recall       0.897143    0.737968  0.841713    0.817555  0.841713
f1-score     0.880785    0.764543  0.841713    0.822664  0.840306
support    350.000000  187.000000  0.841713  537.000000  537.000000
TESTING RESULTS: 
===============================
CONFUSION MATRIX:
[[129  21]
 [ 36  45]]
ACCURACY SCORE:
0.7532
CLASSIFICATION REPORT:
                    0          1  accuracy   macro avg  weighted avg
precision    0.781818   0.681818  0.753247    0.731818      0.746753
recall       0.860000   0.555556  0.753247    0.707778      0.753247
f1-score     0.819048   0.612245  0.753247    0.715646      0.746532
support    150.000000  81.000000  0.753247  231.000000    231.000000

2.2 Стохастическое повышение градиента (SGB)

Стохастическое градиентное усиление (SGB) - один из передовых алгоритмов ансамбля. На каждой итерации SGB случайным образом отбирает подвыборку из обучающего набора (без замены). Затем подвыборка используется для соответствия базовой модели (учащийся) до тех пор, пока ошибка не станет стабильной.

from sklearn.ensemble import GradientBoostingClassifier

grad_boost_clf = GradientBoostingClassifier(n_estimators=100, random_state=42)
grad_boost_clf.fit(X_train, y_train)
evaluate(grad_boost_clf, X_train, X_test, y_train, y_test)
TRAINIG RESULTS: 
===============================
CONFUSION MATRIX:
[[339  11]
 [ 26 161]]
ACCURACY SCORE:
0.9311
CLASSIFICATION REPORT:
                    0           1  accuracy   macro avg  weighted avg
precision    0.928767    0.936047  0.931099    0.932407  0.931302
recall       0.968571    0.860963  0.931099    0.914767  0.931099
f1-score     0.948252    0.896936  0.931099    0.922594  0.930382
support    350.000000  187.000000  0.931099  537.000000  537.000000
TESTING RESULTS: 
===============================
CONFUSION MATRIX:
[[126  24]
 [ 37  44]]
ACCURACY SCORE:
0.7359
CLASSIFICATION REPORT:
                    0          1  accuracy   macro avg  weighted avg
precision    0.773006   0.647059  0.735931    0.710032      0.728843
recall       0.840000   0.543210  0.735931    0.691605      0.735931
f1-score     0.805112   0.590604  0.735931    0.697858      0.729895
support    150.000000  81.000000  0.735931  231.000000    231.000000

3. Голосование

Голосование - это набор одинаково эффективных моделей, позволяющих уравновесить их слабые стороны. Голосование использует три подхода к процедуре голосования: жесткий, мягкий и взвешенный.

  1. Жесткое голосование - предсказывает большинство ярлыков класса.
  2. Мягкое голосование - argmax суммы прогнозируемых вероятностей.
  3. Взвешенное голосование - argmax взвешенной суммы прогнозируемых вероятностей.

Голосование просто и легко реализуемо. Во-первых, он создает две автономные модели (в зависимости от варианта использования может быть больше) из набора данных. Затем используется классификатор голосования для обертывания моделей и усреднения прогнозов подмоделей при введении новых данных.

from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC

estimators = []
log_reg = LogisticRegression(solver='liblinear')
estimators.append(('Logistic', log_reg))

tree = DecisionTreeClassifier()
estimators.append(('Tree', tree))

svm_clf = SVC(gamma='scale')
estimators.append(('SVM', svm_clf))

voting = VotingClassifier(estimators=estimators)
voting.fit(X_train, y_train)

evaluate(voting, X_train, X_test, y_train, y_test)
TRAINIG RESULTS: 
===============================
CONFUSION MATRIX:
[[328  22]
 [ 75 112]]
ACCURACY SCORE:
0.8194
CLASSIFICATION REPORT:
                    0           1  accuracy   macro avg  weighted avg
precision    0.813896    0.835821  0.819367    0.824858  0.821531
recall       0.937143    0.598930  0.819367    0.768037  0.819367
f1-score     0.871182    0.697819  0.819367    0.784501  0.810812
support    350.000000  187.000000  0.819367  537.000000  537.000000
TESTING RESULTS: 
===============================
CONFUSION MATRIX:
[[135  15]
 [ 40  41]]
ACCURACY SCORE:
0.7619
CLASSIFICATION REPORT:
                    0          1  accuracy   macro avg  weighted avg
precision    0.771429   0.732143  0.761905    0.751786      0.757653
recall       0.900000   0.506173  0.761905    0.703086      0.761905
f1-score     0.830769   0.598540  0.761905    0.714655      0.749338
support    150.000000  81.000000  0.761905  231.000000    231.000000

4. Укладка

Укладка работает по тому же принципу, что и ансамбль для голосования. Однако стекинг может контролировать возможность настройки прогнозов подмоделей последовательно - в качестве входных данных для метамодели для повышения производительности. Другими словами, суммирование генерирует прогнозы на основе алгоритма каждой модели; впоследствии метамодель использует эти прогнозы в качестве входных данных (весов) для создания окончательных выходных данных.

Преимущество стекирования заключается в том, что он может объединять разных сильных учеников и делать точные и надежные прогнозы, чем любая отдельная модель.

В библиотеке sklearn есть StackingClassifier () под модулем ансамбля, вы можете найти ссылку здесь. Однако я буду реализовывать ансамбль стекирования с помощью библиотеки ML-Ensemble.

Чтобы провести честное сравнение между наложением и предыдущими ансамблями, я пересчитал предыдущую точность, используя кратность 10.

from mlens.ensemble import SuperLearner
# create a list of base-models
def get_models():
	models = list()
	models.append(LogisticRegression(solver='liblinear'))
	models.append(DecisionTreeClassifier())
	models.append(SVC(gamma='scale', probability=True))
	models.append(GaussianNB())
	models.append(KNeighborsClassifier())
	models.append(AdaBoostClassifier())
	models.append(BaggingClassifier(n_estimators=10))
	models.append(RandomForestClassifier(n_estimators=10))
	models.append(ExtraTreesClassifier(n_estimators=10))
	return models
def get_super_learner(X):
  ensemble = SuperLearner(scorer=accuracy_score, 
                          folds = 10, 
                          random_state=41)
  model = get_models()
  ensemble.add(model)
# add some layers to the ensemble structure
  ensemble.add([LogisticRegression(), RandomForestClassifier()])
  ensemble.add([LogisticRegression(), SVC()])
# add meta model
  ensemble.add_meta(SVC())
  return ensemble
# create the super learner
ensemble = get_super_learner(X_train)
# fit the super learner
ensemble.fit(X_train, y_train)
# summarize base learners
print(ensemble.data)
# make predictions on hold out set
yhat = ensemble.predict(X_test)
print('Super Learner: %.3f' % (accuracy_score(y_test, yhat) * 100))

ACCURACY SCORE ON TRAIN: 83.24022346368714   
ACCURACY SCORE ON TEST: 76.62337662337663

Сравните производительность

import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Bar(
              x = test['Algo'],
              y = test['Train'],
              text = test['Train'],
              textposition='auto',
              name = 'Accuracy on Train set',
              marker_color = 'indianred'))
fig.add_trace(go.Bar(
              x = test['Algo'],
              y = test['Test'],
              text = test['Test'],
              textposition='auto',
              name = 'Accuracy on Test set',
              marker_color = 'lightsalmon'))
fig.update_traces(texttemplate='%{text:.2f}')
fig.update_layout(title_text='Comprehensive comparasion between ensembles on Train and Test set')
fig.show()

Как показано, составной ансамбль отлично показал себя на тестовой выборке, при этом наивысшая точность классификации составляет 76,623%. Большой!

4. Выводы и выводы

Мы изучили несколько типов ансамблей и научились правильно их применять, чтобы расширить предсказательную силу модели. Мы также пришли к выводу о некоторых важных моментах, которые следует учитывать:

  1. Стекинг показал повышение точности, надежности и лучшего обобщения.
  2. Мы можем использовать голосование в тех случаях, когда мы хотим установить одинаково эффективные модели, чтобы уравновесить их слабые стороны.
  3. Бустинг - отличный ансамбль; Он просто объединяет несколько слабых учеников, чтобы получить более сильного.
  4. Вы можете рассмотреть возможность использования бэггинга, если хотите создать модель с меньшими отклонениями, комбинируя разные хорошие модели - уменьшите переоснащение.
  5. Выбор подходящего ансамбля зависит от бизнес-задачи и желаемого результата.

Наконец, я хотел бы, чтобы это дало исчерпывающее руководство по реализации ансамблей и получению от них максимальной отдачи. Если вы столкнулись с какими-либо проблемами, перечислите их в разделе комментариев; Буду рад помочь. Лучший способ воодушевить меня - это подписаться на меня в Medium, LinkedIn, или Github. Удачного обучения!