我遇到了与这篇文章的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
nan + var0
表达式的 NaN 分量可能对应于 XGBoost 的 base_score
参数(又名“全局偏差”,又名截距)。它似乎没有为您的 XGBRegressor
实例设置,因此它作为默认 (NaN) 值发出。
尝试手动将
base_score
值设置为 0
:
model = xgb.XGBRegressor(base_score = 0, ...)
此问题似乎会影响较新的 XGBoost 版本。另请参阅m2cgen-581。