【问题标题】:Naive Bayes classification in R with opposite result..R中的朴素贝叶斯分类结果相反。
【发布时间】:2018-04-16 17:21:32
【问题描述】:

我正在尝试使用 R(包 e1071)进行朴素贝叶斯分类。尝试了通常的高尔夫示例,但我总是得到相反的结果。

场景: 如果天气好,我打高尔夫是“是”还是“不是”?非常简单的例子。

创建了一个训练数据集 (df),根据训练数据集,我期望结果为“好”天气的“是”,但它给了我一个“否”。

[1] No
Levels: No Yes

为什么会这样?是我理解错了还是我做错了什么?

非常感谢所有支持..

干杯..!

weather <- c("Good", "Good", "Good", "Bad", "Bad","Good")
golf <- c("Yes","No","Yes","No","Yes","Yes")
df <- data.frame(weather, golf) #Training dataset

df[] <- lapply(df, factor) #changing df to factor variables

df_new <- data.frame(weather = "Good") #Test dataset

library(e1071)
model <- naiveBayes(golf ~.,data=df)
predict(model, df_new, type ="class")

【问题讨论】:

    标签: r naivebayes


    【解决方案1】:

    这是因为因子编码可能会产生误导。事实上,如果您不确保 dfdf_new 中的因子以相同的方式编码,那么与您所看到的相比,您会得到(看似)荒谬的结果。

    看看df的整数编码

    print(df$weather)
    Good Good Good Bad  Bad  Good
    print(as.integer(df$weather))
    2 2 2 1 1 2
    

    并将其与df_new的编码进行比较

    print(df_new$weather)
    Good
    print(as.integer(df_new$weather))
    1
    

    Good 已映射到df_new 中的1,而1 对应于df 中的Bad。因此,当您应用模型时,您要求的是基于 Bad 天气的预测。

    您需要将df_new 的因子设置为与df 中的编码方式相同

    df_new <- data.frame(weather = "Good") #Test dataset
    df_new$weather <- factor(df_new$weather, levels(df$weather))
    

    【讨论】:

    • 哇..这就像一个具有因子水平的魅力..我已经阅读了所有的定理并进行了 3 多周的搜索..
    【解决方案2】:

    这是因子水平的问题:您的测试数据没有正确的水平。一些示例代码应该清楚:

    weather <- c("Good", "Good", "Good", "Bad", "Bad","Good")
    golf <- c("Yes","No","Yes","No","Yes","Yes")
    df <- data.frame(weather, golf) #Training dataset
    
    df[] <- lapply(df, factor) #changing df to factor variables
    

    以下是创建示例数据的三种方法,其中 2 种通过指定可比因子来工作:

    df_new <- data.frame(weather = "Good")
    df_new1 <- data.frame(weather = df$weather[nrow(df)]) 
    df_new2 <- data.frame(weather = factor("Good", levels = levels(df$weather)))
    
    library(e1071)
    model <- naiveBayes(golf ~.,data=df)
    predict(model, df_new, type ="class")
    #> [1] No
    #> Levels: No Yes
    

    预测在因子变量上按预期工作

    predict(model, df_new1)
    #> [1] Yes
    #> Levels: No Yes
    
    predict(model, df_new2)
    #> [1] Yes
    #> Levels: No Yes
    

    我们可以看到原来的水平是关闭的

    lapply(c(df_new, df_new1, df_new2), levels)
    #> $weather
    #> [1] "Good"
    #> 
    #> $weather
    #> [1] "Bad"  "Good"
    #> 
    #> $weather
    #> [1] "Bad"  "Good"
    

    【讨论】:

      猜你喜欢
      • 2018-02-12
      • 2015-08-27
      • 2016-10-04
      • 1970-01-01
      • 2012-07-02
      • 2017-01-10
      • 2011-04-08
      • 2014-07-12
      相关资源
      最近更新 更多