R ggplot stat_contour возвращает ошибку, которую я не могу решить - PullRequest
0 голосов
/ 29 декабря 2018

Я прорабатываю курс Harvard R на EdEx;Я до модуля машинного обучения, охватывающего кнн.Я создал подбор knn, используя данные поезда mnist_27, а затем использовал функцию прогнозирования, чтобы определить, является ли результат цифрой 2 или 7. Используя ggplot, я построил прогнозные точки (y) на основе пикселей в сетке (x_1и х_2);Затем я покрасил их у.То, что я сейчас пытаюсь сделать, это разместить контур с помощью stat_contour на границе p = 0.5.Тем не менее, я получаю эту ошибку:

Вычисление не удалось в stat_contour(): для контура требуется один z при каждой комбинации x и y.

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 для каждой строки, поэтому яЯ не уверен, что происходит не так.Если кто-то может помочь, это будет очень ценно.

1 Ответ

0 голосов
/ 30 декабря 2018

Я не очень понимаю, почему, но я думаю, что причина, почему stat_contour потерпел неудачу, была из-за недостаточного количества наблюдений для (x_1, x_2), и поэтому

Вместо использования (x_1, x_2) из ​​набора данных поезда (800 наблюдений) я использовал полный набор (mnist $ true_p), который имеет 22500 наблюдений.Я перекодировал, чтобы использовать (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)

Код теперь производит то, что мне нужно.

Test data set, k=1

Train data set, k=1

Если у кого-либо есть какие-либо дополнительные предложения, пожалуйста, дайте мне знать.Благодаря.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...