【问题标题】:R ggplot stat_contour returning an error I can't solveR ggplot stat_contour 返回一个我无法解决的错误
【发布时间】:2018-12-30 10:12:22
【问题描述】:

我正在学习 EdEx 的哈佛 R 课程;我负责机器学习模块,涵盖 knn。我使用 mnist_27 训练数据创建了一个 knn 拟合,然后使用 predict 函数来确定结果是数字 2 还是 7。使用 ggplot,我根据网格上的像素 (x_1) 绘制了预测点 (y)和 x_2);然后我用y给它们上色。我现在要做的是在 p=0.5 边界处使用 stat_contour 放置轮廓。但是,我收到了这个错误:

stat_contour() 中的计算失败:轮廓在 x 和 y 的每个组合中都需要一个 z。

library(tidyverse)
library(caret)
library(dslabs)

data("mnist_27")

knn_fit <- knn3(y ~ ., data = mnist_27$train, k = 5)

x_1 <- mnist_27$train$x_1
x_2 <- mnist_27$train$x_2
y_x <- predict(knn_fit, mnist_27$train, type = "class")
p_hat_knn <- predict(knn_fit, mnist_27$train, type = "prob")
p_x <- p_hat_knn[,2]

knn_df <- data.frame(x_1, x_2, p_x, y_x)

plot_val <- knn_df %>%
  ggplot() +
    geom_point(aes(x = x_1, y = x_2, colour = factor(y_x)), shape=21, size=2, stroke=1) +
    stat_contour(aes(x = x_1, y = x_2, z=p_x), breaks=c(0.5), color="black")

plot(plot_val)

错误告诉我,我没有每个 (x_1, x_2) 对的轮廓的概率,但我的数据框每行都有一个 p_x,所以我不确定出了什么问题。如果有人可以提供帮助,将不胜感激。

【问题讨论】:

  • 无法访问此数据集。它可能存在于dslabs 包中。您能否将其dput 添加到问题中?
  • 嗨@NelsonGon;是的,mnist_27 数据在 dslabs 包中。我按要求使用了 dput 命令;这是指向数据的 Dropbox 链接:dropbox.com/s/rkmvjrtuea1sgfb/mnist27data?dl=0
  • 我之所以使用训练数据集生成y(x_1,x_2),是为了将过度训练和平滑不足的效果与测试集进行比较。一旦我得到这个轮廓的东西排序,我会在测试集上重复。谢谢!

标签: r ggplot2 contour


【解决方案1】:

我不太明白为什么,但我认为 stat_contour 失败的原因是由于对 (x_1, x_2) 的观察不足,因此 p。

我没有使用训练数据集(800 个观察值)中的 (x_1,x_2),而是使用了具有 22500 个观察值的完整集 (mnist$true_p)。我重新编码以使用 (mnist$true_p$x_1, mnist$true_p$x_2) 从拟合中获取 p_x。使用相同的代码,stat_contour 就可以工作了。

k_val <- 1

knn_fit <- knn3(y ~ ., data = mnist_27$train, k = k_val)
x_1 <- mnist_27$true_p$x_1
x_2 <- mnist_27$true_p$x_2
knn_df <- data.frame(x_1, x_2)
y_x <- predict(knn_fit, knn_df, type = "class")
p_hat_knn <- predict(knn_fit, knn_df, type = "prob")
p_x <- p_hat_knn[,2]
knn_df <- data.frame(x_1, x_2, p_x)
p1 <- ggplot() +
    geom_point(data=mnist_27$train, aes(x = x_1, y = x_2, colour = factor(y)), shape=21, size=2, stroke=1) +
    stat_contour(data=knn_df, aes(x=x_1, y=x_2, z=p_x), breaks=c(0.5), color="black")
plot(p1)

knn_fit <- knn3(y ~ ., data = mnist_27$test, k = k_val)
x_1 <- mnist_27$true_p$x_1
x_2 <- mnist_27$true_p$x_2
knn_df <- data.frame(x_1, x_2)
y_x <- predict(knn_fit, knn_df, type = "class")
p_hat_knn <- predict(knn_fit, knn_df, type = "prob")
p_x <- p_hat_knn[,2]
knn_df <- data.frame(x_1, x_2, p_x)
p2 <- ggplot() +
    geom_point(data=mnist_27$test, aes(x = x_1, y = x_2, colour = factor(y)), shape=21, size=2, stroke=1) +
    stat_contour(data=knn_df, aes(x=x_1, y=x_2, z=p_x), breaks=c(0.5), color="black")
plot(p2)

grid.arrange(p1, p2, nrow=1)

代码现在产生了我需要的东西。

如果有人有任何进一步的建议,请告诉我。谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多