Ошибка R: Ожидание одного строкового значения: [тип=символ; экстент=5]

#r #function #search #optimization #tree

Вопрос:

Я работаю с языком программирования R. Я использую библиотеку «CORELS» в R, вот пример (CORELS-это статистическая модель, похожая на дерево решений).:

 library(corels)

logdir <- tempdir()
rules_file <- system.file("sample_data", "compas_train.out", package="corels")
labels_file <- system.file("sample_data", "compas_train.label", package="corels")
meta_file <- system.file("sample_data", "compas_train.minor", package="corels")

stopifnot(file.exists(rules_file),
          file.exists(labels_file),
          file.exists(meta_file),
          dir.exists(logdir))

corels(rules_file, labels_file, logdir, meta_file,
       verbosity_policy = "silent",
       regularization = 0.015,
       curiosity_policy = 2,   # by lower bound
       map_type = 1)       # permutation map
cat("See ", logdir, " for result file.")
 

Результаты можно посмотреть здесь:

 OPTIMAL RULE LIST
if ({sex:Male,juvenile-crimes:>0}) then ({recidivate-within-two-years:Yes})
else if ({priors:>3}) then ({recidivate-within-two-years:Yes})
else ({recidivate-within-two-years:No})
 

Мой вопрос: Я все еще немного не понимаю, как работает синтаксис для вышеуказанных функций. Например, я пытаюсь использовать вышеуказанные функции в наборе данных «iris» :

 data(iris)
head(iris)

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
 

Теперь я попытался применить функцию «corles» к набору данных iris:

 logdir <- tempdir()
rules_file <- iris
labels_file <- colnames(iris)

corels(rules_file, labels_file, logdir, 
       verbosity_policy = "silent",
       regularization = 0.015,
       curiosity_policy = 2,   # by lower bound
       map_type = 1)       # permutation map
cat("See ", logdir, " for result file.")
 

Но это приводит к следующей ошибке:

 Error in corels(rules_file, labels_file, logdir, verbosity_policy = "silent",  : 
  Expecting a single string value: [type=character; extent=5].
 

Может кто-нибудь, пожалуйста, показать мне, как исправить эту ошибку?

Спасибо

Рекомендации:

Комментарии:

1. У меня была аналогичная (сбивающая с толку) ошибка. Вот как проанализировать саму ошибку. Очевидно, он ожидал увидеть веревочку. Но затем в нем перечисляется то, что вы дали ему вместо этого, массив экстента 5 (что означает 5 элементов), и каждый элемент имеет тип символа.

2. Во-первых, я был сбит с толку, потому что думал, что он ЗАПРАШИВАЕТ строку, type_character с экстентом=5, и предположил, что это означает строку из 5 символов. Только когда я понял, что 5 (в моем случае это было 2) — это количество элементов, я понял, что часть в скобках описывает массив, который я ошибочно дал ему, и определенно не ту строку, которую он хочет.

Ответ №1:

Проблема в том, что вы пытаетесь передать corels() функции наборы данных, однако она хочет, чтобы вы передавали имена файлов. В разделе Формат данных на github для corels программного обеспечения содержится подробная информация о том, как форматировать структуры данных. Затем они должны быть сохранены в файлах, а затем переданы corels() .

Каждая строка в файле данных должна содержать имя правила, заключенное в фигурные скобки , { и } , за которым следует 0 или 1 , чтобы указать, верно ли это правило для данной строки данных.

Вот простой скрипт для создания некоторых:

 library(corels)

# Write a function to take a dataset amp; expression and format it correctly
make_rule <- function(data,expr){
  rule_name <- deparse1(substitute(expr))
  rule_name <- gsub(" ","",rule_name)
  out <- eval(substitute(expr),data)
  paste0("{",rule_name,"} ",paste0(1*out,collapse=" "))
}

# Create names for our rule/label files

rules_file <- "rule_data"
labels_file <- "label_data"

# Create some example rules (must always be binary operations)
iris_rules <- c(
  make_rule(iris,Sepal.Length < 5.84),
  make_rule(iris,Sepal.Width < 3.05),
  make_rule(iris,Petal.Length < 3.76),
  make_rule(iris,Petal.Width < 1.2)
)

#Label data appropriately. Must be a pair of rules
# where the first is the negative option amp; the 2nd is the
# positive outcome. Here we want to know how to find when
# the flower is a setosa
iris_labels <- c(
  make_rule(iris,Species != "setosa"),
  make_rule(iris,Species == "setosa")
)

# Save the data in the files
writeLines(iris_rules,rules_file)
writeLines(iris_labels,labels_file)


# reference the files and set verbosity to high so
# we get the full output
corels(rules_file, labels_file, ".",
       verbosity_policy = "loud")
 

Комментарии:

1. @ Майкл Барроуман: спасибо за ваш ответ! два вопроса

2. 1) почему этот шаг необходим? iris_rules Длина Ширина Длина Ширина.. вы уверены, что мы можем просто определить случайные правила?

3. 2) может ли эта библиотека использоваться только для двоичной классификации? он не может обрабатывать многоклассовые выходы? Или он обрабатывает только двоичную классификацию? например, iris_labels

4. 1) Это необходимо, потому что оно должно быть в таком формате. make_rule() Функция обрабатывает это. Эта функция допускает любое определение правил при условии, что вывод является логичным. 2) Я не могу ответить на этот вопрос в отношении меток нескольких классов, вам придется прочитать документацию, на которую я ссылался, чтобы понять возможности corels программного обеспечения. Однако, насколько я понимаю, если это возможно, вам придется определить метку для каждой категории (например c(make_rule(iris,Species=="setosa"),make_rule(iris,Species=="versicolor"),make_rule(iris,Species=="virginica"))

5. спасибо вам за ваш ответ! Почему вы решили определить только 4 правила? была ли какая-то причина, по которой они были определены в этом формате?