Как выбрать количество оценщиков для Gradient Boosting

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

Используя Scikit-Learn, вы найдете алгоритм Random Forest, который представляет собой разновидность ансамблевой модели. С другой стороны, вы также найдете модели Boosting, которые обучают оценщики последовательно, где результат одной модели передается следующей, которая пытается улучшить прогнозы, пока они не достигнут оптимального результата.

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

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

Повышение градиента можно загрузить из Scikit-Learn, используя этот класс. from sklearn.ensemble import GradientBoostingRegressor. Алгоритм повышения градиента можно использовать как для классификации, так и для моделей регрессии. Это оценщик на основе дерева, то есть он состоит из множества деревьев решений.

Результат Дерево 1 будет генерировать ошибки. Эти ошибки будут использоваться, а входные данные для Дерево 2. И снова будут использоваться ошибки последней модели и вход следующей, пока она не достигнет n_estimators значения.

Каждая модель будет соответствовать ошибкам предыдущей. Изображение автора.

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

Давайте посмотрим, как это сделать сейчас.

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

Начнем с выбора набора данных. Мы будем использовать автомобильные аварии набор данных, взятый из библиотеки seaborn (поэтому открытые данные под лицензией BDS).

# Набор данных
df = sns.load_dataset('car_crashes')

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

Набор данных об автомобильных авариях, из Сиборна. Изображение автора.

Быстро просматриваем корреляции.

# Корреляции
df.corr().style.background_gradient(cmap='coolwarm')
Корреляции в наборе данных. Изображение автора.

Хорошо, никакой серьезной мультиколлинеарности. Мы видим, что ins_premium и ins_losses не очень хорошо коррелируют с total , поэтому мы не будем рассматривать их в модели.

Если мы проверим недостающие данные, их нет.

# Отсутствует
df.isnull (). сумма ()
0

Отлично, давайте теперь разделим данные.

# Х и у
X = df.drop(['ins_premium', 'ins_losses', 'abbrev', 'total'], axis=1)
y = df['всего']
# Тест поезда
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=22)

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

Я использую 500 оценщиков с learning_rate из 0.3.

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

шаги = [('масштаб', StandardScaler()),
('GBR', GradientBoostingRegressor(n_estimators=500, Learning_rate=0.03)) ]
# Экземплярный конвейер и подгонка
труба = Трубопровод(шаги).fit(X_train, y_train)
# Предсказывать
предс = труба.predict(X_test)

Теперь оцениваю.

# RMSE прогнозов
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds)),1 )}')
[ВЫХОД]: RMSE: 1.1# Среднее значение истинных значений Y
print(f'Data y означает: {round( y.mean(),1 )}')
[OUT]: Среднее значение данных: 15.8.

Хороший. Наше RMSE составляет около 6.9% от среднего значения. Так что в среднем мы отстаем примерно на эту величину.

Теперь давайте проверим способ настройки нашей модели, выбрав оптимальное количество оценщиков для обучения, которое даст нам наименьший уровень ошибок.

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

#model
gbr = GradientBoostingRegressor(n_estimators=500, Learning_rate=0.3).fit(X_train, y_train)

Теперь это хорошая вещь. В Gradient Boosting есть метод, который позволяет нам перебирать прогнозы каждого обученного оценщика от 1 до 500. Итак, мы создадим цикл, который будет проходить через 500 оценщиков в gbr модель, прогнозирует результаты с помощью метода staged_predict(), вычисляет среднеквадратическую ошибку и сохраняет результат в списке errors.

# Цикл для лучшего числа
ошибки = [mean_squared_error(y_test, preds) для предов в gbr.staged_predict(X_test)]
# Оптимальное количество оценщиков
оптимальные_num_estimators = np.argmin(ошибки) + 1

Далее мы можем построить график результата.

#Сюжет
g=sns.lineplot(x=диапазон(500), y=ошибки)
g.set_title(f'Наилучшее количество оценщиков в {best_n_estimators}', size=15);
Лучшее количество оценщиков. Изображение автора.

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

# Переподготовка
gbr = GradientBoostingRegressor(n_estimators=34, Learning_rate=0.3).fit(X_train, y_train)
# Прогнозы
preds2 = gbr.predict(X_test)

Оценка…

# RMSE прогнозов
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds2)),1 )}')
[ВЫХОД]: RMSE: 1.0
# Данные Y означают
print(f'Data y означает: {round( y.mean(),1 )}')
[OUT]: Среднее значение данных: 15.8.

Сейчас мы снизили скидку с 6.9% до 6.3%. Прибл. на 9% лучше. Давайте посмотрим на несколько прогнозов.

Прогнозы обеих моделей. Изображение автора.

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

Мы узнали, как определить наилучшее количество оценщиков для настройки GradientBoostingRegressor из Scikit-Learn. Это гиперпараметр, который может иметь значение в такой модели ансамбля, которая последовательно обучает оценщики.

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

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

Вот полный код на GitHub.

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

Найди меня на LinkedIn.

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

Как выбрать количество оценщиков для повышения градиента 8 через https://towardsdatascience.com/feed

<!–

->

Отметка времени:

Больше от Блокчейн-консультанты