×

NGBoost 梯度提升方法

hqy hqy 发表于2025-03-02 21:57:41 浏览8 评论0百度已收录

抢沙发发表评论

Natural Gradient Boosting for Probabilistic Prediction

来自斯坦福的研究者们提出了 NGBoost 梯度提升方法以解决现有梯度提升方法难以处理的通用概率预测中的技术难题。

自然梯度提升(NGBoost / Natural Gradient Boosting)是一种算法,其以通用的方式将概率预测能力引入到了梯度提升中。预测式不确定性估计在医疗和天气预测等很多应用中都至关重要。概率预测是一种量化这种不确定性的自然方法,这种模型会输出在整个结果空间上的完整概率分布。梯度提升机(Gradient Boosting Machine)已经在结构化输入数据的预测任务上取得了广泛的成功,但目前还没有用于实数值输出的概率预测的简单提升方案。NGBoost 这种梯度提升方法使用了自然梯度(Natural Gradient),以解决现有梯度提升方法难以处理的通用概率预测中的技术难题。这种新提出的方法是模块化的,基础学习器、概率分布和评分标准都可灵活选择。研究者在多个回归数据集上进行了实验,结果表明 NGBoost 在不确定性估计和传统指标上的预测表现都具备竞争力。

论文:https://arxiv.org/pdf/1910.03225v1.pdf

github:https://github.com/stanfordmlgroup/ngboost

NGBoost:自然梯度提升

NGBoost 算法是一种用于概率预测的监督学习方法,其实现提升的方式是以函数形式预测条件概率分布的参数。具体算法如下:

实验

首先安装,斯坦福的ngboost框架

pip3 install git+https://github.com/stanfordmlgroup/ngboost

简单案例代码

from ngboost.ngboost import NGBoostfrom ngboost.learners import default_tree_learnerfrom ngboost.scores import MLEfrom ngboost.distns import Normalfrom sklearn.datasets import load_bostonfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import mean_squared_error# 获取波士顿数据集X, Y = load_boston(True)# 随机切分数据集X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)ngb = NGBoost(Base=default_tree_learner, Dist=Normal, Score=MLE(), natural_gradient=True,              verbose=False)# 拟合ngb.fit(X_train, Y_train)# 预测Y_preds = ngb.predict(X_test)Y_dists = ngb.pred_dist(X_test)# 检验均方误差 test Mean Squared Errortest_MSE = mean_squared_error(Y_preds, Y_test)print(Test MSE, test_MSE)# 检验负对数似然test Negative Log Likelihoodtest_NLL = -Y_dists.logpdf(Y_test.flatten()).mean()print(Test NLL, test_NLL)

再看一个回归的例子:

import numpy as npimport scipy as spimport scipy.statsfrom ngboost.distns import Normal, Laplacefrom ngboost.ngboost import NGBoostfrom ngboost.scores import MLE, CRPS, MLE_SURV, CRPS_SURVfrom ngboost.learners import default_tree_learner, default_linear_learnerfrom ngboost.evaluation import *from examples.loggers.loggers import RegressionLoggerfrom sklearn.metrics import r2_scorefrom matplotlib import pyplot as pltfrom argparse import ArgumentParserif __name__ == __main__: argparser = ArgumentParser() argparser.add_argument("--lr", type=float, default=0.1) argparser.add_argument("--dataset", type=str, default="simulated") argparser.add_argument("--noise-lvl", type=float, default=0.25) argparser.add_argument("--distn", type=str, default="Normal") argparser.add_argument("--natural", action="store_true") argparser.add_argument("--score", type=str, default="CRPS") args = argparser.parse_args() m, n = 1200, 50 noise = np.random.randn(*(m, 1)) beta1 = np.random.randn(n, 1) beta2 = np.random.randn(n, 1) X = np.random.randn(m, n) / np.sqrt(n) Y = X @ beta1 + args.noise_lvl * np.sqrt(np.exp(X @ beta2)) * noise print(X.shape, Y.shape) X_train, X_test = X[:1000,:], X[1000:,] Y_train, Y_test = Y[:1000], Y[1000:] ngb = NGBoost(n_estimators=150, learning_rate=args.lr, Dist=Laplace, Base=default_linear_learner, natural_gradient=args.natural, minibatch_frac=1.0, Score=eval(args.score)()) losses = ngb.fit(X_train, Y_train) forecast = ngb.pred_dist(X_test) logger = RegressionLogger(args) logger.tick(forecast, Y_test) logger.save()

整理不易,希望大家多多支持,分享转发、点个"在看"或赞赏一下哈!

未来地图:物联--数联--智联

【物联】

物联数据建模—时空序列分析

第一章:感知数据治理

第二章:时空序列建模

第三章 单元时间序列

第四章:多维时间序列

物联网数据分析体系

物联数据建模探讨

GeoMAN:基于multi-level attention机制的传感器时间序列预测模型

【数联】

什么是数据科学?

大数据与数据科学课程体系

这样搞定数据科学?

自学福利!数据科学课程体系框架

如何成为一名数据科学家?

【智联】

三个角度理解知识图谱

图数据挖掘VS知识图谱挖掘

下个拐点:图神经网络

详细的知识图谱构建流程

基于知识图谱推理的关系推演

基于知识图谱的智能问答