напиши первым
В конкуренции данных незаменим GBM (Gredient Boosting Machine), наиболее распространенными из которых являются XGBoost и LightGBM.
Модель особенно важна в соревновании данных, но на самом деле во время соревнования большинство друзей тратят относительно мало времени на модель, и все, как правило, тратят драгоценное время на извлечение признаков и моделирование.Интегрируйте эти аспекты. В реальном бою мы сначала проведем демонстрацию базовой линии, чтобы как можно быстрее раскрыть потенциал модели, чтобы позже мы могли потратить нашу энергию на объединение функций и моделей. Здесь вам понадобятся некоторые навыки настройки.
В этой статье для обсуждения и исследования выбрано более десяти важных параметров из более чем ста параметров этих двух моделей. И показать вам быстрый и легкий способ настройки параметров. Конечно, друзья, у которых более высокие требования, все равно должны тыкатьLightGBMиXGBoostЭти две официальные ссылки на документацию.
Для лучшего эксперимента я поместил предварительно обработанные данные вОблако Байдуначальство. Нажмите на ссылку, чтобы скачать.
Некоторые важные параметры XGBoost
Параметры XGBoost делятся на три категории:
- Общие параметры: Управление макросами.
- Параметры бустера: Управляйте бустером (дерево/регрессия) каждого шага. Параметр бустера обычно может управлять эффектом и вычислительной стоимостью модели. Когда мы говорим о настройке параметров, мы в значительной степени настраиваем параметры бустера.
- Целевые параметры обучения: контролирует эффективность тренировочной цели. Наше разделение проблемы в основном отражается в параметрах цели обучения. Например, хотим ли мы выполнить классификацию или регрессию, бинарную классификацию или множественную классификацию, все это обеспечивается целевыми параметрами.
Примечание. Параметры, представленные ниже, я считаю более важными. Нажмите, чтобы просмотреть полные параметры.официальная документация
Общие параметры
-
booster
: У нас есть два варианта параметра,gbtree
иgblinear
. gbtree использует древовидную структуру для запуска данных, тогда как gblinear основан на линейной модели. -
silent
: беззвучный режим, для1
Когда модель работает, выходных данных нет. -
nthread
: количество используемых потоков, обычно мы устанавливаем его на-1
, использовать все темы. При необходимости мы устанавливаем столько, сколько потоков использовать.
Параметры бустера
-
n_estimator
: тоже делаюnum_boosting_rounds
Это количество сгенерированных самых больших деревьев, а также наибольшее количество итераций.
-
learning_rate
: иногда называетсяeta
, системное значение по умолчанию0.3
,.Размер шага каждой итерации очень важен. Если он слишком велик, точность бега невысокая, а если слишком мала, скорость бега низкая. Обычно мы используем меньшее значение, чем значение по умолчанию,
0.1
Правильно или так хорошо. -
gamma
: система по умолчанию0
, мы также используем0
.Когда узел разделен, узел будет разделен только в том случае, если значение функции потерь упадет после разделения.
gamma
Задает функцию минимального снижения потерь, необходимую для разделения узлов. Чем больше значение этого параметра, тем более консервативным будет алгоритм. так какgamma
Когда значение больше, функция потерь больше уменьшается перед разделением узла. Поэтому нелегко разделить узлы при создании дерева. Сфера:[0,∞]
-
subsample
: система по умолчанию1
.Этот параметр управляет долей случайной выборки для каждого дерева. Уменьшение значения этого параметра делает алгоритм более консервативным и позволяет избежать переобучения. Однако, если это значение установлено слишком маленьким, это может привести к недообучению. Типичное значение:
0.5-1
,0.5
Представляет среднюю выборку для предотвращения переобучения.(0,1]
,Обратите внимание, что 0 нежелательно -
colsample_bytree
: системное значение по умолчанию — 1. Обычно мы устанавливаем его около 0,8.Используется для управления пропорцией количества столбцов, выбранных случайным образом для каждого дерева (каждый столбец является функцией). Типичное значение:
0.5-1
Сфера:(0,1]
-
colsample_bylevel
: по умолчанию 1, который мы также установили в 1.Это более подробно, чем предыдущее, и относится к коэффициенту выборки столбцов, когда каждый узел разделен в каждом дереве.
-
max_depth
: системное значение по умолчанию6
мы используем
3-10
числа между ними. Это значение является максимальной глубиной дерева. Это значение используется для контроля переобучения.max_depth
Чем больше значение, тем конкретнее учится модель. Установить как0
Не представляет ограничений, диапазон:[0,∞]
-
max_delta_step
:дефолт0
, мы часто используем0
.Этот параметр ограничивает максимальный размер шага каждого изменения веса дерева, если значение этого параметра
0
, значит ограничений нет. Если ему задано определенное положительное значение, алгоритм более консервативен. Обычно нам не нужно устанавливать этот параметр, но когда выборки каждого класса крайне несбалансированы, этот параметр очень полезен для оптимизатора логистической регрессии. -
lambda
: также называемыйreg_lambda
, значение по умолчанию0
.Член регуляризации L2 для весов. (Аналогично регрессии Риджа). Этот параметр используется для управления частью регуляризации XGBoost. Этот параметр полезен для уменьшения переобучения.
-
alpha
: также называемыйreg_alpha
По умолчанию0
,Член регуляризации L1 для весов. (Аналогично регрессии Лассо). Его можно применять к очень большим размерам, что делает алгоритм быстрее.
-
scale_pos_weight
: по умолчанию1
Когда выборки каждой категории очень несбалансированные, установка положительного значения этого параметра может ускорить сходимость алгоритма. Обычно его можно установить как отношение количества отрицательных образцов к количеству положительных образцов.
Целевые параметры обучения
цель [по умолчанию=reg:linear]
-
reg:linear
- Линейная регрессия -
reg:logistic
- логистическая регрессия -
binary:logistic
– Бинарная логистическая регрессия с выходами в виде вероятностей -
binary:logitraw
– Бинарная логистическая регрессия, выход wTx -
count:poisson
– Регрессия Пуассона задачи подсчета, выход – распределение Пуассона. В регрессии Пуассона значение max_delta_step по умолчанию равно 0,7 (используется для защиты оптимизации). -
multi:softmax
- Установите XGBoost для использования целевой функции softmax для мультиклассификации, вам необходимо установить параметр num_class (количество категорий) -
multi:softprob
– То же, что и softmax, но на выходе получается вектор ndata*nclass, где значением является вероятность того, что каждые данные разделены на каждый класс.
eval_metric [по умолчанию = выбрать по целевой функции]
-
rmse
: Средняя квадратическая ошибка -
mae
: ошибка среднего абсолютного значения -
logloss
: negative log-likelihood -
error
: частота ошибок бинарной классификации. Его значение получается отношением количества ошибочных классификаций к общему количеству классификаций. Для прогнозов предсказанные значения больше 0,5 считаются положительными, другие классифицируются как отрицательные. error@t: с помощью 't' можно установить разные пороги деления. -
merror
: Частота ошибок при множественной классификации, рассчитанная как (неправильные случаи)/(все случаи) -
mlogloss
: Многоклассовая потеря журнала -
auc
: площадь под кривой -
ndcg
: Normalized Discounted Cumulative Gain -
map
: Средняя правильная скорость
Как правило, мы будем использоватьxgboost.train(params, dtrain)
функция для обучения нашей модели. здесьparams
Относитсяbooster
параметр.
два основных примера
На что мы должны обратить внимание, так это на то, что, когда мы хотим выполнить обработку бинарной классификации в xgboost, мы толькоobjective
установлен вbinary
, вы обнаружите, что вывод по-прежнему представляет собой набор последовательных значений. Это связано с тем, что он выводит наибольшее значение из всех вероятностей, предсказанных моделью. Затем мы можем условно обработать эти вероятности, чтобы получить окончательную категорию, или вызватьxgboost
серединаXGBClassifier()
class, но эти две функции написаны по-разному. Посмотрите на мой пример ниже.
import xgboost as xgb
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
train_data = pd.read_csv('train.csv') # 读取数据
y = train_data.pop('30').values # 用pop方式将训练数据中的标签值y取出来,作为训练目标,这里的‘30’是标签的列名
col = train_data.columns
x = train_data[col].values # 剩下的列作为训练数据
train_x, valid_x, train_y, valid_y = train_test_split(x, y, test_size=0.333, random_state=0) # 分训练集和验证集
train = xgb.DMatrix(train_x, train_y)
valid = xgb.DMatrix(valid_x, valid_y) # train函数下需要传入一个Dmatrix值,具体用法如代码所示
params = {
'max_depth': 15,
'learning_rate': 0.1,
'n_estimators': 2000,
'min_child_weight': 5,
'max_delta_step': 0,
'subsample': 0.8,
'colsample_bytree': 0.7,
'reg_alpha': 0,
'reg_lambda': 0.4,
'scale_pos_weight': 0.8,
'silent': True,
'objective': 'binary:logistic',
'missing': None,
'eval_metric': 'auc',
'seed': 1440,
'gamma': 0
} # 这里的params特指booster参数,注意这个eva_metric是评估函数
xlf = xgb.train(params, train, evals=[(valid, 'eval')],
num_boost_round=2000, early_stopping_rounds=30, verbose_eval=True)
# 训练,注意验证集的写法, 还有early_stopping写法,这里指的是30轮迭代中效果未增长便停止训练
y_pred = xlf.predict(valid_x, ntree_limit=xlf.best_ntree_limit)
# xgboost没有直接使用效果最好的树作为模型的机制,这里采用最大树深限制的方法,目的是获取刚刚early_stopping效果最好的,实测性能可以
auc_score = roc_auc_score(valid_y, y_pred) # 算一下预测结果的roc值
Вышеxgboost.train()
Написание, это самая примитивная функция инкапсуляции xgboost. Таким образом, наш результат прогнозирования представляет собой серию непрерывных значений, которые представляют собой значение вероятности xgboost с наибольшей вероятностью в этих категориях. Если мы хотим получить результаты нашей классификации, нам нужно выполнить другие операции.
К счастью, чтобы соответствовать использованию sklearn, например, gridsearch, xgboost разработалXGBoostClassifier()
иXGBoostRegression()
две функции. Классификацию и регрессионную обработку можно выполнять проще и быстрее. Обратите внимание, что пакет sklearn для xgboost неfeature_importance
эта мера, ноget_fscore()
функции имеют одинаковую функциональность. Конечно, чтобы соответствовать sklearn, метод записи также изменился.Подробности см. в следующем коде:
import xgboost as xgb
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
train_data = pd.read_csv('train.csv') # 读取数据
y = train_data.pop('30').values # 用pop方式将训练数据中的标签值y取出来,作为训练目标,这里的‘30’是标签的列名
col = train_data.columns
x = train_data[col].values # 剩下的列作为训练数据
train_x, valid_x, train_y, valid_y = train_test_split(x, y, test_size=0.333, random_state=0) # 分训练集和验证集
# 这里不需要Dmatrix
xlf = xgb.XGBClassifier(max_depth=10,
learning_rate=0.01,
n_estimators=2000,
silent=True,
objective='binary:logistic',
nthread=-1,
gamma=0,
min_child_weight=1,
max_delta_step=0,
subsample=0.85,
colsample_bytree=0.7,
colsample_bylevel=1,
reg_alpha=0,
reg_lambda=1,
scale_pos_weight=1,
seed=1440,
missing=None)
xlf.fit(train_x, train_y, eval_metric='error', verbose=True, eval_set=[(valid_x, valid_y)], early_stopping_rounds=30)
# 这个verbose主要是调节系统输出的,如果设置成10,便是每迭代10次就有输出。
# 注意我们这里eval_metric=‘error’便是准确率。这里面并没有accuracy命名的函数,网上大多例子为auc,我这里特意放了个error。
y_pred = xlf.predict(valid_x, ntree_limit=xlf.best_ntree_limit)
auc_score = roc_auc_score(valid_y, y_pred)
y_pred = xlf.predict(valid_x, ntree_limit=xlf.best_ntree_limit)
# xgboost没有直接使用效果最好的树作为模型的机制,这里采用最大树深限制的方法,目的是获取刚刚early_stopping效果最好的,实测性能可以
auc_score = roc_auc_score(valid_y, y_pred) # 算一下预测结果的roc值
Итак, мы ввели так много, и ключевой момент: как быстро и качественно настроить параметры? Прежде всего, нам нужно понять, каков принцип поиска по сетке.
Введение в GridSearch
Это метод настройки параметров;исчерпывающий поиск: Среди всех возможных вариантов выбора параметра, просматривая и пробуя каждую возможность, наиболее эффективный параметр является окончательным результатом. Принцип подобен поиску максимального значения в массиве. (Почему это называется поиском по сетке? Взяв модель с двумя параметрами в качестве примера, есть 3 возможности для параметра a и 4 возможности для параметра b. Перечислите все возможности, которые могут быть выражены в виде таблицы 3*4, в которой каждая ячейка A представляет собой сетку, и циклический процесс подобен обходу и поиску в каждой сетке, поэтому он называется поиском по сетке)
По сути, это то же самое, что и наш обычно используемый обход. Рекомендуется использовать функцию GridSearch в sklearn, которая является краткой и быстрой.
import xgboost as xgb
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
train_data = pd.read_csv('train.csv') # 读取数据
y = train_data.pop('30').values # 用pop方式将训练数据中的标签值y取出来,作为训练目标,这里的‘30’是标签的列名
col = train_data.columns
x = train_data[col].values # 剩下的列作为训练数据
train_x, valid_x, train_y, valid_y = train_test_split(x, y, test_size=0.333, random_state=0) # 分训练集和验证集
# 这里不需要Dmatrix
parameters = {
'max_depth': [5, 10, 15, 20, 25],
'learning_rate': [0.01, 0.02, 0.05, 0.1, 0.15],
'n_estimators': [500, 1000, 2000, 3000, 5000],
'min_child_weight': [0, 2, 5, 10, 20],
'max_delta_step': [0, 0.2, 0.6, 1, 2],
'subsample': [0.6, 0.7, 0.8, 0.85, 0.95],
'colsample_bytree': [0.5, 0.6, 0.7, 0.8, 0.9],
'reg_alpha': [0, 0.25, 0.5, 0.75, 1],
'reg_lambda': [0.2, 0.4, 0.6, 0.8, 1],
'scale_pos_weight': [0.2, 0.4, 0.6, 0.8, 1]
}
xlf = xgb.XGBClassifier(max_depth=10,
learning_rate=0.01,
n_estimators=2000,
silent=True,
objective='binary:logistic',
nthread=-1,
gamma=0,
min_child_weight=1,
max_delta_step=0,
subsample=0.85,
colsample_bytree=0.7,
colsample_bylevel=1,
reg_alpha=0,
reg_lambda=1,
scale_pos_weight=1,
seed=1440,
missing=None)
# 有了gridsearch我们便不需要fit函数
gsearch = GridSearchCV(xlf, param_grid=parameters, scoring='accuracy', cv=3)
gsearch.fit(train_x, train_y)
print("Best score: %0.3f" % gsearch.best_score_)
print("Best parameters set:")
best_parameters = gsearch.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):
print("\t%s: %r" % (param_name, best_parameters[param_name]))
Мы должны отметить, что Grid Search требует поддержки перекрестной проверки. здесьcv=3
, является целым числом, что означает 3-кратную проверку. На самом деле cv может быть объектом или каким-либо другим типом. Они представляют разные способы проверки. Подробности см. в следующем заявлении.
Possible inputs for cv are:
- None, to use the default 3-fold cross-validation,
- integer, to specify the number of folds.
- An object to be used as a cross-validation generator.
- An iterable yielding train/test splits.