R: переменная имеет разное количество уровней в узле и в данных - PullRequest
0 голосов
/ 26 апреля 2018

Я хочу использовать bnlearn для задачи классификации с наивным байесовским алгоритмом.

Я использую этот набор данных для моих тестов. Где 3 переменные являются непрерывными () V2, V4, V10) и другие являются дискретными. Насколько я знаю, bnlearn не может работать с непрерывными переменными, поэтому необходимо преобразовать их в факторы или дискретизировать. Сейчас я хочу преобразовать все функции в факторы. Однако я столкнулся с некоторыми проблемами. Вот пример кода

dataSet <- read.csv("creditcard_german.csv", header=FALSE)
# ... split into trainSet and testSet ...

trainSet[] <- lapply(trainSet, as.factor)
testSet[] <- lapply(testSet, as.factor)

# V25 is the class variable
bn = naive.bayes(trainSet, training = "V25")
fitted = bn.fit(bn, trainSet, method = "bayes")
pred = predict(fitted , testSet)

...

Для этого кода я получаю сообщение об ошибке при вызове predict()

«V1» имеет разное количество уровней в узле и в данных.

И когда я удаляю этот V1 из обучающего набора, я получаю ту же ошибку для переменной V2. Однако ошибка исчезает, когда я делаю факторизацию dataSet [] <- lapply(dataSet, as.factor) и только потом делю ее на обучающие и тестовые наборы.

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

1 Ответ

0 голосов
/ 06 февраля 2019

Эта проблема, по-видимому, вызвана тем фактом, что мои наборы данных для обучения и тестирования имели разные уровни факторов. Я решил эту проблему, используя команду rbind, чтобы объединить два разных кадра данных (поезд и тест), применив as.factor, чтобы получить полный набор факторов для полного набора данных, а затем разделив факторизованный кадр данных на отдельный ряд и тестовые наборы данных.

train <- read.csv("train.csv", header=FALSE)
test <- read.csv("test.csv", header=FALSE)
len_train = dim(train)[1]
len_test = dim(test)[1]

complete <- rbind(learn, test)    
complete[] <- lapply(complete, as.factor)
train = complete[1:len_train, ]
l = len_train+1
lf = len_train + len_test
test = complete[l:lf, ]

bn = naive.bayes(train, training = "V25")
fitted = bn.fit(bn, train, method = "bayes")
pred = predict(fitted , test)

Надеюсь, это может быть полезно.

...