Проблема с эластичной сетью в R — ошибка в check_dims (x = x, y = y): nrow (x) == n не СООТВЕТСТВУЕТ ДЕЙСТВИТЕЛЬНОСТИ

#r #machine-learning #data-science #r-caret

#r #машинное обучение #наука о данных #r-каретка

Вопрос:

Ошибка: nrow (x) == n неверно

Я не уверен, что означает «n» в данном случае. Вот код, вызывающий ошибку:

 # BUILD MODEL 
set.seed(9353)
elastic_net_model <- train(x = predictors, y = y,
                           method = "glmnet",
                           family = "binomial",
                           preProcess = c("scale"),
                           tuneLength = 10,
                           metric = "ROC",
                           # metric = "Spec",
                           trControl = train_control)
 

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

 # Make sure that the outcome variable is a two-level factor
dfBlocksAll$trophout1 = as.factor(dfBlocksAll$trophout1)

# Set levels for dfBlocksAll$trophout1
levels(dfBlocksAll$trophout1) <- c("NoTrophy", "Trophy")

# Split the data into training and test set, 70/30 split
set.seed(1934)
index <- createDataPartition(y = dfBlocksAll$trophout1, p = 0.70, list = FALSE)
training  <- dfBlocksAll[index, ]
testing <- dfBlocksAll[-index, ]

# This step is the heart of the process
y <- dfBlocksAll$trophout1 # outcome variable - did they get a trophy or not?
predictors <- training[,which(colnames(training) != "trophout1")]
 

Единственный другой потенциально релевантный код, который появляется перед блоком, выдающим ошибку, — это:

 train_control <- trainControl(method = "repeatedcv",
                              number = 10,
                              repeats = 10,
                              # sampling = "down",
                              classProbs = TRUE, 
                              summaryFunction = twoClassSummary,
                              allowParallel = TRUE,
                              savePredictions = "final",
                              verboseIter = FALSE)

 

Поскольку мой y уже является фактором, я предполагаю, что моя ошибка как-то связана с x, а не с y. Как вы можете видеть из кода, что мой x — это фрейм данных, называемый «предикторы». Этот фрейм данных содержит 768 объектов из 67 переменных и заполнен символами и цифрами.

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

1. Вы ведь понимаете, что glmnet не может обрабатывать NA, верно? И почему вы не сообщаете о результатах dim и summary (или, возможно, с помощью sapply(предикторы, функция (x){сумма (is.na (x))})` о предикторах объектов и y?????

Ответ №1:

Ваша переменная ответа должна быть получена из обучения, здесь я использую пример набора данных:

 dfBlocksAll = data.frame(matrix(runif(1000),ncol=10))
dfBlocksAll$trophout1 = factor(sample(c("NoTrophy", "Trophy"),100,replace=TRUE))

index <- createDataPartition(y = dfBlocksAll$trophout1, p = 0.70, list = FALSE)
training  <- dfBlocksAll[index, ]
testing <- dfBlocksAll[-index, ]
 

И эта часть должна быть изменена:

 y <- training$trophout1 
predictors <- training[,which(colnames(training) != "trophout1")]
 

А в остальном все идет вполне нормально:

 elastic_net_model <- train(x = predictors, y = y,
                           method = "glmnet",
                           family = "binomial",
                           preProcess = c("scale"),
                           tuneLength = 10,
                           metric = "ROC",
                           trControl = train_control)

elastic_net_model
glmnet 

71 samples
10 predictors
 2 classes: 'NoTrophy', 'Trophy' 

Pre-processing: scaled (10) 
Resampling: Cross-Validated (10 fold, repeated 10 times) 
Summary of sample sizes: 65, 64, 64, 63, 64, 64, ... 
Resampling results across tuning parameters:

  alpha  lambda        ROC        Sens       Spec      
  0.1    0.0003090198  0.5620833  0.5908333  0.51666667
  0.1    0.0007138758  0.5620833  0.5908333  0.51666667
  0.1    0.0016491457  0.5614583  0.5908333  0.51083333
  0.1    0.0038097407  0.5594444  0.5933333  0.51083333