【问题标题】:I don't know how to create this tree in R我不知道如何在 R 中创建这棵树
【发布时间】:2015-06-22 13:24:13
【问题描述】:

我想通过每小时应用更好的广告系列来最大化收入。

我想创建一棵树来帮助我选择更好的广告系列。

在下面的数据中,记录了每个广告系列每小时的收入。

查看数据,我可能会发现广告系列 A 在 1-12 小时之间效果更好,而广告系列 B 在 13-24 小时之间效果更好。

如何在 R 中创建可以告诉我的树?

  hour campaign revenue
    1        A      23
    1        B      20
    2        A      21
    2        B      22
    3        A      23
    3        B      20
    4        A      21
    4        B      22
    5        A      23
    5        B      20
    6        A      21
    6        B      22
    7        A      20
    7        B      17
    8        A      18
    8        B      19
    9        A      20
    9        B      17
   10        A      18
   10        B      19
   11        A      20
   11        B      17
   12        A      19
   12        B      18
   13        A       8
   13        B       9
   14        A       6
   14        B      11
   15        A       9
   15        B       8
   16        A       6
   16        B      11
   17        A       9
   17        B       8
   18        A       6
   18        B      11
   19        A       3
   19        B       2
   20        A       3
   20        B       2
   21        A       0
   21        B       5
   22        A       3
   22        B       2
   23        A       3
   23        B       2
   24        A       0
   24        B       5

【问题讨论】:

  • 可以试试library(party) ; ct <- ctree(revenue ~. , df) ; plot(ct)
  • 感谢@DavidArenburg。我知道如何在 R 中创建树。但是如何创建我指定的树?我的任务是选择更好的广告系列,而不是预测收入。

标签: r tree


【解决方案1】:

我不确定您正在寻找什么样的树,但 revenue 的线性模型树与回归器 campaign 和分区变量 hour 可能有用。在包partykit 中使用lmtree(),您可以拟合一棵树,该树首先通过拟合具有两个系数(拦截和活动B 效应)的线性模型,然后只要至少其中一个存在显着不稳定性就拆分数据系数:

library("partykit")
(tr <- lmtree(revenue ~ campaign | hour, data = d))
## Linear model tree
## 
## Model formula:
## revenue ~ campaign | hour
## 
## Fitted party:
## [1] root
## |   [2] hour <= 12: n = 24
## |       (Intercept)   campaignB 
## |         20.583333   -1.166667 
## |   [3] hour > 12: n = 24
## |       (Intercept)   campaignB 
## |          4.666667    1.666667 
## 
## Number of inner nodes:    1
## Number of terminal nodes: 2
## Number of parameters per node: 2
## Objective function (residual sum of squares): 341.1667

在这个(可能是人为的)数据中,这选择了 12 小时的单个拆分,然后有两个终端节点:一个具有负面的活动 B 效果(即 A 更好)和一个具有正面的活动 B 效果(即, B 更好)。生成的plot(tr) 产生:

这也表明,收入水平的变化也导致了这种差异,而不仅仅是不同的广告系列效果(相当小)。

底层树算法称为“基于模型的递归分区”(MOB),也适用于线性回归以外的模型。有关详细信息,请参阅手册和小插图中的参考资料。

另一个可能有趣的算法是 Dusseldorp 和 Van Mechelen 的 QUINT(定性交互树),可在 quint 包中找到。

为了方便复制上面的例子:d 数据框可以通过

