【问题标题】:"NAs introduced by coercion" Error when using tree function使用树函数时出现“强制引入的 NA”错误
【发布时间】:2019-02-19 14:21:32
【问题描述】:

我一直在使用 KNN 算法对事件进行分类,但这并没有带来很高的分类准确度。一些同事告诉我,R 中的 tree () 函数(来自 tree 包)可以帮助解决这个问题。

这是我的数据样本。我正在尝试根据前两列 "ACTIVITY_X""ACTIVITY_Y" 的值对不同的事件进行分类(我有 8 种不同类别的事件):

> print(dataset)
     ACTIVITY_X ACTIVITY_Y     Event
  1:         19         21 Vigilance
  2:         20         14 Vigilance
  3:         34         35 Vigilance
  4:         18          5 Vigilance
  5:         23         27 Vigilance
 ---                                
426:          9         25 Vigilance
427:          0          0   Head-up
428:          0          0   Head-up
429:          3          3   Head-up
430:          0          0 Vigilance

理想情况下,我想在不同类别(平视、警戒等)之间找到不同的阈值,这有助于在 "Event" 数据不可用且我只有 "ACTIVITY_X" 和 @987654328 时对它们进行分类@ 数据。我想我应该将tree() 函数用作:

xtree <- tree(Head-up~ACTIVITY_X+ACTIVITY_Y,data=dataset)
plot(xtree)
title("Head_up")
text(xtree)

xtree <- tree(Vigilance~ACTIVITY_X+ACTIVITY_Y,data=dataset)
plot(xtree)
title("Vigilance")
text(xtree)

etc..

但是,我在运行分析时遇到了不同的错误,主要错误是 "NAs introduced by coercion"。当我使用rpart() 函数时,这些错误是不存在的,这也是一种分类算法。

> xtree <- tree(Vigilance~ACTIVITY_X+ACTIVITY_Y,data=dataset)
Warning message:
In tree(Vigilance ~ ACTIVITY_X + ACTIVITY_Y, data = dataset) :
  NAs introduced by coercion
> plot(xtree)
Error in plot.tree(xtree) : cannot plot singlenode tree
> title("Vigilance")
Error in title("Vigilance") : plot.new has not been called yet
> text(xtree)
Error in text.tree(xtree) : cannot plot singlenode tree

任何帮助将不胜感激。我对 R 很陌生,所以我希望其他用户仍然对这个问题感兴趣。

【问题讨论】:

    标签: r machine-learning tree


    【解决方案1】:

    我有点不确定我的数据结构是否和你的一样,但我的错误是一样的:

    Binary | X1  | X2
    No     | 6.3 | 8.3
    Yes    | 7.2 | 9.8
    Yes    | 5.0 | 3.8
    
    x = tree(Binary ~ . , data)
    

    强制引入的NAs

    对我来说,这个错误是因为数据集中的“二进制”变量的格式是“字符”而不是所需的“因子”格式

    class(data$Binary)
    "character"
    
    data$Binary = as.factor(data$Binary)
    
    class(data$Binary)
    "factor"
    

    经过这个转换,运行树函数不再报错。

    【讨论】:

    • 为我工作!这是一篇关于函数 as.factor 的非常有趣的文章,它可能解释了 R 中这个相当新的问题。“自成立以来,R 至少在默认情况下,在直接使用数据创建数据帧时将(字符)字符串转换为因子。 frame() 或使用 read.table() 变体读取表格数据的结果。很可能,这很快就会改变。 developer.r-project.org/Blog/public/2020/02/16/stringsasfactors
    • 有效!这也解决了做 cv.tree 的问题,它给出了“无法修剪单节点树”的问题
    【解决方案2】:

    是的,将变量从其他类(如二进制、字符等)更改为因子,谢谢..!!!

    > class(train_data$saleCAT)
    

    [1]“字符”

    data$saleCAT <- as.factor(data_cat) 
    > class(train_data$saleCAT)
    

    [1]“因素”

    【讨论】:

      【解决方案3】:

      关于这个问题有点旧的评论,但我认为旧版本的 R 在分配时会自动分配因子,我认为它会更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-17
        • 1970-01-01
        • 2019-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多