Я пытаюсь построить границы 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)