Statistics 伪残差在梯度推进机(GBM)中是如何工作的?

Statistics 伪残差在梯度推进机(GBM)中是如何工作的?,statistics,scikit-learn,gbm,Statistics,Scikit Learn,Gbm,因此,在GBM中,每棵树都预测前一棵树的“伪残差” 我不确定这些“伪残差”到底是如何工作的,但我想知道,当你结合了以下因素时,这是如何实现的: 二元分类问题 低答复率 合理的低信噪比 在下面的例子中,我们有3个。我将残差计算为实际概率,由于响应是二进制的,因此最终得到的是与响应几乎相同的高度双峰分布 降低响应率会进一步加剧双峰分布,因为概率更接近于零,因此,分布更接近于0或1 所以我这里有几个问题: 在本例中,如何准确计算伪残差?(我相当肯定这是错误的,除了初始树模型与全局平均值不同这一事实)

因此,在GBM中,每棵树都预测前一棵树的“伪残差”

我不确定这些“伪残差”到底是如何工作的,但我想知道,当你结合了以下因素时,这是如何实现的:

  • 二元分类问题
  • 低答复率
  • 合理的低信噪比
  • 在下面的例子中,我们有3个。我将残差计算为
    实际概率
    ,由于响应是二进制的,因此最终得到的是与响应几乎相同的高度双峰分布

    降低响应率会进一步加剧双峰分布,因为概率更接近于零,因此,分布更接近于0或1

    所以我这里有几个问题

  • 在本例中,如何准确计算伪残差?(我相当肯定这是错误的,除了初始树模型与全局平均值不同这一事实)
  • 结果,第二棵树会与第一棵树几乎相同吗
  • 对于响应率较低的问题,GBM中的连续树是否更相似
  • 非响应的下采样是否会因此内在地改变模型

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.datasets import make_classification
    from sklearn.metrics import roc_auc_score
    
    train_percent = 0.8
    num_rows = 10000
    remove_rate = 0.1
    
    # Generate data
    X, y = make_classification(n_samples=num_rows, flip_y=0.55)
    
    # Remove response rows to make sample unbalanced
    remove = (np.random.random(len(y)) > remove_rate) & (y == 1)
    X, y = X[~remove], y[~remove]
    print("Response Rate: " + str(sum(y) / float(len(y))))
    
    # Get train/test samples (data is pre-shuffled)
    train_rows = int(train_percent * len(X))
    X_train , y_train = X[:train_rows], y[:train_rows]
    X_test , y_test = X[train_rows:], y[train_rows:]
    
    # Fit a simple decision tree
    clf = DecisionTreeClassifier(max_depth=4)
    clf.fit(X_train, y_train)
    pred = clf.predict_proba(X_test)[:,1]
    
    # Calculate roc auc
    roc_auc = roc_auc_score(y_test, pred)
    print("ROC AUC: " + str(roc_auc))
    
    # Plot residuals
    plt.style.use('ggplot')
    plt.hist(y_test - pred);
    plt.title('Residuals')