В машинном обучении ансамблевое обучение использует несколько алгоритмов обучения для получения лучших результатов производительности. В контексте классификации мы используем несколько классификаторов и комбинируем их, что в целом может дать лучшие результаты.
Будет легче, если вы будете думать таким образом. Когда вы сталкиваетесь с определенной проблемой, часто бывает лучше, если вы попросите своих друзей помочь вам, чем работать самостоятельно. Коллективный разум часто может привести к повышению производительности. Давайте посмотрим, как коллективный разум работает в алгоритмах машинного обучения.
ансамблевое обучение
Традиционно ансамблевое обучение можно разделить на три категории: Голосование, Бэггинг и Поощрение. Голосование и бэггинг похожи тем, что определяют окончательный результат путем объединения нескольких алгоритмов, но различаются методом выборки данных. Приведенная ниже диаграмма может эффективно объяснить их различия.
Голосование и бэггинг
Как видно, алгоритмы в методе голосования обучаются на одном и том же наборе данных, но алгоритмы в методе бэггинга обучаются на разных выборочных наборах данных, которые были загружены. Другими словами, алгоритмы в методе бэггинга обучаются на наборах данных, которые были случайно выбраны из исходного набора данных с заменой. Кроме того, в методе бэггинга алгоритмы идентичны, в то время как в методе голосования комбинируются разные алгоритмы. Классификатор случайного леса относится к методу пакетирования, поскольку он состоит из нескольких классификаторов дерева решений.
Что касается метода голосования, существует два метода проведения голосования: жесткое голосование и мягкое голосование. Жесткое голосование эквивалентно голосованию большинством, а мягкое голосование, по сути, усредняет результаты нескольких алгоритмов. В качестве метода голосования обычно выбирается мягкое голосование. На схеме ниже показан механизм мягкого голосования.
Повышение
Метод повышения в ансамблевом обучении немного отличается от метода голосования и бэггинга. В методах голосования и бэггинга алгоритмы обучались и их результаты объединялись параллельно. В методе бустинга модели обучаются и тестируются последовательно, одна за другой. Поскольку модели обучаются последовательно, считалось, что метод бустинга занимает намного больше времени, чем другие методы, но эта проблема была решена с появлением алгоритма 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)
Визуализацию важности функций можно увидеть выше. «Наихудшие вогнутые точки» имеют наивысшую важность признаков, за которыми следуют «наихудший периметр» и «наихудшая область». Другими словами, эти переменные оказывают наибольшее влияние на процесс классификации с помощью нашей модели случайного леса.
В этой статье мы рассмотрели типы ансамблевого обучения и сосредоточились на методах голосования и бэггинга. Надеюсь, эта статья помогла вам понять концепцию и хорошего дня. Спасибо!