Границы принятия решения для разных моделей - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь построить границы decisión для другой модели. Я сталкивался со следующим постом SO здесь

Я пытаюсь реализовать это, используя набор данных iris (не набор данных irir3). Я также хотел бы расширить это, чтобы я мог применить его к другим моделям ML (а не только к модели knn). В приведенной выше ссылке автор отображает обученные значения, я хотел бы изобразить значения test.

В моей попытке воспроизвести ответ этого поста, используя данные iris. Я могу получить только до:

iris <- iris %>% 
  mutate(
    Species = factor(Species),
    ID = row_number()
  )

iris_train = iris %>% 
  sample_frac(0.75)

iris_test <- anti_join(iris, iris_train, by = "ID")

knn_model <- knn(train = iris_train[, 1:4], iris_test[,1:4],
                 cl = iris_train$Species, k = 3, prob = TRUE)

prob = attr(knn_model, "prob")

grid <- expand.grid(x=seq(min(iris_train[,1]-1), max(iris_train[,1]+1),
                          by=0.1),
                    y=seq(min(iris_train[,2]-1), max(iris_train[,2]+1), 
                          by=0.1))

knnPredGrid <- predict(knn_model, grid)

В котором я получаю:

Ошибка в UseMethod («предикат»): нет применимого метода для «предиката», примененного к объект класса "factor"

Код из исходного поста, который использует набор данных iris3.

train <- rbind(iris3[1:25,1:2,1],
               iris3[1:25,1:2,2],
               iris3[1:25,1:2,3])
cl <- factor(c(rep("s",25), rep("c",25), rep("v",25)))

require(MASS)

test <- expand.grid(x=seq(min(train[,1]-1), max(train[,1]+1),
                          by=0.1),
                    y=seq(min(train[,2]-1), max(train[,2]+1), 
                          by=0.1))

require(class)
classif <- knn(train, test, cl, k = 3, prob=TRUE)
prob <- attr(classif, "prob")

require(dplyr)

dataf <- bind_rows(mutate(test,
                          prob=prob,
                          cls="c",
                          prob_cls=ifelse(classif==cls,
                                          1, 0)),
                   mutate(test,
                          prob=prob,
                          cls="v",
                          prob_cls=ifelse(classif==cls,
                                          1, 0)),
                   mutate(test,
                          prob=prob,
                          cls="s",
                          prob_cls=ifelse(classif==cls,
                                          1, 0)))

require(ggplot2)
ggplot(dataf) +
  geom_point(aes(x=x, y=y, col=cls),
             data = mutate(test, cls=classif),
             size=1.2) + 
  geom_contour(aes(x=x, y=y, z=prob_cls, group=cls, color=cls),
               bins=2,
               data=dataf) +
  geom_point(aes(x=x, y=y, col=cls),
             size=3,
             data=data.frame(x=train[,1], y=train[,2], cls=cl))

Я не уверен, что правильно понял код. деталь test / expand.grid просто помогает создать geom_contour точек для графика, верно? т.е. расширяет данные в длинном формате, который точки данных повторяются много раз, и модель knn просто классифицирует повторяющиеся точки данных… Как можно избежать этого и протестировать модель knn на данных iris_test, а затем развернуть сетка для построения contour точек.

Как я могу расширить свой код, чтобы построить только iris_test точки, но использовать линии contour из данных обучения?

Как можно Я расширил это до другой модели, такой как randomForests?

В целом, может ли кто-нибудь показать мне простым и понятным способом, как я могу реплицировать графики на странице ответов SO, но используя данные iris, а не iris3 данные? Я хотел бы построить модель knn, используя все 4 iris переменных вместо оригинальных записей 2 переменных. Я хотел бы расширить его, чтобы увидеть, как выглядят различные комбинации переменных iris при нанесении на график относительно границ decisión, и в текущем формате мне немного трудно понять, как это сделать.

randomForest(factor(Species) ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width,
             data = iris_train)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...