d <- read.table(textConnection("hour campaign revenue
    1        A      23
    1        B      20
    2        A      21
    2        B      22
    3        A      23
    3        B      20
    4        A      21
    4        B      22
    5        A      23
    5        B      20
    6        A      21
    6        B      22
    7        A      20
    7        B      17
    8        A      18
    8        B      19
    9        A      20
    9        B      17
   10        A      18
   10        B      19
   11        A      20
   11        B      17
   12        A      19
   12        B      18
   13        A       8
   13        B       9
   14        A       6
   14        B      11
   15        A       9
   15        B       8
   16        A       6
   16        B      11
   17        A       9
   17        B       8
   18        A       6
   18        B      11
   19        A       3
   19        B       2
   20        A       3
   20        B       2
   21        A       0
   21        B       5
   22        A       3
   22        B       2
   23        A       3
   23        B       2
   24        A       0
   24        B       5"), header = TRUE)

【讨论】:

  • 非常有趣。我对party 很满意,所以不能强迫自己继续使用这个新包。
  • partykit 中的用户界面与party 中的用户界面非常相似,因此过渡不会太难。新的ctreemob 代码有许多小的添加和改进,最重要的是,整个底层树基础架构更加灵活和易懂!
  • 非常感谢@AchimZeileis 提供详细且非常有用的答案。并感谢您开发该软件包(:
  • @AchimZeileis lmtree 如何确定什么是显着的不稳定性?我有哪些参数可以影响决策?我使用 minsize,但我不知道为什么我只有一个小的 2 节点树:我将 minsize 设置为 10000,然后我将单个拆分为 110000 个案例和 70000 个案例的 2 个节点,仅此而已,不再拆分.
  • 这个想法是进行基于分数的参数稳定性测试(本质上是LM型测试)。详细信息在 Journal of Computational and Graphical Statistics, 17(2), 492–514 中的原始出版物中进行了描述。 dx.doi.org/10.1198/106186008X319331。另请参阅stats.stackexchange.com/questions/134143/… 的解释和进一步参考。
【解决方案2】:

这样的东西有用吗?

## create a sequence of hours from column 1 of the data
hr <- as.numeric(unique(data[,1]))

## Set up vectors to hold the A and B campaign "best" hours
A.hours=NULL
B.hours=NULL

## start at the lowest hour 
i=1
while(i<=max(hr)) {
    ## create a subset of data from the current hour 
    sub.data <- data[matrix(which(data[,1]==hr[i])),]
    ## find the campaign with the highest revenue  
    best.camp <- sub.data[which(sub.data[,3]==max(sub.data[,3])),2]

    if(best.camp=="A") {
        A.hours <- c(A.hours,hr[i])
    }
    if(best.camp=="B") {
        B.hours <- c(B.hours,hr[i])
    }

    i=i+1
}

代码表明,在 A.hours(小时数:1 3 5 7 9 11 12 15 17 19 20 22 23)期间,活动 A 更有利可图。

但是,在 B.hours(小时数:2 4 6 8 10 13 14 16 18 21 24)期间,广告系列 B 的利润更高。

【讨论】:

  • 感谢@AlexMiller,但这是一个数据挖掘问题。需要一棵树,没有足够的数据来使用您的解决方案。在我的数据结果上运行代码如下:1-A 2-B 3-A 4-B 5-A 6-B 7-A 8-B 9-A 10-B 11-A 12-A 13-B 14 -B 15-A 16-B 17-A 18-B 19-A 20-A 21-B 22-A 23-A 24-B 这是一个无用的任意答案。一棵树会给出一个有价值的答案:在 1-12 小时之间,活动 A 更好。在 13-24 小时之间,活动 B 更好。
  • 根据您提供的数据,我相信我提供的代码给出了您正在寻找的答案。我对原始答案进行了小幅编辑,以节省与最有利可图的活动(A 或 B)相对应的时间。您会注意到,大多数情况下,更有利可图的活动会每小时从 A 切换到 B,但是,情况并非总是如此。例如,对于第 19 和 20 小时,活动 A 的利润更高。如果这不是您要找的,请告诉我。
  • 再次感谢@AlexMiller,但正如我所写,我确实需要一棵树。在由于数据不足导致结果任意更改的情况下,需要一棵树。我在这里手动创建的数据代表了使每小时计算毫无意义的任意更改,也代表了 A 在 1-12 之间和 B 在 13-24 之间的明显优势。这是一个关于构建基于一种特殊拆分标准的树的技术问题。有人可以告诉我如何创建具有指定特殊拆分条件的树吗?
猜你喜欢
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 2014-07-24
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多