【问题标题】:Is there a way to get the probability of a prediction using XGBoostRegressor?有没有办法使用 XGBoostRegressor 获得预测的概率?
【发布时间】:2019-07-26 23:09:09
【问题描述】:

我构建了一个 XGBoostRegressor 模型,它使用大约 200 个分类特征来预测一个计数时间变量。

但我希望同时获得实际预测和该预测的概率作为输出。有什么方法可以从 XGBoostRegressor 模型中得到这个?

所以我都想要 和 P(Y|X) 作为输出。知道怎么做吗?

【问题讨论】:

  • 您可以查看predict method 的参数...output_margin=True
  • 在回归的情况下这会给你什么?
  • 我不知道,但想知道它会给出什么!我对 XGBoost 不是很熟悉

标签: python machine-learning xgboost


【解决方案1】:

回归中没有概率,在回归中,您将得到的唯一输出是预测值,这就是它被称为回归的原因,因此对于任何回归器,预测的概率都是不可能的。它仅存在于分类中。

【讨论】:

  • 我在想类似于 CDF 的东西,因为 xgboost 一定做了这样的事情吧?可能类似于预测为 100 分钟,+/- 5 分钟的概率。
  • 我想了很多,但是“预测为 100 分钟,+/- 5 分钟的概率是多少。”这是不可能的,但是如果您的预测是 100 分钟,您可以根据 CDF 找到一个概率值。否则,您可以根据均值和标准差找到预测的置信区间。
【解决方案2】:

如前所述,回归与概率无关。

但是,您可以在该回归上添加confidence interval,以查看您的回归是否可信。

但需要注意的一点是,数据中的方差可能不一样。 假设您研究基于时间的现象。具体来说,您在烤箱内 (x) 时间(例如以秒为单位)后的温度 (y)。在 x = 0s 时,温度为 20°C,您开始加热它,并想知道演变以预测 x 秒后的温度。 20 秒后和 5 分钟后的方差可能相同,也可能完全不同。这称为heteroscedasticity

如果您想使用置信区间,您可能需要确保您处理了异方差,因此您的区间对于所有数据都是相同的。

您可能可以尝试获取已知输出的分布并比较该曲线上的预测,并检查 pvalue。但这只会让您衡量获得该输出的现实程度,而无需考虑输入。如果你知道你的输入/输出在一个特定的时间间隔内,这可能会起作用。

  • 编辑 我就是这样做的。显然,输出是你真正的输出。 import numpy as np import matplotlib.pyplot as plt from scipy import integrate from scipy.interpolate import interp1d N = 1000 # The number of sample mean = 0 std = 1 outputs = np.random.normal(loc=mean, scale=std, size=N) # We want to get a normed histogram (since this is PDF, if we integrate # it must be equal to 1) nbins = N / 10 n = int(N / nbins) p, x = np.histogram(outputs, bins=n, normed=True) plt.hist(outputs, bins=n, normed=True) x = x[:-1] + (x[ 1] - x[0])/2 # converting bin edges to centers # Now we want to interpolate : # f = CubicSpline(x=x, y=p, bc_type='not-a-knot') f = interp1d(x=x, y=p, kind='quadratic', fill_value='extrapolate') x = np.linspace(-2.9*std, 2.9*std, 10000) plt.plot(x, f(x)) plt.show() # To check : area = integrate.quad(f, x[0], x[-1]) print(area) # (should be close to 1)

现在,插值方法不适用于异常值。如果预测数据与您的分布相距甚远(超过标准标准的 3 倍),它将无法工作。除此之外,您现在可以使用 PDF 获得有意义的结果。

它并不完美,但它是我当时想出的最好的。我确信有一些更好的方法可以做到这一点。如果您的数据遵循正常规律,它就会变得微不足道。

【讨论】:

  • 感谢您的输入,不过我只有分类输入变量。还可以这样做吗?
  • 您能否提供您正在使用的数据样本?我想看看能做些什么。
  • 好吧,我真的不能给出示例数据,我不允许分享它。但这是不同产品的数据。 “产品名称”、“产品类别”、“设计国家”等。目标变量是发布产品需要多长时间。
  • 我明白了,那么置信区间可能不会很大。但是,您仍然可以从输出(发布时间)创建概率密度函数 (PDF),并将预期值与此 PDF 进行比较。如果您的数据代表了现实,那么您就可以了解它的真实性。请注意,需要将 PDF 与实际数据图进行比较,以检查它的好坏。
  • 听起来很有趣。您对如何从我的 xgb 模型的输出构建这样的 PDF 有任何提示吗?是否可以构建依赖于我所有输入变量的 PDF?这样我就可以从不同的分布中提取不同输入的估计值。
【解决方案3】:

我建议你研究一下 Ngboost(本质上是 Xgboost 的一个包装器,它最终提供了一个 probabilistic model。 在这里你可以找到关于 Ngboost 功能的slidesseminal Ngboost paper

基本思想是假设$P(Y|X=x)$的特定分布(默认为高斯分布)并拟合Xgboost模型来估计分布的最佳参数(对于高斯$\ mu$ 和$\sigma$。模型会将变量的空间分成不同分布的不同区域,即同族(例如高斯)但参数不同。

训练模型后,您将获得方法 '''pred_dist''',它返回给定值集 $x$ 的估计分布 $P(Y|X=x)$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多