我已经构建了一个XGBoost回归模型,它使用了大约200个预测连续时间变量的分类特征。
但我希望得到实际预测和预测概率作为输出。有没有办法从XGBoostRegressor模型中获取此信息?
所以我都想要和P(Y | X)作为输出。知道怎么做吗?
回归中没有概率,在回归中,您将获得的唯一输出是预测值,这就是为什么它被称为回归,因此对于任何回归量,预测的概率是不可能的。它只在分类中存在。
如前所述,没有与回归相关的概率。
但是,您可以在该回归中添加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获得有意义的结果。
它并不完美,但它是我在那段时间想出的最好的。我确信有更好的方法可以做到这一点。如果您的数据遵循正常的法律,那就变得微不足道了。