首页 > 解决方案 > 尝试在 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))
})

谁能告诉我错误是什么?提前致谢 !!

标签: rmachine-learningknn

解决方案


您的错误是您对数据的定义。

问题

首先你定义

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不返回任何内容。也许这是另一个将要发生的问题。


推荐阅读