使用 m2cgen 移植 XGBoost 模型:nan 的存在

问题描述 投票:0回答:1

我遇到了与这篇文章的OP相同的情况。我肯定更愿意看到有关如何从 xgb 模型中提取数据以及如何准确编码其前向传播的文档,但 m2cgen 听起来是一个不错的选择。我使用了以下代码

import xgboost as xgb
import seaborn as sns
import m2cgen as m2c

df = sns.load_dataset("diamonds")

X = df.drop(['cut', 'color', 'clarity', 'price'], axis = 1)
y = df.price

n = X.shape[0]
n_split = int(n*0.75)

model = xgb.XGBRegressor(objective ='reg:squarederror', 
                         max_depth = 2, 
                         n_estimators = 1,
                         eval_metric="rmse")
model.fit(X, y)

with open('./diamonds_model.c','w') as f:
    code = m2c.export_to_c(model)
    f.write(code)

结果我明白了

double score(double * input) {
    double var0;
    if (input[0] >= 0.995) {
        if (input[4] >= 7.1949997) {
            var0 = 3696.243;
        } else {
            var0 = 1841.0602;
        }
    } else {
        if (input[4] >= 5.535) {
            var0 = 922.34973;
        } else {
            var0 = 317.401;
        }
    }
    return nan + var0;
}

所以我想知道我做错了什么以及这个nan来自哪里。我使用的是 python 3.8.5,xgb 打印版本 1.7.3

python machine-learning xgboost
1个回答
1
投票

nan + var0
表达式的 NaN 分量可能对应于 XGBoost 的
base_score
参数(又名“全局偏差”,又名截距)。它似乎没有为您的
XGBRegressor
实例设置,因此它作为默认 (NaN) 值发出。

尝试手动将

base_score
值设置为
0
:

model = xgb.XGBRegressor(base_score = 0, ...)

此问题似乎会影响较新的 XGBoost 版本。另请参阅m2cgen-581

© www.soinside.com 2019 - 2024. All rights reserved.