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

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

ансамблевое обучение

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

Голосование и бэггинг

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

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

Повышение

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

Голосование с Python с использованием Scikit-Learn

Scikit-Learn предоставляет класс VotingClassifier(), который позволяет нам использовать метод обучения ансамбля голосования. Давайте воспользуемся набором данных о раке breaset из sklearn.dataset, чтобы попробовать метод голосования.

import pandas as pd
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

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

cancer = load_breast_cancer()
cancer_df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
cancer_df.head()

Набор данных содержит 30 столбцов, которые являются нашими независимыми переменными. Теперь давайте создадим модели логистической регрессии и классификатора K-ближайших соседей и объединим их вместе с VotingClassifier().

logistic = LogisticRegression()
knearest = KNeighborsClassifier(n_neighbors = 6)
voting = VotingClassifier(estimators = [('LR', logistic), ('KNN', knearest)], voting = 'soft')
X = cancer.data; y = cancer.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 100)
voting.fit(X_train, y_train)
predicted = voting.predict(X_test)
accuracy = accuracy_score(predicted, y_test)
print(f'Voting accuracy score:{accuracy:.4f}')

Классификатор голосования, состоящий из логистической регрессии и K-ближайшего классификатора, показывает точность 0,9737. Давайте сравним эту оценку с отдельными классификаторами.

models = [logistic, knearest]
for model in models:
    model.fit(X_train, y_train)
    predicted = model.predict(X_test)
    accuracy = accuracy_score(predicted, y_test)
    model_name = model.__class__.__name__
    print(f'{model_name}: {accuracy:.4f}')

Как видно, показатель точности для модели логистической регрессии составляет 0,9561, а для K-ближайшего классификатора — 0,9474. Показатели точности для обеих индивидуальных моделей ниже, чем для модели голосования. Таким образом, мы видим, что при их объединении модель улучшилась с точки зрения показателя точности.

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

Пакетирование с Python с использованием Scikit-Learn

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

from sklearn.ensemble import RandomForestClassifier
rf_model = RandomForestClassifier(random_state = 100)
rf_model.fit(X_train, y_train)
predicted = rf_model.predict(X_test)
accuracy = accuracy_score(predicted, y_test)
print(f'Random Forest accuracy:{accuracy:4f}')

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

rf_model_2 = RandomForestClassifier(n_estimators = 5, max_depth = 10, random_state = 100)
rf_model_2.fit(X_train, y_train)
predicted = rf_model_2.predict(X_test)
accuracy = accuracy_score(predicted, y_test)
print(f'Random Forest accuracy:{accuracy:4f}')

В приведенной выше модели параметру «n_estimators» было присвоено значение 5, а параметру «max_depth» — значение 10. Это означает, что мы объединили только пять классификаторов дерева решений, а максимальная глубина дерева была установлена ​​равной только десяти. С этими вновь установленными значениями параметров точность резко снизилась до 0,938596. Это говорит нам о том, что установка оптимальных параметров очень важна для максимизации производительности модели. (Это можно сделать с помощью GridSearchCV(), но здесь это не рассматривается).

RandomForestClassifier() также предоставляет feature_importances_, что позволяет нам увидеть важность функций.

import seaborn as sns
feature_importances = pd.DataFrame(rf_model.feature_importances_, columns = ['Importance'])
feature_importances.index = cancer.feature_names
feature_importances = feature_importances.sort_values(by = 'Importance', ascending = False)
plt.figure(figsize = (10, 8))
sns.barplot(feature_importances['Importance'],feature_importances.index)

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

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