我有一个示例表,我想进行KKNN分类.变量V4是响应,我希望分类器查看新的数据点是分类为0还是1(实际数据有12列,第12列是响应,但我还是会简化该示例

library(kknn)

data <- data.frame(
  V1=c(1.2, 2.5, 3.1, 4.8, 5.2), 
  V2=c(0.7, 1.8, 2.3, 3.9, 4.1), 
  V3=c(2.3, 3.7, 1.8, 4.2, 5.5), 
  V4= c(0, 1, 0, 1, 0)
)

现在,我想通过LOOCV使用for循环构建一个kknn分类.假设kknn=3

for (i in 1:nrow(data)) {
  train_data <- data[-i, 1:3]
  train_data_response <- data.frame(data[-i, 4])
  colnames(train_data_response) <- "Response"
  test_set <- data[i, 3]
  model <- kknn(formula=train_data_response ~ ., data.frame(train_data), 
                data.frame(test_set), k=3, scale=TRUE) 
}

现在我收到这个错误,上面写着:

Error in model.frame.default(formula, data = train) : 
  invalid type (list) for variable 'train_data_response'

有没有办法解决这个错误?我以为kknn可以接受矩阵或矩阵.我的训练和测试数据确实是嵌套的,那么是什么呢?

另外,我的LOOCV做得对吗?

推荐答案

我们希望从train_data中go 掉1,以验证我们的结果是否不是由某个特定行驱动的,并且我们不会触及test_set.这两个都是在没有LOOCV的情况下进行kknn米比赛之前创建的,

set.seed(42)
smp <- sample.int(nrow(data), nrow(data)*.7)
train_data <- data[smp, ]
test_set <- data[-smp, ]

所以我们不再需要原始的data美元了.

假设我们希望结果是nrow(loo) == (test_set)ncol(loo) == (train_data)的矩阵loo,我们对其进行初始化

loo <- matrix(NA_character_, nrow=nrow(test_set), ncol=nrow(train_data))

现在把它填好,每kknn个中就有一个.

for (i in seq_len(nrow(train_data))) {
  fit <- kknn(formula=as.factor(Response) ~ ., train=train_data[-i, ], 
              test=test_set, k=3, scale=TRUE) 
  loo[, i] <- as.character(fit$fitted.values)
}

请注意,我们最好在公式中对响应as.factor进行分类,这增加了安全性,如果像在OP中一样是数字的.因此,fit$fitted.values也将作为我们想要的矩阵中的一个因子as.character返回,以防止将这些因子强迫为整数.

现在我们可以用loo个结果做很多事情,例如,看哪一个遗漏的观测可能会影响模型预测,

> loo == model$fit
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]  [,9] [,10] [,11]
[1,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE  TRUE  TRUE
[2,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE  TRUE  TRUE  TRUE
[3,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE  TRUE  TRUE  TRUE
[4,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE  TRUE  TRUE
[5,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE  TRUE  TRUE  TRUE

在本例中,这是第train_data行.

或者计算正确预测all个分类的比率.

> mean(apply(loo == model$fit, 2, all))
[1] 0.9090909

Data:

稍微扩展了一点,以便有更多的观察.

data <- data.frame(
  V1=c(1.2, 2.5, 3.1, 4.8, 5.2), 
  V2=c(0.7, 1.8, 2.3, 3.9, 4.1), 
  V3=c(2.3, 3.7, 1.8, 4.2, 5.5), 
  Response= c(0, 1, 0, 1, 0)
)
data <- rbind.data.frame(data, data, data, row.names=FALSE) 

R相关问答推荐

用单个表达匹配多个替代模式

根据shiny 应用程序中的数字输入更改图标 colored颜色

用预测NLS处理R中生物学假设之上的误差传播

自动变更列表

在R中将特定列的值向右移动

在连续尺度上转置标签[瀑布图,R]

将数字转换为分钟和秒

使用列/行匹配将两个不同维度的矩阵相加

汇总数据的Sheffe检验的P值(平均值和标准差)

正在导出默认的RStudio主题,还是设置括号 colored颜色 ?

将全局环境变量的名称分配给列表中的所有元素

如何移除GGPlot中超出与面相交的任何格网像元

自动STAT_SUMMARY统计与手动标准误差之间的差异

如何在PrePlot()中将多个元素设置为斜体

无法将条件case_when()应用于使用!!创建的新变量Mutations

按组和连续id计算日期差

如何在R中创建条形图,使条形图在y轴上围绕0.5而不是0构建条形图?

需要一个函数来在第一行创建一个新变量,然后用新变量替换一个不同的变量(对于多行)

分隔日期格式为2020年7月1日

如何捕获这个shiny 的、可扩展的react 性用户输入矩阵作为另一个react 性对象,以便进一步操作?