Эта статья является частью серии «Наука о данных с помощью Python». Другие истории из этой серии вы можете найти ниже:



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

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

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

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

Использование ансамблевых методов в науке о данных имеет несколько преимуществ:

  • Повышенная точность. Ансамблевые методы часто могут обеспечить более высокую точность по сравнению с отдельными моделями за счет уменьшения систематической ошибки и дисперсии. Методы ансамбля могут компенсировать недостатки отдельных моделей и давать более надежные прогнозы.
  • Повышенная надежность: ансамблевые методы менее подвержены переобучению, что является распространенной проблемой в машинном обучении. Они могут уменьшить влияние выбросов и шума в данных, что приводит к более надежным и обобщаемым моделям.
  • Лучшая обработка сложных данных. Методы ансамбля особенно эффективны при работе со сложными наборами данных. Действительно, они могут фиксировать различные аспекты данных и обеспечивать более полное понимание сложных лежащих в их основе закономерностей.·

Большинство ансамблевых методов можно разделить на 4 категории.

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

Затем у нас есть «повышение», метод итеративного ансамбля, который фокусируется на последовательном улучшении производительности отдельных моделей. Модели обучаются поэтапно, при этом каждая последующая модель исправляет ошибки, допущенные предыдущими моделями. Некоторые известные алгоритмы повышения — это AdaBoost и Gradient Boosting, возможно, вы уже слышали о них?

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

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

Предпосылки

Если вы ознакомились с другими статьями этой серии, вы, вероятно, знаете все, что я здесь расскажу, и можете пропустить этот раздел.

В противном случае вы должны начать с установки sklearn с pip install scikit-learn . Вы также должны установить pandas с pip install pandas .

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

import pandas as pd
from sklearn.model_selection import train_test_split


data = pd.read_csv('dataset.csv')

X = data.drop('target', axis=1)
y = data['target']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

В этом коде «цель» представляет целевую переменную в вашем наборе данных, которую вы хотите предсказать. Настройте параметр test_size в соответствии с вашими предпочтениями относительно размера набора тестов.

В этой статье я предполагаю, что у вас есть некоторые предварительные знания о науке о данных с помощью Python (sklearn, pandas, предварительная обработка данных и т. д.). Если у вас нет этих знаний, посмотрите другие мои истории о науке о данных и вернитесь сюда позже. Вы можете найти их все ниже:



Бэгинг

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

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

В Python нам просто нужно импортировать sklearn.ensemble, а затем мы можем использовать RandomForestClassifier или RandomForestRegressor.

Другим вариантом упаковки является алгоритм Extra Trees, сокращенно от Extremely Randomized Trees. Подобно случайному лесу, он строит несколько деревьев решений, используя образцы с начальной загрузкой. Однако, в отличие от Random Forest, Extra Trees дополнительно рандомизирует построение каждого дерева, рассматривая случайные пороги для каждой функции вместо поиска наилучшего разделения.

Реализация Extra Trees в Python следует той же схеме, что и Random Forest. Классы ExtraTreesClassifier и ExtraTreesRegressor .

Повышение: AdaBoost и повышение градиента

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

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

Реализовать AdaBoost в Python просто с помощью scikit-learn. У нас есть AdaBoostClassifier или AdaBoostRegressor .

Затем Gradient Boosting — еще один мощный алгоритм повышения, который последовательно строит модели. Вместо корректировки весов экземпляров он фокусируется на минимизации функции потерь за счет оптимизации параметров модели. На каждой итерации новая модель обучается, чтобы свести к минимуму остаточные ошибки предыдущих моделей. Такой подход делает Gradient Boosting эффективным как в задачах классификации, так и в задачах регрессии.

Реализовать Gradient Boosting в Python можно с помощью таких библиотек, как XGBoost или LightGBM. Давайте попробуем XGBoost.

pip install xgboost

Тогда для регрессии наш код будет выглядеть так:

import xgboost as xgb
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error


california = fetch_california_housing()
X, y = california.data, california.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Convert the data into DMatrix format
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)

# Define the parameters for the XGBoost model
params = {
    'objective': 'reg:squarederror',  # Use squared error for regression
    'max_depth': 3,                   # Maximum depth of each tree
    'eta': 0.1,                       # Learning rate
    'gamma': 0.1,                     # Minimum loss reduction required to make a further partition
    'subsample': 0.8,                 # Subsample ratio of the training instances
    'colsample_bytree': 0.8,          # Subsample ratio of features when constructing each tree
    'eval_metric': 'rmse'             # Evaluation metric to use
}

