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