我正在尝试绘制不同模型的决定边界。我遇到了以下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