为gbm交互强度实现空分布

时间:2019-01-31 16:14:56

标签: r machine-learning gbm

我正在尝试使用[Friedman and Popescu 2008] [1]中描述的方法来确定gbm模型中哪些交互是重要的。我的gbm是具有9个不同类的分类模型。 我正在努力将8.3节转换为可在R中运行的代码。

我认为整个过程是:

  1. 训练最大深度= 1的模型版本
  2. 模拟来自此模型的响应数据
  3. 根据最大深度与实际模型相同的数据训练新模型
  4. 获取此模型的互动强度
  5. 重复步骤1-4以创建交互强度的空分布

我最困惑的部分是实现方程式48和49。(您将不得不看一下链接的文章,因为我在这里无法复制它们)

我认为这是我的理解,但是如果我写错了,请纠正我:

y_i 是响应的新向量,我们将使用它来训练新模型,该模型将提供交互统计信息的空分布。

F_A(x_i)是使用最大深度= 1训练的gbm模型版本的预测

b_i 是基于加性模型 F_A(x_i)

的预测的介于0和1之间的概率

问题

  1. 什么是下标 i ?是引导程序中的迭代次数吗?
  2. 每个人工数据集与其他人工数据集有何不同?
  3. 我们是否将 Pr(b_i = 1)细分为公式48?
  4. 如何用多项式分类实现?
  5. 如何在R中实现这一目标?最好使用gbm软件包。

欢迎任何想法或参考!

1 个答案:

答案 0 :(得分:1)

总体而言,该过程是通过置换/重新分配建模对交互的额外贡献来抵消y中交互效果的一种优雅方法。完整模型和加性模型之间的边距可以捕获额外的贡献。

  1. 什么是下标i?是引导程序中的迭代次数吗?

它是样本的索引。每次迭代中有N个示例。

  1. 每个人工数据集与其他人工数据集有何不同?

各数据集的预测变量X相同。由于Y~中的边距随机排列和equation 47中的随机实现(仅针对分类结果),响应值equation 48有所不同。

  1. 我们是否将Pr(b_i = 1)归入equation 48

是的,如果结果Y是二进制的。

  1. 如何用多项式分类实现?

一种方法是随机排列每个类别的对数奇数中的边距。然后根据加性模型中的概率随机实现。

  1. 如何在R中实现这一目标?最好使用gbm包。

我试图按照您的整个流程来实施它。

首先,模拟训练数据集{X1,X2,Y}的大小为N = 200,其中Y具有三个类别(Y1Y2,{{1} })由Y3X1确定的概率来实现。交互部分X2 * X1X2中,而附加部分在Y1Y2中。

Y3
  1. 分别训练set.seed(1) N <- 200 X1 <- rnorm(N) # 2 predictors X2 <- rnorm(N) #log-odds for 3 categories Y1 <- 2*X1*X2 + rnorm(N, sd=1/10) # interaction Y2 <- X1^2 + rnorm(N, sd=1/10) #additive Y3 <- X2^2 + rnorm(N, sd=1/10) #additive Y <- rep(NA, N) # Multinomial outcome with 3 categories for (i in 1:N) { prob <- 1 / (1 + exp(-c(Y1[i],Y2[i],Y3[i]))) #logistic regression Y[i] <- which.max(rmultinom(1, 10000, prob=prob)) #realisation from prob } Y <- factor(Y) levels(Y) <- c('Y1','Y2','Y3') table(Y) #Y1 Y2 Y3 #38 75 87 dat = data.frame(Y, X1, X2) head(dat) # Y X1 X2 # 2 -0.6264538 0.4094018 # 3 0.1836433 1.6888733 # 3 -0.8356286 1.5865884 # 2 1.5952808 -0.3309078 # 3 0.3295078 -2.2852355 # 3 -0.8204684 2.4976616 = 2和1的完全模型和加性模型。
max.depth
  1. 模拟来自此模型的响应数据。
library(gbm)
n.trees <- 100
F_full <- gbm(Y ~ ., data=dat, distribution='multinomial', n.trees=n.trees, cv.folds=3,
            interaction.depth=2) # consider interactions
F_additive <- gbm(Y ~ ., data=dat, distribution='multinomial', n.trees=n.trees, cv.folds=3,
            interaction.depth=1) # ignore interactions

#use improved prediction as interaction strength
interaction_strength_original <- min(F_additive$cv.error) - min(F_full$cv.error)
> 0.1937891
  1. 使用与实际模型相同的#randomly permute margins (residuals) of log-odds to remove any interaction effects margin <- predict(F_full, n.trees=gbm.perf(F_full, plot.it=FALSE), type='link')[,,1] - predict(F_additive, n.trees=gbm.perf(F_additive, plot.it=FALSE), type='link')[,,1] margin <- apply(margin, 2, sample) #independent permutation for each category (Y1, Y2, Y3) Y_art <- rep(NA, N) #response values of an artificial dataset for (i in 1:N) { prob <- predict(F_additive, n.trees=gbm.perf(F_additive, plot.it=FALSE), type='link', newdata=dat[i,]) prob <- prob + margin[i,] # equation (47) prob <- 1 / (1 + exp(-prob)) Y_art[i] <- which.max(rmultinom(1, 1000, prob=prob)) #Similar to random realisation in equation (49) } Y_art <- factor(Y_art) levels(Y_art) = c('Y1','Y2','Y3') table(Y_art) #Y1 Y2 Y3 #21 88 91 (2)在此人工数据上训练新模型
max.depth
  1. 获取此模型的互动强度
F_full_art = gbm(Y_art ~ ., distribution='multinomial', n.trees=n.trees, cv.folds=3,
            data=data.frame(Y_art, X1, X2),
            interaction.depth=2)
F_additive_art = gbm(Y_art ~ ., distribution='multinomial', n.trees=n.trees, cv.folds=3,
            data=data.frame(Y_art, X1, X2),
            interaction.depth=1)
  1. 重复步骤2-4,以创建交互强度的空分布。不出所料,与原始训练数据集(0.1938)相比,中和后的数据集中的交互作用效果要低得多(-0.0527至0.0421)。
interaction_strength_art = min(F_additive_art$cv.error) - min(F_full_art$cv.error)
> 0.01323959 # much smaller than interaction_strength_original in step 1.