我正在尝试一种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
-部分从你的身体里掏出来 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
不返回任何东西。也许这又是一个会发生的问题。