Як вибрати кількість оцінювачів для посилення градієнта

Сьогодні в Data Science є багато доступних алгоритмів. Таким чином, одна корисна техніка полягає в тому, щоб об’єднати їх в одній моделі, щоб отримати найкраще від кожного, що призведе до більш точної моделі.

Використовуючи Scikit-Learn, ви знайдете алгоритм Random Forest, який є різновидом моделі ансамблю. З іншого боку, ви також знайдете моделі підсилення, які послідовно навчають оцінювачі, де результат однієї моделі передається до наступної, яка намагатиметься покращити прогнози, доки не досягне оптимального результату.

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

У цій публікації ми знайдемо простий спосіб отримати єдине число для навчання нашої моделі.

Gradient Boosting можна завантажити з Scikit-Learn за допомогою цього класу from sklearn.ensemble import GradientBoostingRegressor. Алгоритм Gradient Boosting можна використовувати як для класифікації, так і для моделей регресії. Це деревоподібний оцінювач, що означає, що він складається з багатьох дерев рішень.

Результат Дерево 1 буде генерувати помилки. Ці помилки будуть використані та введені для Дерево 2. Знову ж таки, будуть використані помилки останньої моделі та введення наступної, доки вона не досягне n_estimators value.

Кожна модель буде відповідати похибкам попередньої. Зображення автора.

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

Давайте зараз подивимося, як це зробити.

Код для цієї вправи простий. Усе, що ми повинні зробити, це виконати цикл після кожної ітерації та перевірити, на якій із них ми мали найменшу помилку.

Почнемо з вибору набору даних. Ми будемо використовувати car_crashes набір даних із морської бібліотеки (тобто відкриті дані за ліцензією BDS).

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

Ось короткий огляд даних. Спробуємо оцінити total кількість, використовуючи інші функції як предиктори. Оскільки це вихідне число, ми говоримо про регресійну модель.

Набір даних про автомобільні аварії, від морян. Зображення автора.

Швидко дивлячись на кореляції.

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

Добре, без великої мультиколінеарності. Ми це бачимо ins_premium та ins_losses не дуже добре співвідносяться з total , тому ми не будемо розглядати їх у моделі.

Якщо ми перевіримо відсутні дані, їх немає

# Відсутня
df.isnull().sum()
0

Чудово, тож давайте розділимо дані.

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

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

Я використовую 500 оцінювачів з a learning_rate з 0.3.

Швидкість навчання — це розмір кроку, який ми робимо, щоб досягти мінімальної помилки. Якщо ми використовуємо занадто високе значення, ми можемо перейти до мінімуму. Якщо ми використовуємо надто мале число, ми можемо навіть не наблизитися до нього. Отже, емпіричне правило, яке ви можете взяти до уваги: ​​якщо у вас є велика кількість оцінювачів, ви можете використовувати нижчі значення швидкості навчання. Якщо у вас є лише кілька оцінювачів, краще використовувати вищі значення швидкості навчання.

steps = [('scale', StandardScaler()),
('GBR', GradientBoostingRegressor(n_estimators=500, learning_rate=0.03))]
# Конвеєр екземпляра та відповідність
pipe = Pipeline(steps).fit(X_train, y_train)
# Передбачити
preds = pipe.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 mean: {round( y.mean(),1 )}')
[OUT]: Дані y середнє: 15.8

добре. Наш RMSE становить приблизно 6.9% від середнього. Тож у середньому ми відстаємо від цього.

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

Як я вже сказав, нам насправді не потрібно масштабувати ці дані, тому що вони вже мають однакову пропорцію. Тож підганяємо модель.

#Модель
gbr = GradientBoostingRegressor(n_estimators=500, learning_rate=0.3).fit(X_train, y_train)

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

# Петля для найкращого числа
errors = [ mean_squared_error(y_test, preds) for preds in gbr.staged_predict(X_test)]
# Оптимальна кількість оцінювачів
optimal_num_estimators = np.argmin(errors) + 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 mean: {round( y.mean(),1 )}')
[OUT]: Дані y середнє: 15.8

Зараз ми знизили знижку з 6.9% до 6.3%. прибл. на 9% краще. Давайте подивимося на кілька прогнозів.

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

Цікаві результати. Деякі прогнози другої моделі кращі, ніж перша.

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

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

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

Ось іще повний код на GitHub.

Якщо вам сподобався цей вміст, підпишіться на мій блог.

Знайди мене на LinkedIn.

Ця вправа була заснована на чудовому підручнику Орельєна Герона, у довідці.

Як вибрати кількість оцінювачів для підсилення градієнта Перепубліковано з джерела https://towardsdatascience.com/how-to-choose-the-number-of-estimators-for-gradient-boosting-8d06920ab891?source=rss—-7f60cf5620c9— 4 через https://towardsdatascience.com/feed

<!–

->

Часова мітка:

Більше від Консультанти з блокчейнів