带权重的 Ctree 分类 - 显示结果

Posted

技术标签:

【中文标题】带权重的 Ctree 分类 - 显示结果【英文标题】:Ctree classification with weights - results displayed 【发布时间】:2015-01-31 08:58:02 【问题描述】:

假设我想使用 iris 数据示例,但正确分类 versicolor 对我来说要重要 5 倍。

library(party)
data(iris)
irisct <- ctree(Species ~ .,data = iris, weights=ifelse(iris$Species=='versicolor', 5, 1))
plot(irisct)

然后树形图会更改每个节点中的观察次数和条件概率(它将 versicolor 乘以 5)。有没有办法“禁用”它,即显示原始观察数(虹膜总数 = 150)?

非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

ctree() 在包partykit 中的增强重新实现还具有更灵活的绘图功能。具体来说,node_barplot() 面板函数获得了一个 mainlab 参数,可用于自定义主标签。例如虹膜数据:

library("partykit")
ct <- ctree(Species ~ ., data = iris)

您可以设置标签向量,然后提供访问这些标签的函数:

lab <- paste("Foo", 1:7)
ml <- function(id, nobs) lab[as.numeric(id)]
plot(ct, tp_args = list(mainlab = ml))

当然,上面的例子意义不大,但可以通过一点点代码修改来完成你想要的。

但是,请注意使用 weights 参数对某些观测值进行上采样。 ctree() 函数确实将 weights 视为案例权重,因此用于拆分的显着性检验确实发生了变化。随着观察次数的增加,所有 p 值都会变小,因此树会选择更多的分割(除非同时增加 mincriterion)。比较上面的ct 树与 4 个终端节点与

ct2 <- ctree(Species ~ ., data = iris, weights = rep(2, 150))
ct3 <- ctree(Species ~ ., data = iris, weights = rep(2, 150), mincriterion = 0.999)

得到的终端节点数为

c(width(ct), width(ct2), width(ct3))
[1] 4 6 4

【讨论】:

我一直在尝试修改node_terminal(成功),直到我读到:'面板生成函数 node_terminal 是终端节点的基于文本的简洁表示。那么plot.partyplot.Binary tree的终端面板用的是什么功能?在这种情况下似乎一直是node_barplot 面板函数node_terminal用作partykit中的后备面板函数。当包被告知树在每个叶子中具有恒定拟合(均值、比例等)时(通过使用constparty 类),然后使用图形表示(用于回归的箱线图,用于分类的条形图)。但node_terminal 也可以在这种情况下使用。当然,如果您愿意,您可以调整任一面板功能以执行特定于您的目的的操作。 欢迎来到 SO,Achim。很高兴终于得到创作者本人对party 的支持。我等了很久。 谢谢,大卫。我们会看看这是怎么回事。我仍然觉得比 R-help 需要更多的时间,但我决定试一试,看看我喜欢这种体验:-) @felixdietrich 你能提供一个对你有用的修改代码的要点吗?我有同样的问题,这不能通过传递一个新的 mainlab 函数来解决,因为传递给它的 nobs 已经是加权 obs。如果有一个标准对象传递给任何包含跨面板可用的所有信息的可修改函数,那就更好了......

以上是关于带权重的 Ctree 分类 - 显示结果的主要内容,如果未能解决你的问题,请参考以下文章

如何获取所有终端节点 - r 中的权重和响应预测“ctree”

如何绘制一个大的 ctree() 以避免重叠节点

AdaBoost元算法

Keras - 带权重的多标签分类

带权重的 Scikit-Learn 分类和回归

机器学习--感知器数据分类算法步骤(慕课网-实现简单的神经网络)