我有一些培训管道大量使用XGBoost而不是scikit-learn,这仅仅是因为XGBoost干净地处理空值的方式。
但是,我的任务是将非技术人员介绍给机器学习,并认为最好采用单树分类器的想法,并讨论XGBoost通常如何使用数据结构并“将其放入类固醇”。具体来说,我想绘制此单树分类器以显示切点。
将n_estimators=1
指定为大致等同于使用scikit的DecisionTreeClassifier
吗?
答案 0 :(得分:3)
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
还有一些图片:
因此,除非有任何调查错误/普遍化,否则XGBClassifier
(我认为是Regressor)的估计量似乎与的scikit学习DecisionTreeClassifier
相同相同的共享参数。
答案 1 :(得分:0)
如果您输入n_estimators=1
,它将完全是决策树的工作方式。有几种分割节点的方法(例如 gini-index 和 entropy ),但我不确定使用哪种scikit-learn和使用哪种xgboost,但是我不确定没关系。
您想展示构建决策树的核心功能和深刻想法。我推荐Patrick Winston教授的following Lecture。我自己使用它来演示决策树如何对我的同龄人起作用,并且进展顺利。
然后,您可以将Boosting的想法添加到组合中。帕特里克(Patrick)也in here对此进行了演讲。
答案 2 :(得分:0)
设置XGBoost n_estimators = 1使该算法生成一棵单树(基本上没有提升),类似于sklearn-DecisionTreeClassifier的单树算法。
但是,可以调整的超参数和树的生成过程在这两者中是不同的。尽管sklearn DecisionTreeClassifier允许您比xgboost调整更多的超参数,但是xgboost在调整超参数后将产生更好的准确性。 xgboost生成的单棵树比sklearn DecisionTreeClassifier生成的单棵树要好。
xgboost的另一个优点是它可以自行处理丢失的值。在DecisionTreeClassifier中,我们必须显式定义一个函数来处理可能导致不同结果的缺失值。
因此,在sklearn DecisionTreeClassifier上使用n_estimators = 1进行xgboost!