当试图在R中运行代码时,'在model.frame.default中出错,变量长度不同'。

问题描述 投票:0回答:1

我正在尝试一种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))
})

谁能告诉我什么是错误的?先谢谢你了 !

r machine-learning knn
1个回答
0
投票

你的错误在于你对数据的定义。

问题

首先你要定义

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)

以获得您想要的结果。在这种情况下,删除 xy 因为它们没有被使用。

注释

您的虚函数用于 sapply 不返回任何东西。也许这又是一个会发生的问题。

© www.soinside.com 2019 - 2024. All rights reserved.