【问题标题】:R Problems with classification tree分类树的 R 问题
【发布时间】:2020-12-18 18:57:08
【问题描述】:

我对机器学习比较陌生,但我想创建一个基于世界银行数据集的分类树。 分类树必须满足 3 个特征: continent=Europe, currency=euro, income group = high income

此图形应如下所示:

我已经尝试过了,但它没有给我想要的输出:

library(tidyverse)
library(rpart)

WDICountry <- read.csv("https://gigamove.rz.rwth-aachen.de/d/id/pUKMStHbu9orYo/dd/100")

tree1 <- WDICountry %>%
  mutate(europe = ifelse(`2-alpha code` %in% european_countries, TRUE, FALSE),
         euro = ifelse(`Currency Unit` == "Euro", TRUE, FALSE),
         income = as.factor(ifelse(`Income Group` == "  High income", "High income", "non-high")))%>%
  mutate(`Income Group` = as.factor(`Income Group`))%>%
  select(`Income Group`, europe, euro)%>%
  filter(complete.cases(.))%>%
  rpart(data = .,formula = `Income Group` ~ europe+ euro)

plot(tree1)
text(tree1)

有人可以帮我吗?

您可以在此处将此数据帧下载为 csv 文件: https://gigamove.rz.rwth-aachen.de/d/id/pUKMStHbu9orYo?10&id=pUKMStHbu9orYo

【问题讨论】:

  • 你可以看看milbo.org/doc/prp.pdf 这个文档对你有帮助吗?这就是关于包裹rpart.plot
  • 我认为我的问题在于公式而不是图形。
  • 我知道包 WDI,但你能不能让 WDICountry 数据更可重现。
  • @Stephan 查看我更新问题的最后一行
  • 因为您使用rpart(...) 而不覆盖任何rpart.control 参数,即对所有内容都采用默认值:minsplit = 20, minbucket = round(minsplit/3), cp = 0.01, maxdepth = 30 这通常是一个糟糕的主意。找出这些参数应该具有的值并指定它们。一般来说,对于 R ML 库,不信任默认值,仔细检查它们的值,阅读文档,持怀疑态度,玩弄参数值,看看有什么效果(/没有)。

标签: r classification


【解决方案1】:

决策树是一个用于分类的模型,所以如果没有足够的证据支持分类中变量的拆分,则不进行拆分。因此,当您绘图时,并非所有变量或可能的拆分都被使用。

下面我将调整一些参数以使所有拆分发生,但请注意这很可能不是构建决策树模型的方法。

首先,获取数据。请注意,您不需要 ifelse 来设置布尔值,我对变量名有很多问题,所以下面是使用您的 csv 文件更正的列名:

library(rpart)
library(rpart.plot)
library(dplyr)

WDICountry = read.csv("WDICountry.csv",stringsAsFactors=FALSE)

european_countries = WDICountry[grep("Europe",WDICountry$Region),"X2.alpha.code"]

dat = WDICountry%>%
mutate( europe = X2.alpha.code  %in% european_countries,
       euro= Currency.Unit =="Euro",
       income=as.factor(ifelse(Income.Group =="High income","High income","non-high")))%>%
select(income,europe,euro)%>%
filter(complete.cases(.))

在拟合模型之前,先看看最小的分割:

table(dat$europe,dat$euro)
       
        FALSE TRUE
  FALSE   203    2
  TRUE     35   23

因此您需要将最小拆分设置为最低以确保拆分,并且我们还设置了complexity parameter 以便拆分进行:

mdl = rpart(income ~ europe+euro,data = dat,minsplit=2,method="class",cp=-1)
rpart.plot(mdl)

【讨论】:

  • 这看起来很不错!但是,我对顺序有点不确定:为什么首先是变量“Euro”?如果一个国家有欧元,那么这个国家必须在欧洲。变量“欧洲”应该放在首位??
  • 嘿,在您的代码中,您没有提供名为 european_countries 的内容。再次,您的问题是关于如何绘制它,以及如何调整模型以进行拆分,我已经回答了。您的问题与您的数据集有关,您可以看到很多用户在重现您的结果时遇到问题
猜你喜欢
  • 2021-04-04
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 2015-09-18
  • 2020-10-19
  • 2013-02-21
  • 1970-01-01
相关资源
最近更新 更多