我一直在使用逻辑回归(LR和start_params作为前一个(训练)数据集和L1正则化获得的参数)来模拟我们的用例(具有一些复杂的特征变换)。我在相同数据的一部分上尝试了Gradient Boosting Classifier,它似乎更适合。传统上,我一直在使用Gradient Boosting Classifier的功能重要性,并将其用作LR的特征工程的反馈。
我认为完全采用Gradient Boosting(GB)的经典障碍是,我不太了解如何制定“学习树”#34;进入它的数学结构。 到目前为止,我主要使用SKLearn文档中的这些classification和regression示例来玩游戏。比较预测。
问题: 我知道Gradient Boosting是一个非参数模型。这是否意味着我永远无法获得数学结构。对不起,如果这听起来非常原始,但我没有将这些投入生产的经验。即,除非我真的学习和实时预测课程,我将如何分类"标签分为一类或其他?如何在生产中使用该模型?
# Fit regression model
params = {'n_estimators': 500, 'max_depth': 4, 'min_samples_split': 1,
'learn_rate': 0.01, 'loss': 'ls'}
clf = ensemble.GradientBoostingRegressor(**params)
pred_object=clf.fit(X_train, y_train)
pred_object
GradientBoostingRegressor(alpha=0.9, init=None, learning_rate=0.01, loss='ls',
max_depth=4, max_features=None, min_samples_leaf=1,
min_samples_split=1, n_estimators=500, random_state=None,
subsample=1.0, verbose=0)
# Next, I get the feature importances,
pred_object.feature_importances_
array([ 3.08111834e-02, 1.44739767e-04, 1.31885157e-02,
2.68202997e-05, 3.01134511e-02, 2.82639689e-01,
7.67647932e-02, 5.90503853e-02, 7.86688625e-03,
2.48124873e-02, 8.52094429e-02, 3.93616279e-02,
3.50009978e-01])
我深入研究dir(pred_object)
,但无法找到我能立即理解的东西。考虑到特征重要性数组,损失函数=' ls' alpha& amp;是否有可能将特定的数学结构放入其中。其他参数?或者,因为它是一棵树,它总是会尝试重新平衡"给出更多数据点(测试集),当试图预测新数据点的类时?
答案 0 :(得分:0)
有两种方法可以将GBM"推向生产"。
1非常明显。将生产数据分解为可管理的块,并在运行模型的其他计算机上对每个块进行评分。这需要一些工作来构建基础架构,但您不需要更改任何建模代码。
2有点难以理解:基于树的模型的核心是if-else语句的集合:
if var1>10 and var2<3 then outcome = 0
else if var1<10 and var2<3 then outcome = 1
else if var2<10 and var2<1 then outcome = 0
等
这些语句很容易在基于SQL的数据库中编码,并且在大多数编程语言中也很容易编码。如果您可以在python中循环遍历GBM中的每个树并将其转换为SQL语句,则可以通过运行每个SQL语句并将其乘以GBM中的正确权重来对生产中的模型进行评分。这需要您将模型转码为另一种语言,但它可以让您为数据打分而不会将其从数据存储中拉出来。
答案 1 :(得分:0)
渐变增强,以及经典决策树和随机森林,都属于所谓的树木建模或树木方法。这意味着他们的评分逻辑通常只是&#34;如果那时,否则如果.. else&#34;。不确定这是否符合“数学结构”的要求。我想不是。
根据需要数学构造的目的,我可以跟进以后扩展。我怀疑也许建立的GB模型的观察或行式贡献计算可能是问题背后的动机。
答案 2 :(得分:0)
SKompiler库可以通过将您训练有素的模型转换为SQL(或多种其他语言)的表达式来提供帮助。
from skompiler import skompile
import sys
sys.setrecursionlimit(10000) # Necessary for models with many estimators
expr = skompile(gbr.predict)
您现在可以获取模型的SQL形式:
sql_code = expr.to('sqlalchemy/sqlite')
或将其翻译为C代码(至少在GradientBoostingRegressor的情况下,它与其他类似C的语言,例如C ++ / C#/ Java / Javascript兼容)
c_code = expr.to('sympy/c')
或Rust:
rust_code = expr.to('sympy/rust')
或R:
r_code = expr.to('sympy/r')
甚至是Excel公式:
excel_code = expr.to('excel')
(但是,使用n_estimators=500
,您将无法将其粘贴到Excel单元格中,因为该公式将比Excel允许的最多8196个字符长)
最后,将编译器从SKompiler expr
对象编写为部署可能需要的表示形式或代码并不太复杂。