Вы когда-нибудь задумывались, как Netflix рекомендует фильмы, которые могут вам понравиться? Или как Amazon предлагает продукты, которые вы, возможно, захотите купить? Или как Google ранжирует веб-страницы, соответствующие вашему поисковому запросу?
Все это примеры машинного обучения, ветви искусственного интеллекта, которая позволяет компьютерам учиться на данных и делать прогнозы или принимать решения. В настоящее время машинное обучение используется повсюду, и оно поддерживает множество приложений, которые мы используем ежедневно.
Но как работают модели машинного обучения? И как мы можем сделать их более точными и надежными?
Один из способов ответить на эти вопросы — рассмотреть ансамблевые модели, метод, который использует несколько моделей для получения более качественных прогнозов, чем любая отдельная модель. Модели ансамбля широко используются в машинном обучении и науке о данных, особенно для таких задач, как классификация и регрессия.
Я открою вам маленький секрет. Я расскажу о некоторых наиболее распространенных типах ансамблевых моделей и о том, как они работают на самом деле. И в довершение всего я покажу вам, как создавать собственные ансамблевые модели с помощью Python и Scikit-learn. Поверьте мне, к концу этой статьи вы будете решать реальные проблемы с помощью своих новых навыков!
Что такое ансамблевые модели?
Идея ансамблевых моделей проста: вместо того, чтобы полагаться на одну модель, почему бы не использовать несколько моделей и не комбинировать их прогнозы? Таким образом, мы можем использовать разнообразие и взаимодополняемость различных моделей и получать более надежный и точный прогноз.
Например, предположим, что мы хотим предсказать, купит ли клиент продукт, исходя из его возраста, пола, дохода и истории просмотров. Мы могли бы использовать одну модель, такую как логистическая регрессия или дерево решений, но она могла бы отражать только некоторые нюансы и закономерности в данных. В качестве альтернативы мы могли бы использовать несколько моделей, таких как логистическая регрессия, дерево решений, k-ближайший сосед и машина опорных векторов, и комбинировать их прогнозы, используя какое-либо правило или алгоритм. Это пример ансамблевой модели.
Существуют различные способы создания и объединения нескольких моделей. В зависимости от того, как они это делают, мы можем классифицировать ансамблевые модели на пять основных типов:
- Большинство
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