Как я могу передать закодированные данные в горячем виде в модель nnet для выполнения прогнозирования? - PullRequest
0 голосов
/ 23 апреля 2020

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

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

Я прочитал документацию nnet, которая объясняет, что формула должна быть передана как:

class ~ x1 + x2

Но я все еще не уверен, как правильно передать данные.

Вот код:

nndf$al <- one_hot(as.data.table(nndf$al))
nndf$su <- one_hot(as.data.table(nndf$su))
nndf$rbc <- one_hot(as.data.table(nndf$rbc))
nndf$pc <- one_hot(as.data.table(nndf$pc))
nndf$pcc <- one_hot(as.data.table(nndf$pcc))
nndf$ba <- one_hot(as.data.table(nndf$ba))
nndf$htn <- one_hot(as.data.table(nndf$htn))
nndf$dm <- one_hot(as.data.table(nndf$dm))
nndf$cad <- one_hot(as.data.table(nndf$cad))
nndf$appet <- one_hot(as.data.table(nndf$appet))
nndf$pe <- one_hot(as.data.table(nndf$pe))
nndf$ane <- one_hot(as.data.table(nndf$ane))
nndf$class <- one_hot(as.data.table(nndf$class))

class(nndf$class)

# view the dataframe to ensure one hot encoding is correct
summary(nndf)

# randomly sample rows for tt split
train_idx <- sample(1:nrow(nndf), 0.8 * nrow(nndf))
test_idx <- setdiff(1:nrow(nndf), train_idx)

# prepare training set and corresponding labels
train <- nndf[train_idx,]

# prepare testing set and corresponding labels
X_test <- nndf[test_idx,]
y_test <- nndf[test_idx, "class"]

# create model with a single hidden layer containing 500 neurons
model <- nnet(nndf$class~., train, maxit=150, size=10)

# prediction
X_pred <- predict(train, type="raw")

1 Ответ

1 голос
/ 23 апреля 2020

Предположение

Все переменные в вашем наборе данных (nndf) являются категориальными.

Шаги

  1. преобразовать все переменные, кроме Response переменная (т. е. класс), в однократное кодирование (т. е. формат 0,1)

one_hot метод

  one_hot_df <- one_hot(nndf[, -13]) # 13 is the index of `class` variable.

модель.матрица метод

  model_mat_df <- model.matrix( ~ . - 1, nndf[, -13])

Преобразуйте class в качестве коэффициента и добавьте любое из указанных выше значений.

class <- as.factor(nndf$class)
final_df <- cbind(model_mat_df, class)

Split final_df в поезд и проверить и использовать это в модели.

nnet(class~., train, maxit=150, size=10)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...