# Train the XGBoost model
num_rounds = 100  # Number of boosting rounds
model = xgb.train(params, dtrain, num_rounds)

# Make predictions on the test set
y_pred = model.predict(dtest)

# Evaluate the model
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")

Для классификации это будет тот же код, за исключением того, что paramsdict и метрика, которую мы используем для оценки модели, будут другими:

params = {
    'objective': 'multi:softmax',  # Use softmax for multiclass classification
    'num_class': 3,                 # Number of classes
    'max_depth': 3,                 
    'eta': 0.1,                     
    'subsample': 0.8,               
    'colsample_bytree': 0.8,        
    'eval_metric': 'merror'         
}
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

Укладка

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

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

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

Например, вот код для классификации:

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score


data = load_iris()
X, y = data.data, data.target


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Define the base models
base_model_1 = RandomForestClassifier(random_state=42)
base_model_2 = LogisticRegression(random_state=42)

# Train the base models
base_model_1.fit(X_train, y_train)
base_model_2.fit(X_train, y_train)

# Make predictions using the base models
pred_1 = base_model_1.predict(X_test)
pred_2 = base_model_2.predict(X_test)

# Create a new training set with the predictions from the base models
meta_features = np.column_stack((pred_1, pred_2))

# Train the meta-model
meta_model = LogisticRegression(random_state=42)
meta_model.fit(meta_features, y_test)

# Make predictions using the stacked model
stacked_pred = meta_model.predict(meta_features)

# Evaluate the performance of the stacked model
stacked_accuracy = accuracy_score(y_test, stacked_pred)
print("Stacked Model Accuracy:", stacked_accuracy)

Голосование

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

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

Голосование особенно эффективно, когда используемые модели имеют разные сильные и слабые стороны.

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

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

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

Вот пример кода:

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 load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score


iris = load_iris()
X, y = iris.data, iris.target


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)


model1 = LogisticRegression()
model2 = DecisionTreeClassifier()
model3 = SVC()

# Create the voting classifier
voting_classifier = VotingClassifier(
    estimators=[('lr', model1), ('dt', model2), ('svm', model3)],
    voting='hard'  # Use 'soft' for weighted voting
)

voting_classifier.fit(X_train, y_train)

y_pred = voting_classifier.predict(X_test)

accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

Оценка и тонкая настройка моделей ансамбля

При оценке ансамблевых моделей общие показатели производительности включают точность, прецизионность, полноту, оценку F1 и площадь под кривой рабочих характеристик приемника (AUC-ROC).

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

Другой метод тонкой настройки — настройка гиперпараметров. Двумя популярными подходами к настройке гиперпараметров являются поиск по сетке и случайный поиск.

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

Сетка гиперпараметров выглядит примерно так:

param_grid = {
    'C': [0.1, 1, 10],
    'kernel': ['linear', 'rbf'],
    'gamma': [0.1, 1, 10]
}

Затем мы можем выполнить поиск по сетке:

grid_search = GridSearchCV(model, param_grid, cv=5)
grid_search.fit(X_train, y_train)

print("Best hyperparameters: ", grid_search.best_params_)
print("Best model: ", grid_search.best_estimator_)

best_model = grid_search.best_estimator_
accuracy = best_model.score(X_test, y_test)
print("Accuracy: ", accuracy)

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

param_grid = {
    'n_estimators': [10, 50, 100],
    'max_depth': [None, 5, 10],
    'min_samples_split': [2, 5, 10]
}

rf = RandomForestClassifier()

random_search = RandomizedSearchCV(
    estimator=rf,
    param_distributions=param_grid,
    n_iter=10,  # Number of parameter settings that are sampled
    scoring='accuracy',  # Scoring metric to evaluate the models
    cv=5,  
    random_state=42  
)


random_search.fit(X, y)


print("Best Parameters: ", random_search.best_params_)
print("Best Score: ", random_search.best_score_)

Заключительное примечание

Ансамблевые методы позволяют повысить точность и надежность прогнозов. И, к счастью, реализация ансамблевых методов в Python упрощается благодаря таким библиотекам, как scikit-learn или XGBoost.

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

Чтобы ознакомиться с другими историями этой истории, нажмите ниже!



Чтобы узнать больше о моих историях о Python, нажмите здесь! Вы также можете получить доступ ко всему моему контенту, проверив эту страницу.

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

Если вы еще не подписаны на среду и хотите поддержать меня или получить доступ ко всем моим историям, вы можете использовать мою ссылку: