LightGBM в машинном обучении
Руководство по машинному обучению на классификаторе LightGBM
LightGBM – это классификатор повышения градиента в машинном обучении, который использует древовидные алгоритмы обучения. Он спроектирован так, чтобы быть распределенным и эффективным с более высокой скоростью привода и более высокой эффективностью, меньшим использованием памяти и большей точностью. В этой статье я познакомлю вас с LightGBM в машинном обучении и его реализацией через Python.
Что такое LightGBM в машинном обучении?
В машинном обучении классификатор LightGBM является частью семейства Boosting, и сегодня это самая распространенная модель классификации в сообществе машинного обучения. LightGBM – это мощная модель машинного обучения, которую можно формировать в зависимости от задачи, над которой вы работаете.
Скажем, вы работаете над задачей регрессии, и должны использовать модель регрессора LightGBM, а если вы работаете над задачей классификации, то должны использовать модель классификатора LightGBM.
В этой статье я представлю руководство по модели LightGBM в задаче классификации. Но в целом она поддерживает следующие приложения:
- классификация
- регресс
- двоичная классификация
- мульти-классификация
- кросс-энтропия
Руководство по LightGBM
Теперь давайте начнем с руководства по LightGBM в машинном обучении. Я начну эту задачу с импорта необходимых библиотек Python и набора данных:
import numpy as np # linear algebra import pandas as pd # data processing import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline import seaborn as sns import matplotlib.style as style from matplotlib import pyplot from matplotlib.ticker import ScalarFormatter from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.model_selection import GridSearchCV import lightgbm as lgb from lightgbm import LGBMClassifier import random pd.set_option("display.max_rows",None) pd.set_option("display.max_columns",None) train_data = pd.read_csv("train.csv.zip") test_data = pd.read_csv("test.csv.zip")
Набор данных, который я здесь использую, представляет собой набор данных классификации, в котором задача состоит в том, чтобы классифицировать существо. В целевой функции есть 3 класса: гули, гоблины и призраки. Мы постараемся предсказать класс существа на основе независимых характеристик.
А теперь, прежде чем двигаться дальше, давайте взглянем на тренировочный и тестовый наборы:
train_data.head()
Результат:
id |
bone_length |
rotting_flesh |
hair_length |
has_soul |
color |
type |
|
---|---|---|---|---|---|---|---|
0 |
0 |
0.354512 |
0.350839 |
0.465761 |
0.781142 |
clear |
Ghoul |
1 |
1 |
0.575560 |
0.425868 |
0.531401 |
0.439899 |
green |
Goblin |
2 |
2 |
0.467875 |
0.354330 |
0.811616 |
0.791225 |
black |
Ghoul |
3 |
4 |
0.776652 |
0.508723 |
0.636766 |
0.884464 |
black |
Ghoul |
4 |
5 |
0.566117 |
0.875862 |
0.418594 |
0.636438 |
green |
Ghost |
Подготовка данных:
Давайте подготовим tarin_data для классификатора LightGBM. Я изменю тип категориального столбца с «color», а также изменю целевой столбец, «type», на Общее. Столбец цвета является номинальным, поэтому мы будем использовать горячее кодирование, но в Pandas есть функция get_dummies, которая здесь будет очень полезна, проста в использовании и делает то же самое с горячим кодированием.
Столбец «type» также является номинальным, но в качестве целевого столбца мы должны использовать «Кодировщик меток». Я покажу вам 2 подхода к преобразованию категориальных столбцов. Один из них – Кодировщик меток, а другой – функция карты. Вы можете использовать тот, который больше нравится:
train_data = pd.get_dummies(train_data, columns=["color"], prefix=["color"]) map_type = {"Ghoul":1, "Goblin":2, "Ghost":0} # change ghoul, goblin, ghost to 1, 2 and 0 train_data.loc[:, "type"] = train_data.type.map(map_type) train_data = train_data.set_index('id')
Независимые характеристики обозначаются буквой «X», а зависимая функция – буквой «y». На тесты отведено 40% train_data:
X = train_data.drop(["type"],axis=1) y = train_data.type X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42)
Классификатор LightGBM
Прежде всего, нам нужно определить параметры и интервалы. Параметры должны быть определены в словаре. Модель классификации LightGBM будет проверять все установленные нами интервалы и пытаться найти оптимальные настройки, чтобы получить лучший результат. Вы можете добавить больше параметров, если хотите, но помните, что чем больше параметров, тем больше времени потребуется на обработку:
param_grid = { 'class_weight': [None, 'balanced'], 'boosting_type': ['gbdt', 'goss', 'dart'], 'num_leaves': list(range(30, 150)), 'learning_rate': [0.01,0.1,0.5], 'subsample_for_bin': [20000,50000,100000,120000,150000], 'min_child_samples': [20,50,100,200,500], 'colsample_bytree': [0.6,0.8,1], "max_depth": [5,10,50,100] } lgbm = LGBMClassifier() # Shortname the LGBMClassifier() lgbm.fit(X_train, y_train) # Train the lgbm on train sets
Всего внесено применено 3,240,000 регулировок, продолжительность обработки составила 8 часов 46 минут. Очень долго, и если вы добавите больше параметров, время еще возрастет:
lgbm_tuned = LGBMClassifier(boosting_type = 'gbdt', class_weight = None, min_child_samples = 20, num_leaves = 30, subsample_for_bin = 20000, learning_rate=0.01, max_depth=10, n_estimators=40, colsample_bytree=0.6) # LightGBM Classifier with optimum paramteres lgbm_tuned.fit(X_train, y_train) y_test_pred = lgbm_tuned.predict(X_test) #Predicting X_test to find the solutiın score = round(accuracy_score(y_test, y_test_pred), 3) # Find the accuracy of y_test and predicitons, and round the result print(score)
Результат:
0.718
И наконец, давайте посмотрим, каким функциям модель придает большее значение:
sns.set_context("talk") style.use('fivethirtyeight') fi = pd.DataFrame() fi['features'] = X.columns.values.tolist() fi['importance'] = lgbm_tuned.booster_.feature_importance(importance_type='gain') sns.barplot(x='importance', y='features', data=fi.sort_values(by='importance', ascending=True))
Вы можете получить весь код Python, используемый в этом руководстве по классификатору LightGBM в машинном обучении, снизу.
import numpy as np # linear algebra import pandas as pd # data processing import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline import seaborn as sns import matplotlib.style as style from matplotlib import pyplot from matplotlib.ticker import ScalarFormatter from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.model_selection import GridSearchCV import lightgbm as lgb from lightgbm import LGBMClassifier import random pd.set_option("display.max_rows",None) pd.set_option("display.max_columns",None) train_data = pd.read_csv("train.csv.zip") test_data = pd.read_csv("test.csv.zip") train_data.head() train_data = pd.get_dummies(train_data, columns=["color"], prefix=["color"]) map_type = {"Ghoul":1, "Goblin":2, "Ghost":0} # change ghoul, goblin, ghost to 1, 2 and 0 train_data.loc[:, "type"] = train_data.type.map(map_type) train_data = train_data.set_index('id') X = train_data.drop(["type"],axis=1) y = train_data.type X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42) param_grid = { 'class_weight': [None, 'balanced'], 'boosting_type': ['gbdt', 'goss', 'dart'], 'num_leaves': list(range(30, 150)), 'learning_rate': [0.01,0.1,0.5], 'subsample_for_bin': [20000,50000,100000,120000,150000], 'min_child_samples': [20,50,100,200,500], 'colsample_bytree': [0.6,0.8,1], "max_depth": [5,10,50,100] } lgbm = LGBMClassifier() # Shortname the LGBMClassifier() lgbm.fit(X_train, y_train) # Train the lgbm on train sets lgbm_tuned = LGBMClassifier(boosting_type = 'gbdt', class_weight = None, min_child_samples = 20, num_leaves = 30, subsample_for_bin = 20000, learning_rate=0.01, max_depth=10, n_estimators=40, colsample_bytree=0.6) # LightGBM Classifier with optimum paramteres lgbm_tuned.fit(X_train, y_train) y_test_pred = lgbm_tuned.predict(X_test) #Predicting X_test to find the solutiın score = round(accuracy_score(y_test, y_test_pred), 3) # Find the accuracy of y_test and predicitons, and round the result print(score) sns.set_context("talk") style.use('fivethirtyeight') fi = pd.DataFrame() fi['features'] = X.columns.values.tolist() fi['importance'] = lgbm_tuned.booster_.feature_importance(importance_type='gain') sns.barplot(x='importance', y='features', data=fi.sort_values(by='importance', ascending=True))
Надеюсь, вам понравилась эта статья о LightGBM в машинном обучении с использованием Python.