Вы когда-нибудь задумывались, как Netflix рекомендует фильмы, которые могут вам понравиться? Или как Amazon предлагает продукты, которые вы, возможно, захотите купить? Или как Google ранжирует веб-страницы, соответствующие вашему поисковому запросу?

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

Но как работают модели машинного обучения? И как мы можем сделать их более точными и надежными?

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

Я открою вам маленький секрет. Я расскажу о некоторых наиболее распространенных типах ансамблевых моделей и о том, как они работают на самом деле. И в довершение всего я покажу вам, как создавать собственные ансамблевые модели с помощью Python и Scikit-learn. Поверьте мне, к концу этой статьи вы будете решать реальные проблемы с помощью своих новых навыков!

Что такое ансамблевые модели?

Идея ансамблевых моделей проста: вместо того, чтобы полагаться на одну модель, почему бы не использовать несколько моделей и не комбинировать их прогнозы? Таким образом, мы можем использовать разнообразие и взаимодополняемость различных моделей и получать более надежный и точный прогноз.

Например, предположим, что мы хотим предсказать, купит ли клиент продукт, исходя из его возраста, пола, дохода и истории просмотров. Мы могли бы использовать одну модель, такую ​​как логистическая регрессия или дерево решений, но она могла бы отражать только некоторые нюансы и закономерности в данных. В качестве альтернативы мы могли бы использовать несколько моделей, таких как логистическая регрессия, дерево решений, k-ближайший сосед и машина опорных векторов, и комбинировать их прогнозы, используя какое-либо правило или алгоритм. Это пример ансамблевой модели.

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

  1. Большинство

2. Среднее

3. Укладка

4. Упаковка

5. Прокачка

Давайте посмотрим, что означает каждый тип и как он работает.

P.S. — Просто хотел предупредить вас, что я буду использовать параметры по умолчанию для алгоритмов, с которыми мы работаем. Конечно, если вы хотите погрузиться в настройку гиперпараметров, не стесняйтесь попробовать!

БОЛЬШИНСТВО

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

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

Чтобы реализовать ансамбль большинства в Python с помощью scikit-learn, мы можем использовать класс VotingClassifier с параметром голосования, установленным на «жесткий». Этот класс позволяет нам указать список моделей и метод голосования (например, «жесткий» или «мягкий»), чтобы объединить их прогнозы.

Вот пример того, как использовать мажоритарный ансамбль для классификации:

from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

# Generate a random dataset for classification
X, y = make_classification(n_samples=1000, random_state=42)

# Split the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Define three different models
model1 = LogisticRegression(random_state=42)
model2 = DecisionTreeClassifier(random_state=42)
model3 = SVC(random_state=42, probability=True)

# Combine the models using majority voting
ensemble = VotingClassifier(estimators=[('lr', model1), ('dt', model2), ('svc', model3)], voting='hard')

# Fit the ensemble on the training data
ensemble.fit(X_train, y_train)

# Evaluate the performance of the ensemble on the testing data
print(f"Accuracy of the ensemble: {ensemble.score(X_test, y_test)*100} %")

Выход:

Accuracy of the ensemble: 85.5%

СРЕДНИЙ

Самый простой способ объединить несколько моделей — взять их среднее значение. Например, если у вас есть три модели, которые предсказывают температуру в Париже как 15°C, 18°C ​​и 20°C, вы можете взять их среднее значение и получить 17,67°C в качестве окончательного прогноза. Это также называется средним ансамблем.

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

Чтобы реализовать средний ансамбль в Python с помощью scikit-learn, мы можем использовать класс VotingRegressor для задач регрессии или класс VotingClassifier для задач классификации. Эти классы позволяют нам указать список моделей и метод голосования (например, «жесткий» или «мягкий»), чтобы объединить их прогнозы.

Вот пример того, как использовать усредненный ансамбль для регрессии:

# Import libraries
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.ensemble import VotingRegressor
from sklearn.datasets import fetch_california_housing
from sklearn.metrics import mean_squared_error

# Load data
california = fetch_california_housing(as_frame=True)
X = california.data
y = california.target

# Define models
lr = LinearRegression()
dt = DecisionTreeRegressor()
knn = KNeighborsRegressor()

# Create average ensemble
avg = VotingRegressor(estimators=[('lr', lr), ('dt', dt), ('knn', knn)])

# Fit ensemble on data
avg.fit(X, y)

# Make predictions
y_pred = avg.predict(X)

# Evaluate performance
mse = mean_squared_error(y, y_pred)
print(f'MSE: {mse:.2f}')

Выход:

MSE: 0.22

Итак, я только что получил результаты запуска нашей модели, и среднеквадратическая ошибка (MSE) оказалась равной 0,22. По сути, MSE — это мера того, насколько хорошо наша модель соответствует данным, с которыми мы работаем — чем ниже значение, тем лучше соответствие. MSE 0,22 — это очень хорошо.

УКЛАДКА

Другой способ объединить несколько моделей — использовать их в качестве входных данных для другой модели. Например, если у вас есть три модели, которые предсказывают температуру в Париже как 15 ° C, 18 ° C и 20 ° C, вы можете использовать их прогнозы в качестве признаков для четвертой модели, которая учится взвешивать их и делать окончательный прогноз. . Это также называется метаучеником или учеником второго уровня.

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

