【问题标题】:Obtaining coefficients for xgboost linear model获取 xgboost 线性模型的系数
【发布时间】:2021-05-12 09:12:10
【问题描述】:

我正在使用Learning API 版本的 xgboost。我想使用它来获取线性模型的系数,但它会导致错误AttributeError: 'Booster' object has no attribute 'coef_'。 Learning API 文档似乎没有说明如何检索系数。

###xtrain and ytrain are numpy arrays
dtrain = xgb.DMatrix(xtrain, label=ytrain)
dtest = xgb.DMatrix(xtest, label=ytest)
param = {'eta':0.3125, 'objective': 'binary:logistic' 'nthread':8, 'eval_metric':'auc', 'booster':'gblinear', 'max_depth':12}
model = xgb.train(param, dtrain, 60, [(dtrain, 'train'), (dtest, 'eval')], verbose_eval = 5, early_stopping_rounds = 12)
print(model.coef_) #results in an error

我尝试使用XGBRegressor 构建上述模型的等效版本,因为它确实具有属性coef_,但该模型确实返回了非常不同的预测。我查看了有关此主题的先前答案(12),这似乎暗示n_estimators 实际上与num_boost_round 相同,并且将提供相同的预测。但尽管考虑到这一点,基于以下参数的预测却大不相同。这个模型被证明是非常保守的。此外,从文档中,nthreadn_jobs 相同。我看不出两者的参数有任何其他差异。

model = XGBRegressor(n_estimators = 60, learning_rate = 0.3125, max_depth = 12, objective = 'binary:logistic', booster = 'gblinear', n_jobs = 8)
model = model.fit(xtrain, ytrain, eval_metric = 'auc', early_stopping_rounds = 12, eval_set = [(xtest, ytest)])
predictions = model.predict(xtrain, ntree_limit = 0) # need to include ntree_limit because of bug associated with early_stopping_rounds for gblinear

我的问题是:

  1. 有没有办法为使用xgb.train 为线性模型构建的模型获取系数,如果可以,我该怎么做?
  2. 如果不是,为什么XGBRegressor 会给我不同的结果?

【问题讨论】:

    标签: python machine-learning scikit-learn xgboost


    【解决方案1】:

    对于第一个问题,您可以通过将模型转储到文件来获得权重:

    bst.dump_model('path/dump.raw.txt')
    

    与sklearn dump不同,这里的dump是用来解释的,所以这些权重不能加载回xgboost。

    然后dump.raw.txt 将如下所示:

    booster[0]:
    bias:
    0.0102652
    weight:
    -0.000597852
    0.0400338
    -0.00014682
    0.00499299
    0.0111505
    -0.092625
    -0.0132113
    -0.00796503
    0.00351845
    0.00833504
    0.0219131
    -0.00388152
    -0.000771679
    -0.00585201
    0.00893034
    -0.00267784
    -0.000711578
    -0.00535324
    -0.0062664
    -0.00439571
    

    对于 2. 来自文档的问题 (xgboost-linear-model-params):

    “将 gblinear booster 与 shotgun updater 一起使用是不确定的,因为它使用的是 Hogwild 算法。”

    因此,shotgun 更新程序会导致不同运行的结果不确定。要获得确定性,您可以在参数中按如下方式设置更新程序:

    'updater':'coord_descent'
    

    那么您的参数将如下所示:

    {'updater':'coord_descent', 'eta':0.3125, 'objective': 'binary:logistic' 'nthread':8, 'eval_metric':'auc', 'booster':'gblinear', 'max_depth':12}
    

    然后我注意到 xgb.train() 生成的模型有一个 predict() 方法,该方法与 XGBRegressor 的 predict_proba 方法兼容,因此您必须对此结果进行比较。

    【讨论】:

    • 谢谢。这确实有助于解决第一个问题。但是对于第二个问题,将'updater':'coord_descent'xgb.train() 添加到模型的参数中,似乎仍然没有使两组预测接近。
    • 你比较过权重吗?
    • 我可以看出差异是由不同的实现(您正在比较不同的 api)、采样和集成模型的性质引起的。但是,尽管模型之间存在差异,但我预计 2 个结果集之间的偏差不会很大。
    • 谢谢,但是xgb.train() 模型预测的值大约是XGBRegressor() 值的两倍。看来XGBRegressor() 的预测也过于保守了。
    • 另外,根据我在问题中提供的链接(即12),似乎可以跨 api 进行复制。
    猜你喜欢
    • 2013-10-14
    • 2013-03-24
    • 2017-12-07
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    相关资源
    最近更新 更多