分位数回归森林

分位数回归森林(Quantile Regression Forests),一般回归模型预测均值,但该算法预测数据的分布。它可以用来预测给定输入的价格分布,例如,给定一些属性,汽车价格分布的第25和75百分位是多少。

大多数预测器在预测期间返回E(Y|X),这可以解释为这个问题的答案,给定输入,输出的期望值是多少?

分位数方法,在q处返回y,其中F(Y =y|X)=q,其中q是百分位数,y是分位数。一个有用的快速用例是当有许多异常值影响条件平均值时。有时重要的是获得不同百分比的估计值(例如,在对曲线进行评分时)。

注意:一些机器学习模型还返回P(Y|X)的整个分布。比如高斯过程蒙德里安森林。一个有用的应用是超参数优化,其中条件分布P(Y|X)是平衡开发和探索的必要条件。

分位数决策树

扩展标准决策树以提供百分位数的预测是相当简单的。当一个决策树是合适的,诀窍是不仅要在叶节点上存储目标的充分统计量,如均值和方差,而且要在叶节点上存储所有的目标值。在预测中,这些被用来计算经验分位数估计。

假设参数min_samples_leaf被设置为5,那么对于一个新的样本X,当确定Y|X在不同量子位上时,叶中的5个样本被赋予相同的权重。如果min_samples_leaf被设置为1,那么期望就等于每百分位上的分位数。
注:分位数的经验估计有很多方法。scikit-garden,依赖于这个加权百分位数方法

分位数回归森林

同样的方法可以扩展到随机森林。为了估计F(Y= y |x)=q, y_train中的每个目标值都有一个权值。形式上,在估计分位数时,y_train[j]的权重为\frac{1}{T} \sum_{t=1}^{T} \frac{\mathbb{1}(y_j \in L(x))}{\sum_{i=1}^N \mathbb{1}(y_i \in L(x))},其中L(x)表示x落在叶子上。

非正式地说,这意味着对于一个新的未知样本,我们首先找到它落在每棵树上的叶子。然后,对于训练数据中的每一个(X, y),在每棵树上按如下方式赋予y一个权重。

  • 如果它和新样本在同一片叶子上,那么重量就是样本在同一片叶子上的比例。
  • 如果没有,则权重为零。

每个y的权值在所有树中求和并取平均值。既然我们有一个目标值数组和一个与这些目标值对应的权重数组,我们可以用它来测量经验分位数估计值。

例:
现在,我们将使用scikit-garden中的ExtraTreesQuantileRegressor来绘制波士顿数据集上的预测区间。
先引入必要的库:

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from skgarden import RandomForestQuantileRegressor

加载数据和必要的估计。注意,min_samples_split被设置为10,交叉验证为5-split。

boston = load_boston()
X, y = boston.data, boston.target
kf = KFold(n_splits=5, random_state=0)
rfqr = RandomForestQuantileRegressor(
    random_state=0, min_samples_split=10, n_estimators=1000)

将分位数存储在98.5%和2.5个百分位。

y_true_all = []
lower = []
upper = []

for train_index, test_index in kf.split(X):
    X_train, X_test, y_train, y_test = (
        X[train_index], X[test_index], y[train_index], y[test_index])

    rfqr.set_params(max_features=X_train.shape[1] // 3)
    rfqr.fit(X_train, y_train)
    y_true_all = np.concatenate((y_true_all, y_test))
    upper = np.concatenate((upper, rfqr.predict(X_test, quantile=98.5)))
    lower = np.concatenate((lower, rfqr.predict(X_test, quantile=2.5)))

interval = upper - lower
sort_ind = np.argsort(interval)
y_true_all = y_true_all[sort_ind]
upper = upper[sort_ind]
lower = lower[sort_ind]
mean = (upper + lower) / 2

# Center such that the mean of the prediction interval is at 0.0
y_true_all -= mean
upper -= mean
lower -= mean

绘制预测间隔,即原始目标值。我们看到大多数样本位于 95 p.c 预测间隔内。

plt.plot(y_true_all, "ro")
plt.fill_between(
    np.arange(len(upper)), lower, upper, alpha=0.2, color="r",
    label="Pred. interval")
plt.xlabel("Ordered samples.")
plt.ylabel("Values and prediction intervals.")
plt.xlim([0, 500])
plt.show()

分位数回归森林

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程