r - 尝试在 R 中运行代码时出现“model.frame.default 中的错误,可变长度不同”
问题描述
我正在尝试一种 ML 算法,为此我使用了库中的Heights
数据。dslabs
我想在 KNN 算法中找到不同 k 值的 F1 值。首先,我根据需要创建了测试和训练集set.seed()
。然后使用定义 F1 sapply
。但我收到如下所示的错误:
model.frame.default(formula = y ~ ., data = train_set) 中的错误:可变长度不同(为 'sex' 找到)
代码如下。
library(tidyverse)
library(caret)
library(dslabs)
data("heights")
# define the outcome and predictors
set.seed(1,sample.kind = "Rounding")
y <- heights$sex
x <- heights$height
# generate training and test sets
test_index <- createDataPartition(y, times = 1, p = 0.5, list = FALSE)
test_set <- heights[test_index, ]
train_set <- heights[-test_index, ]
length(test_set$sex)
length(train_set$sex)
# defining F1
k_value<-seq(1,101,3)
F_1 <- sapply(k_value,function(k){
knn_fit<- knn3(y~.,data = train_set, k=k) %>% factor(levels = levels(train_set$sex))
y_hat_knn<- predict(knn_fit,test_set,type='class')
F_meas(data = y_hat_knn,reference = factor(train_set$sex))
})
谁能告诉我错误是什么?提前致谢 !!
解决方案
您的错误是您对数据的定义。
问题
首先你定义
y <- heights$sex
x <- heights$height
但是您以后不会使用它们。好吧,您使用y
,但不是以正确的方式。
然后定义测试和训练数据集:
test_index <- createDataPartition(y, times = 1, p = 0.5, list = FALSE)
test_set <- heights[test_index, ]
train_set <- heights[-test_index, ]
在这一点上一个提示:p=0.5
即,将 50% 的数据用于训练和 50% 用于测试是不常见的(对我而言)。最好用一些关于p = 0.75
.
为了简化起见,我只是将knn3
-part 从你的 -function 中取出sapply
:
knn_fit <- knn3(y~., data = train_set, k=k)
这是你的错误。你设置data = train_set
。让我们看一下 的结构train_set
:
> head(train_set)
sex height
2 Male 70
3 Male 68
5 Male 61
6 Female 65
9 Female 66
现在您的公式由 给出y~.
,但train_set
根本没有y
组件。
解决方案
将您的功能更改为
knn_fit <- knn3(sex ~., data = train_set, k=k)
得到你想要的结果。在这种情况下,从您的脚本中删除x
和删除,y
因为它们没有被使用。
注释
您使用的虚拟函数sapply
不返回任何内容。也许这是另一个将要发生的问题。