🤖 Решаем задачи машинного обучения с помощью алгоритма градиентного бустинга
Kaggle expert⚛️ Пишу материал о различных алгоритмах и техниках в сфере Machine Learning. Градиентный бустинг (Gradient Boosting) – один из самых эффективных инструментов для решения задач машинного обучения, в особенности на соревнованиях Kaggle. Чтобы научиться правильно его применять, разберем подробнее лежащие в основе алгоритма процессы. Градиентный бустинг – это продвинутый алгоритм машинного обучения для решения задач классификации и регрессии. Он строит предсказание в виде ансамбля слабых предсказывающих моделей, которыми в основном являются деревья решений. Из нескольких слабых моделей в итоге мы собираем одну, но уже эффективную. Общая идея алгоритма – последовательное применение предиктора (предсказателя) таким образом, что каждая последующая модель сводит ошибку предыдущей к минимуму. Предположим, что вы играете в гольф. Чтобы загнать мяч в лунĸу, вам необходимо замахиваться клюшкой, каждый раз исходя из предыдущего удара. То есть перед новым ударом гольфист в первую очередь смотрит на расстояние между мячом и лунĸой после предыдущего удара, так как наша основная задача – при следующем ударе уменьшить это расстояние. Бустинг строится таким же способом. Для начала, нам нужно ввести определение “лунĸи”, а именно цели, которая является конечным результатом наших усилий. Далее необходимо понимать, куда нужно “бить ĸлюшĸой”, для попадания ближе ĸ цели. С учётом всех этих правил нам необходимо составить правильную последовательность действий, чтобы ĸаждый последующий удар соĸращал расстояние между мячом и лунĸой. Стоит отметить, что для задач классификации и регрессии реализация алгоритма в программировании будет различаться. Больше полезной информации вы найдете на нашем телеграм-канале «Библиотека data scientist’а». Результат работы кода: Базовая модель градиентного бустинга с несложной простой настройкой дает нам точность более чем в 95% на задаче регрессии. Помимо классической для машинного обучения sklearn, для алгоритма градиентного бустинга существуют три наиболее используемые библиотеки: XGBoost – более регуляризованная форма градиентного бустинга. Основным преимуществом данной библиотеки является производительность и эффективная оптимизация вычислений (лучший результат с меньшей затратой ресурсов). Вы можете установить XGBoost следующим образом: Библиотека XGBoost предоставляем нам разные классы для разных задач: XGBClassifier для классификации и XGBregressor для регрессии. Примечание Все приведенные ниже библиотеки имеют отдельные классы для задач как классификации, так и регрессии. LightGBM – библиотека от Microsoft. В ней идет добавление авто выбора объектов и фокуса на тех частях бустинга, в которых мы имеем больший градиент. Это способствует значительному ускорению в обучении модели и улучшению показателей предсказания. Основная сфера применения – соревнования с использованием табличных данных на Kaggle. Вы можете установить LightGBM также при помощи pip: CatBoost – это библиотека градиентного бустинга, которую создали разработчики Яндекса. Здесь используются “забывчивые” (oblivious) деревья решений, при помощи которых мы растим сбалансированное дерево. Одни и те же функции используются для создания разделений (split) на каждом уровне дерева. Более того, главным преимуществом CatBoost (помимо улучшения скорости вычислений) является поддержка категориальных входных переменных. Из-за этого библиотека получила свое название CatBoost, от “Category Gradient Boosting” (Категориальный Градиентный Бустинг). Вы можете установить CatBoost проверенным ранее путем: Вы можете использовать алгоритм градиентного бустинга при следующих условиях: Когда НЕ следует использовать XGBoost: Плюсы Минусы *** Хотя градиентный бустинг широко используется во всех областях науки о данных, от соревнований Kaggle до практических задач, многие специалисты все еще используют его как черный ящик. В этой статье мы разбили метод на более простые шаги, чтобы помочь читателям понять лежащие в основе работы алгоритма процессы. Удачи! Alex Maszański
Параметры алгоритма
Реализация на языке python (библиотека sklearn)
### Загружаем библиотеки и данные import pandas as pd import numpy as np from sklearn.ensemble import GradientBoostingRegressor from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler,LabelEncoder from sklearn.datasets import load_breast_cancer from sklearn.metrics import mean_squared_error,r2_score import warnings warnings.filterwarnings('ignore') breast_cancer = load_breast_cancer() ### Обозначаем целевую переменную для нашей будущей модели X = pd.DataFrame(breast_cancer['data'], columns=breast_cancer['feature_names']) y = pd.Categorical.from_codes(breast_cancer['target'], breast_cancer['target_names']) lbl = LabelEncoder() lbl.fit(y) y_enc = lbl.transform(y) ### Разбираемся с признаками scl = StandardScaler() scl.fit(X) X_scaled = scl.transform(X) X_train, X_test, y_train, y_test = train_test_split(X, y_enc, test_size=0.20, random_state=42) ### Прописываем параметры для нашей модели params = {'n_estimators':200, 'max_depth':12, 'criterion':'mse', 'learning_rate':0.03, 'min_samples_leaf':16, 'min_samples_split':16 } ### Тренируем gbr = GradientBoostingRegressor(**params) gbr.fit(X_train,y_train) ### Вычисляем точность train_accuracy_score=gbr.score(X_train,y_train) print(train_accuracy_score) test_accuracy_score=gbr.score(X_test,y_test) print(test_accuracy_score) ### Предсказание y_pred = gbr.predict(X_test) ### И среднеквадратичную ошибку mse = mean_squared_error(y_test,y_pred) print("MSE: %.2f" % mse) print(r2_score(y_test,y_pred))
0.9854271477118486 0.8728770740774442 MSE: 0.03 0.8728770740774442
Какие библиотеки использовать?
pip install xgboost
# xgboost для классификации from numpy import asarray from numpy import mean from numpy import std from sklearn.datasets import make_classification from xgboost import XGBClassifier from sklearn.model_selection import cross_val_score from sklearn.model_selection import RepeatedStratifiedKFold # определяем датасет X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=5, random_state=1) # и нашу модель вместе с кросс-валидацией model = XGBClassifier() cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1) n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise') print('Точность: %.3f (%.3f)' % (mean(n_scores), std(n_scores))) # тренируем модель на всём наборе данных model = XGBClassifier() model.fit(X, y) # предсказываем row = [2.56999479, -0.13019997, 3.16075093, -4.35936352, -1.61271951, -1.39352057, -2.48924933, -1.93094078, 3.26130366, 2.05692145] row = asarray(row).reshape((1, len(row))) yhat = model.predict(row) print('Предсказание (Предикт): %d' % yhat[0])
# xgboost для регрессии from numpy import asarray from numpy import mean from numpy import std from sklearn.datasets import make_regression from xgboost import XGBRegressor from sklearn.model_selection import cross_val_score from sklearn.model_selection import RepeatedKFold # определяем датасет X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, random_state=1) # и нашу модель (в данном примере мы меняем метрику на MAE) model = XGBRegressor(objective='reg:squarederror') cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1) n_scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1, error_score='raise') print('MAE (Средняя Абсолютная Ошибка): %.3f (%.3f)' % (mean(n_scores), std(n_scores))) # тренируем модель на всём наборе данных model = XGBRegressor(objective='reg:squarederror') model.fit(X, y) # предсказываем row = [2.02220122, 0.31563495, 0.82797464, -0.30620401, 0.16003707, -1.44411381, 0.87616892, -0.50446586, 0.23009474, 0.76201118] row = asarray(row).reshape((1, len(row))) yhat = model.predict(row) print('Предсказание (Предикт): %.3f' % yhat[0])
pip install lightgbm
# lightgbm для классификации from numpy import mean from numpy import std from sklearn.datasets import make_classification from lightgbm import LGBMClassifier from sklearn.model_selection import cross_val_score from sklearn.model_selection import RepeatedStratifiedKFold # определяем датасет X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=5, random_state=1) # и нашу модель model = LGBMClassifier() cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1) n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise') print('Точность: %.3f (%.3f)' % (mean(n_scores), std(n_scores))) # тренируем модель на всём наборе данных model = LGBMClassifier() model.fit(X, y) # предсказываем row = [[2.56999479, -0.13019997, 3.16075093, -4.35936352, -1.61271951, -1.39352057, -2.48924933, -1.93094078, 3.26130366, 2.05692145]] yhat = model.predict(row) print('Предсказание (Предикт): %d' % yhat[0])
# lightgbm для регрессии from numpy import mean from numpy import std from sklearn.datasets import make_regression from lightgbm import LGBMRegressor from sklearn.model_selection import cross_val_score from sklearn.model_selection import RepeatedKFold # определяем датасет X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, random_state=1) # и нашу модель (в данном примере мы меняем метрику на MAE) model = LGBMRegressor() cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1) n_scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1, error_score='raise') print('MAE (Средняя Абсолютная Ошибка): %.3f (%.3f)' % (mean(n_scores), std(n_scores))) # тренируем модель на всём наборе данных model = LGBMRegressor() model.fit(X, y) # предсказываем row = [[2.02220122, 0.31563495, 0.82797464, -0.30620401, 0.16003707, -1.44411381, 0.87616892, -0.50446586, 0.23009474, 0.76201118]] yhat = model.predict(row) print('Предсказание (Предикт): %.3f' % yhat[0])
pip install catboost
# catboost для классификации from numpy import mean from numpy import std from sklearn.datasets import make_classification from catboost import CatBoostClassifier from sklearn.model_selection import cross_val_score from sklearn.model_selection import RepeatedStratifiedKFold from matplotlib import pyplot # определяем датасет X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=5, random_state=1) # evaluate the model model = CatBoostClassifier(verbose=0, n_estimators=100) cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1) n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise') print('Точность: %.3f (%.3f)' % (mean(n_scores), std(n_scores))) # тренируем модель на всём наборе данных model = CatBoostClassifier(verbose=0, n_estimators=100) model.fit(X, y) # предсказываем row = [[2.56999479, -0.13019997, 3.16075093, -4.35936352, -1.61271951, -1.39352057, -2.48924933, -1.93094078, 3.26130366, 2.05692145]] yhat = model.predict(row) print('Предсказание (Предикт): %d' % yhat[0])
# catboost для регрессии from numpy import mean from numpy import std from sklearn.datasets import make_regression from catboost import CatBoostRegressor from sklearn.model_selection import cross_val_score from sklearn.model_selection import RepeatedKFold from matplotlib import pyplot # определяем датасет X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, random_state=1) # и нашу модель (в данном примере мы меняем метрику на MAE) model = CatBoostRegressor(verbose=0, n_estimators=100) cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1) n_scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1, error_score='raise') print('MAE (Средняя Абсолютная Ошибка): %.3f (%.3f)' % (mean(n_scores), std(n_scores))) # тренируем модель на всём наборе данных model = CatBoostRegressor(verbose=0, n_estimators=100) model.fit(X, y) # предсказываем row = [[2.02220122, 0.31563495, 0.82797464, -0.30620401, 0.16003707, -1.44411381, 0.87616892, -0.50446586, 0.23009474, 0.76201118]] yhat = model.predict(row) print('Предсказание (Предикт): %.3f' % yhat[0])
Когда использовать?
Плюсы и минусы
- 0 views
- 0 Comment
Свежие комментарии