Чтобы реализовать ансамбль стека в Python с помощью scikit-learn, мы можем использовать класс StackingRegressor для задач регрессии или класс StackingClassifier для задач классификации. Эти классы позволяют указать список моделей в качестве базовых оценок и другую модель в качестве окончательной оценки.

Вот пример того, как использовать стековый ансамбль для классификации:

# Import libraries
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import StackingClassifier
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score

# Load data
X, y = load_iris(return_X_y=True)

# Define models
lr = LogisticRegression()
dt = DecisionTreeClassifier()
knn = KNeighborsClassifier()

# Create a stacking ensemble
stack = StackingClassifier(estimators=[('lr', lr), ('dt', dt), ('knn', knn)], final_estimator=LogisticRegression())

# Fit ensemble on data
stack.fit(X, y)

# Make predictions
y_pred = stack.predict(X)

# Evaluate performance
acc = accuracy_score(y, y_pred)
acc = acc*100
print(f'Accuracy: {acc:.2f} %')

Выход:

Accuracy: 99.33 %

УПАКОВКА

Четвертый способ объединения нескольких моделей — использовать разные подмножества данных для их обучения. Например, если у вас есть набор данных из 1000 наблюдений, вы можете случайным образом выбрать 500 наблюдений с заменами (это означает, что некоторые наблюдения могут повторяться) и использовать их для обучения одной модели. Вы можете повторить этот процесс несколько раз и обучить разные модели на разных подмножествах данных. Это также называется агрегацией начальной загрузки или начальной загрузкой.

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

Чтобы реализовать ансамбль пакетов в Python с помощью scikit-learn, мы можем использовать класс BaggingRegressor для задач регрессии или класс BaggingClassifier для задач классификации. Эти классы позволяют нам указать базовую оценку и количество создаваемых образцов начальной загрузки.

Вот пример того, как использовать ансамбль мешков для регрессии:

# Import libraries
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score

# Load data
X, y = load_iris(return_X_y=True)

# Define base model
dt = DecisionTreeClassifier()

# Create a bagging ensemble
bag = BaggingClassifier(base_estimator=dt, n_estimators=10)

# Fit ensemble on data
bag.fit(X, y)

# Make predictions
y_pred = bag.predict(X)

# Evaluate performance
acc = accuracy_score(y, y_pred)
acc = acc *100
print(f'Accuracy: {acc:.2f} %')

Выход:

Accuracy: 100.00 %

ПОВЫШЕНИЕ

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

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

Чтобы реализовать повышающий ансамбль в Python с помощью scikit-learn, мы можем использовать класс AdaBoostRegressor для задач регрессии или класс AdaBoostClassifier для задач классификации. Эти классы позволяют нам указать базовую оценку и количество повышающих итераций для создания.

Вот пример того, как использовать повышающий ансамбль для регрессии:

# Import libraries
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import AdaBoostRegressor
from sklearn.datasets import load_iris
from sklearn.metrics import mean_squared_error

# Load data
X, y = load_iris(return_X_y=True)

# Define base model
dt = DecisionTreeRegressor()

# Create boosting ensemble
boost = AdaBoostRegressor(base_estimator=dt, n_estimators=10)

# Fit ensemble on data
boost.fit(X, y)

# Make predictions
y_pred = boost.predict(X)

# Evaluate performance
mse = mean_squared_error(y, y_pred)
print(f'MSE: {mse:.2f}')

Выход:

MSE: 0.00

Отличные новости! MSE (среднеквадратичная ошибка) выходит равным 0,00. Это означает, что наши прогнозы точны, и нет ошибки между прогнозируемыми значениями и фактическими значениями. Это именно то, что мы хотим видеть в наших моделях.

Заключение

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

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

Так что, не будьте однообразным человеком. Идите вперед и попробуйте ансамблевые модели, и кто знает, может быть, вы просто найдете идеальное соответствие для ваших данных. А если нет, то моделей в море всегда больше.

Удачного кодирования и счастливого изучения!

До скорой встречи!

В случае вопросов, оставьте комментарий или напишите мне по адресу [email protected]

ОБ АВТОРЕ

Увлечен изучением способов повышения производительности и автоматизации задач. Я стремлюсь использовать свои навыки анализа данных, машинного обучения и искусственного интеллекта для повышения корпоративной эффективности за счет оптимального использования доступных ресурсов. Другими словами, я хочу использовать свои сверхспособности, чтобы помочь сделать мир лучше. Хе-хе!

Сайт — acumenfinalysis.com

КОНТАКТЫ:

Если у вас есть какие-либо вопросы или предложения о том, о чем должна быть моя следующая статья, напишите мне по адресу [email protected].

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

ПОДПИСАТЬСЯ НА МОЙ СРЕДНИЙ АККАУНТ:

https://aryanbajaj13.medium.com/subscribe

СВЯЗАТЬСЯ СО МНОЙ ЧЕРЕЗ:

ЛинкедИн