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

Здесь я использую данные Качество красного вина от Kaggle, чтобы продемонстрировать ансамблевые методы. Качество — наша целевая переменная. Единственная предварительная обработка, которую я делаю, — это переключение 10-балльной шкалы на 3 уровня классификации: 1, 2 и 3 представляют хороший, средний и плохой соответственно.

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
#import data
wine = pd.read_csv('winequality.csv')
#preprocess data
def getquality(x):
    if x > 6.5:
        return 1
    elif x < 4.5:
        return 3
    else:
        return 2
wine['quality'] = wine['quality'].apply(getquality)
#seperate features and target variable
x = wine.drop(['quality'], axis=1)
y = wine['quality']
#split into train and test data
xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.2, random_state=1)
#copy code to deal with SettingWithCopyWarn
xtrain = xtrain.copy()
xtest = xtest.copy()
ytrain = ytrain.copy()
ytest = ytest.copy()

Модель 1:

Оценка точности для DecisionTreeClassifier() по умолчанию составляет 0,815625.

from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
model.fit(xtrain, ytrain)
model_pred = model.predict(xtest)
#see prediction result
print('Accuracy Score: {0:6f}'.format(model.score(xtest, ytest)))

Бэгинг

Суть так называемой начальной агрегации состоит в том, чтобы обучить множество базовых моделей на случайных разных версиях обучающих данных. Каждая модель имеет один голос и обрабатывается одинаково, независимо от точности прогноза, затем предикторы объединяются для получения окончательного результата. В большинстве случаев дисперсия результата становится меньше после бэггинга. Например, Случайный лес — самая известная модель среди методов мешков, она сочетает в себе деревья решений с идеей мешков.

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

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

Модель 2:

Вместо создания классификатора случайного леса я использовал дерево решений с BaggingClassifier() и получил показатель точности 0,856250.

from sklearn.ensemble import BaggingClassifier
model = BaggingClassifier(base_estimator=clf, random_state=0)
model.fit(xtrain, ytrain)
model_pred = model.predict(xtest)
#see prediction result
print('Accuracy Score: {0:6f}'.format(model.score(xtest, ytest)))

Повышение

Самое существенное различие между бустингом и бэггингом заключается в том, что бустинг не рассматривает базовую модель единогласно, а выбирает «элиту» посредством непрерывного тестирования и проверки. Хорошо работающая модель имеет больший вес при голосовании, а неэффективная модель имеет меньшую мощность, тогда все голоса объединяются для получения окончательного результата. В большинстве случаев смещение результата становится меньше после бустинга. Например, Adaboost и повышение градиента являются наиболее часто используемыми моделями среди методов повышения.

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

В отличие от бэггинга, каждая модель прогнозирования может генерироваться только последовательно, поскольку для параметра последней модели требуется результат предыдущей модели. И после объединения моделей мы используем голосование большинства для проблемы классификации и усреднение для проблемы регрессии.

Модель 3:

GradientBoostingClassifier() дает нам оценку точности 0,846875, что также выше, чем без бустинга.

from sklearn.ensemble import GradientBoostingClassifier
model = GradientBoostingClassifier(random_state=0)
model.fit(xtrain, ytrain)
model_pred = model.predict(xtest)
#see prediction result
print(‘Accuracy Score: {0:6f}’.format(model.score(xtest, ytest)))

Укладка

Сравнительно просто усреднить или проголосовать за результаты базовой модели (слабый ученик), однако ошибка обучения может быть большой, поэтому создается метод обучения, суммирование. Вместо того, чтобы выполнять простую логическую обработку результатов модели, стратегия суммирования заключается в добавлении слоя вне модели.

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

Модель 4:

Оценка точности для StackingClassifier() составляет 0,875000. Хотя это не самый высокий показатель по сравнению с моделями уровня 1, он успешно повышает производительность дерева решений и KNN.

from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from mlxtend.classifier import StackingClassifier
#build two layer models using stacking
layer1 = [DecisionTreeClassifier(), KNeighborsClassifier(), RandomForestClassifier(random_state=0)]
layer2 = GradientBoostingClassifier(random_state=0)
model = StackingClassifier(classifiers=layer1, meta_classifier=layer2)
model.fit(xtrain, ytrain)
model_pred = model.predict(xtest)
#see prediction result
print(‘Accuracy Score: {0:6f}’.format(model.score(xtest, ytest)))

Вывод

Из матрицы путаницы мы узнаем, что средний уровень вина (вторая строка) действительно сложно предсказать для всех моделей. К этой категории относятся 14 записей, и только от 1 до 3 можно правильно предсказать. Однако плохой уровень вина (третья линия) выявить легче, большинство из них истинно положительные.

В этой статье мы создали и использовали различные модели в Python и узнали, что метод ансамбля делает нашу модель машинного обучения более мощной. Хотя мы можем создавать модели, не понимая за кулисами концепцию, все же рекомендуется понимать, как работает каждая из них. Потому что, только зная больше о модели, мы можем эффективно использовать ее и объяснить, как она правильно делает прогнозы.

Обо мне

Привет, я Келли. Мне нравится исследовать данные и находить интересные вещи в жизни. Если вы считаете, что моя статья полезна, пожалуйста, похлопайте мне и поделитесь ею. Я также приветствую любые отзывы, комментарии и конструктивную критику, чтобы сделать мои статьи лучше. Вы можете связаться со мной по адресу k[email protected]