绘制不同模型的决策边界

时间:2020-01-23 19:03:23

标签: r

我正在尝试绘制不同模型的决定边界。我遇到了以下SO帖子here

我正在尝试使用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(“ predict”)中的错误:'predict'没有适用的方法 应用于“ 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模型只是对重复的数据点进行分类……我如何避免这种情况,并在{{1 }}数据,然后扩展网格以构造knn点。

如何扩展代码以仅绘制iris_test点,而使用训练数据中的contour行呢?

如何将其扩展到另一个模型,例如randomForests?

总体而言,有人能以一种易于遵循的方式向我展示如何在SO post答案页面上使用iris_test数据而不是contour数据来复制图表吗?我想使用所有4个iris变量而不是原始的2个变量来构建knn模型。我想对其进行扩展,以查看在按Decisión边界绘制时iris3变量的不同组合的外观,在当前格式下,我很难遵循该操作。

iris

0 个答案:

没有答案