Вопрос о точности поиска с использованием k-ближайшего соседа - PullRequest
1 голос
/ 26 мая 2019

Я слежу за этим онлайн-курсом по машинному обучению, и мне нужно найти точность, используя k-ближайших соседей с разными значениями (k = 1, 3, 5, 7, 9, 11) для набора данных с именем fabric_gene_expression из пакет dslabs в R.

Это может быть легко для некоторых, но я относительно новичок в машинном обучении и программировании, и я пробовал разные вещи и уже провел несколько дней, пытаясь выяснить, в чем я ошибаюсь с этим вопросом.

Буду признателен за любую помощь, чтобы выяснить, где я иду не так?

Я попытался разделить данные на обучающие и тестовые тесты с помощью createPartition. Значения x представляют собой матрицу, и я не знаю, связано ли это с проблемой, но похоже, что «y» является фактором, и функция не работает с этим.

Это сообщение появляется при вводе кода:

Ошибка в eval (predvars, data, env): числовой аргумент 'envir', длина которого не одна

Код, который я использовал ниже.

library(dslabs)
data("tissue_gene_expression")
ks <- seq(1,11,2)
x <- tissue_gene_expression$x
y <- tissue_gene_expression$y

accuracy <- map_df(ks, function(k){
set.seed(1)

test_index <- createDataPartition(y, times = 1, p = 0.5, list = FALSE)
train_set_y <- y[-test_index]
test_set_y <- y[test_index]
train_set_x <- x[-test_index]
test_set_x <- x[test_index]

fit <- knn3(y ~ x, data = train_set_x, k = ks)
y_hat <- predict(fit, test_set_x, type = "class")
confusionMatrix(data = y_hat, reference = test_set_x)$overall["Accuracy"]
})

Я получаю это сообщение об ошибке

  Error in eval(predvars, data, env) : 
  numeric 'envir' arg not of length one 
10.
eval(predvars, data, env) 
9.
model.frame.default(formula = y ~ x, data = train_set) 
8.
model.frame(formula = y ~ x, data = train_set) 
7.
eval(m, parent.frame()) 
6.
eval(m, parent.frame()) 
5.
knn3.formula(y ~ x, data = train_set, k = ks) 
4.
knn3(y ~ x, data = train_set, k = ks) 
3.
.f(.x[[i]], ...) 
2.
map(.x, .f, ...) 
1.
map_df(ks, function(k) {
    set.seed(1)
    test_index <- createDataPartition(y, times = 1, p = 0.5, 
        list = FALSE) ... 

Здесь вы можете увидеть немного набора данных, который я использую

Класс и первая часть x в наборе данных выглядят так (не включили их все, так как они слишком длинные):

 class(x)
[1] "matrix"

x
                   MAML1      LHPP    SEPT10    B3GNT4  ZNF280D    SOX12
cerebellum_1    9.825680  8.327163  5.499382  8.692371 5.642305 6.254751
cerebellum_2    9.631247  8.542827  5.644292  8.833679 5.685083 6.289460
           C21orf62     PER3   HOXA10    HOXC5     BLVRB     ZIM2    HEMK1
cerebellum_1   5.840938 8.330565 5.520803 7.660495  7.669237 8.355588 7.336959
cerebellum_2   6.065646 8.263576 5.528077 7.569041  7.779377 8.647475 7.282120

И класс, и первые строки y выглядят так:

class(y)
[1] "factor"

y
  [1] cerebellum  cerebellum  cerebellum  cerebellum  cerebellum  cerebellum 
  [7] cerebellum  cerebellum  cerebellum  cerebellum  cerebellum  cerebellum 
 [13] cerebellum  cerebellum  cerebellum  cerebellum  cerebellum  cerebellum
...