www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Алгоритмы машинного обучения ансамбля в Python с scikit-learn

Дата публикации 2016-06-03

Ансамбли могут повысить точность набора данных.

В этом посте вы узнаете, как вы можете создавать некоторые из самых мощных типов ансамблей в Python, используя scikit-learn.

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

Давайте начнем.

  • Обновление январь / 2017: Обновлено для отражения изменений в Scikit-Learn API в версии 0.18.
  • Обновление март / 2018: Добавлена ​​альтернативная ссылка для загрузки набора данных, так как кажется, что оригинал удален.

Объединить прогнозы модели в прогнозы ансамбля

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

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

Этот пост не будет объяснять каждый из этих методов.

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

О рецептах

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

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

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

Алгоритмы пакетирования

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

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

В этом разделе рассматриваются три модели упаковки:

  1. Деревья решений в мешках
  2. Случайный лес
  3. Дополнительные деревья

1. Деревья решений в мешках

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

В приведенном ниже примере показан пример использования BaggingClassifier с алгоритмом деревьев классификации и регрессии (DecisionTreeClassifier). Всего создано 100 деревьев.

# Bagged Decision Trees for Classification
import pandas
from sklearn import model_selection
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
kfold = model_selection.KFold(n_splits=10, random_state=seed)
cart = DecisionTreeClassifier()
num_trees = 100
model = BaggingClassifier(base_estimator=cart, n_estimators=num_trees, random_state=seed)
results = model_selection.cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

Запустив пример, мы получим надежную оценку точности модели.

0.770745044429

2. Случайный лес

Случайный лес - это расширение деревьев решений в мешках.

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

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

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

# Random Forest Classification
import pandas
from sklearn import model_selection
from sklearn.ensemble import RandomForestClassifier
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
num_trees = 100
max_features = 3
kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = RandomForestClassifier(n_estimators=num_trees, max_features=max_features)
results = model_selection.cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

Выполнение примера дает среднюю оценку точности классификации.

0.770727956254

3. Дополнительные деревья

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

Вы можете построить модель Extra Trees для классификации, используяExtraTreesClassifierучебный класс.

В приведенном ниже примере показана демонстрация дополнительных деревьев с числом деревьев, равным 100, и разбиениями, выбранными из 7 случайных объектов.

# Extra Trees Classification
import pandas
from sklearn import model_selection
from sklearn.ensemble import ExtraTreesClassifier
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
num_trees = 100
max_features = 7
kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = ExtraTreesClassifier(n_estimators=num_trees, max_features=max_features)
results = model_selection.cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

Выполнение примера дает среднюю оценку точности классификации.

0.760269993165

Повышение Алгоритмы

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

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

Вот два наиболее распространенных алгоритма машинного обучения:

  1. AdaBoost
  2. Стохастический градиент повышения

1. AdaBoost

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

Вы можете построить модель AdaBoost для классификации, используяAdaBoostClassifierучебный класс.

Пример ниже демонстрирует построение 30 деревьев решений в последовательности, используя алгоритм AdaBoost.

# AdaBoost Classification
import pandas
from sklearn import model_selection
from sklearn.ensemble import AdaBoostClassifier
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
num_trees = 30
kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = AdaBoostClassifier(n_estimators=num_trees, random_state=seed)
results = model_selection.cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

Выполнение примера дает среднюю оценку точности классификации.

0.76045796309

2. Стохастическое повышение градиента

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

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

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

# Stochastic Gradient Boosting Classification
import pandas
from sklearn import model_selection
from sklearn.ensemble import GradientBoostingClassifier
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
num_trees = 100
kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = GradientBoostingClassifier(n_estimators=num_trees, random_state=seed)
results = model_selection.cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

Выполнение примера дает среднюю оценку точности классификации.

0.764285714286

Голосующий ансамбль

Голосование является одним из самых простых способов объединения прогнозов из нескольких алгоритмов машинного обучения.

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

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

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

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

# Voting Ensemble for Classification
import pandas
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.ensemble import VotingClassifier
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
kfold = model_selection.KFold(n_splits=10, random_state=seed)
# create the sub models
estimators = []
model1 = LogisticRegression()
estimators.append(('logistic', model1))
model2 = DecisionTreeClassifier()
estimators.append(('cart', model2))
model3 = SVC()
estimators.append(('svm', model3))
# create the ensemble model
ensemble = VotingClassifier(estimators)
results = model_selection.cross_val_score(ensemble, X, Y, cv=kfold)
print(results.mean())

Выполнение примера дает среднюю оценку точности классификации.

0.712166780588

Резюме

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

Вы узнали о:

  • Мешковатые ансамбли, включая деревья решений в мешках, случайные леса и дополнительные деревья.
  • Усиливающие ансамбли, включая AdaBoost и Stochastic Gradient Boosting.
  • Ансамбли голосования за усреднение прогнозов для любых произвольных моделей.

Есть ли у вас какие-либо вопросы об ансамблевых алгоритмах машинного обучения или ансамблях в scikit-learn? Задайте свои вопросы в комментариях, и я сделаю все возможное, чтобы ответить на них.

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map