XGBoost - n_estimators = 1, равный классификатору одного дерева? - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть обучающий конвейер, который интенсивно использует XGBoost вместо scikit-learn, только из-за способа, которым XGBoost чисто обрабатывает нулевые значения.

Тем не менее, передо мной стоит задача познакомить нетехнических людей с машинным обучением, и я подумал, что было бы хорошо взять идею классификатора с одним деревом и поговорить о том, как XGBoost обычно принимает это Структура данных и «ставит его на стероиды». В частности, я хочу построить этот классификатор из одного дерева для отображения точек среза.

Будет ли указывать n_estimators=1 будет примерно эквивалентно использованию DecisionTreeClassifier?

в Scikit

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Если вы поставите n_estimators=1 Это будет именно так, как работает дерево решений. Есть несколько способов разделить узлы (например, gini-index и entropy ), и я не уверен, какой из них использует scikit-learn и какой использует xgboost, но это не так. не имеет значения.

Вы хотите показать основные функции и глубокие идеи построения дерева решений. Я рекомендую после лекции профессора Патрика Уинстона. Я сам использовал его, чтобы продемонстрировать, как деревья решений работают для моих коллег, и все прошло хорошо.

Затем вы можете добавить идею Boosting в микс. Патрик также читает лекцию об этом здесь .

0 голосов
/ 09 ноября 2018
import subprocess

import numpy as np
from xgboost import XGBClassifier, plot_tree

from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn import metrics

import matplotlib.pyplot as plt

RANDOM_STATE = 100
params = {
    'max_depth': 5,
    'min_samples_leaf': 5,
    'random_state': RANDOM_STATE
}

X, y = make_classification(
    n_samples=1000000,
    n_features=5,
    random_state=RANDOM_STATE
)

Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, random_state=RANDOM_STATE)

# __init__(self, max_depth=3, learning_rate=0.1,
# n_estimators=100, silent=True,
# objective='binary:logistic', booster='gbtree',
# n_jobs=1, nthread=None, gamma=0,
# min_child_weight=1, max_delta_step=0,
# subsample=1, colsample_bytree=1, colsample_bylevel=1,
# reg_alpha=0, reg_lambda=1, scale_pos_weight=1,
# base_score=0.5, random_state=0, seed=None, missing=None, **kwargs)
xgb_model = XGBClassifier(
    n_estimators=1,
    max_depth=3,
    min_samples_leaf=5,
    random_state=RANDOM_STATE
)

# __init__(self, criterion='gini',
# splitter='best', max_depth=None,
# min_samples_split=2, min_samples_leaf=1,
# min_weight_fraction_leaf=0.0, max_features=None,
# random_state=None, max_leaf_nodes=None,
# min_impurity_decrease=0.0, min_impurity_split=None,
# class_weight=None, presort=False)
sk_model = DecisionTreeClassifier(
    max_depth=3,
    min_samples_leaf=5,
    random_state=RANDOM_STATE
)

xgb_model.fit(Xtrain, ytrain)
xgb_pred = xgb_model.predict(Xtest)

sk_model.fit(Xtrain, ytrain)
sk_pred = sk_model.predict(Xtest)

print(metrics.classification_report(ytest, xgb_pred))
print(metrics.classification_report(ytest, sk_pred))

plot_tree(xgb_model, rankdir='LR'); plt.show()

export_graphviz(sk_model, 'sk_model.dot'); subprocess.call('dot -Tpng sk_model.dot -o sk_model.png'.split())

Некоторые показатели производительности (я знаю, я не калибровал классификаторы полностью) ...

>>> print(metrics.classification_report(ytest, xgb_pred))
              precision    recall  f1-score   support

           0       0.86      0.82      0.84    125036
           1       0.83      0.87      0.85    124964

   micro avg       0.85      0.85      0.85    250000
   macro avg       0.85      0.85      0.85    250000
weighted avg       0.85      0.85      0.85    250000

>>> print(metrics.classification_report(ytest, sk_pred))
              precision    recall  f1-score   support

           0       0.86      0.82      0.84    125036
           1       0.83      0.87      0.85    124964

   micro avg       0.85      0.85      0.85    250000
   macro avg       0.85      0.85      0.85    250000
weighted avg       0.85      0.85      0.85    250000

И несколько картинок:

scikit xgboost

Таким образом, за исключением любых ошибок / чрезмерных обобщенных расследований, XGBClassifier (и, я бы предположил, Регрессор) с одним оценщиком кажется идентичным с scikit-learn DecisionTreeClassifier с теми же общими параметрами.

...