Трудности в создании матрицы путаницы в R для “Да” или “Нет”

Вопрос или проблема

Я новичок в регрессии и матрице ошибок и пытаюсь создать матрицу ошибок на основе модели логистической бинарной регрессии. Я пытаюсь создать матрицу ошибок из значений “Да” или “Нет” из колонки “Выжили”. Я использую стандартный набор данных, “Титаник”. Я получил ошибку, пытаясь выполнить матрицу ошибок.

Содержимое набора данных “Титаник” можно найти здесь.
Содержимое Титаника

Вот код на R ниже.

example$Class<- as.factor(example$Class)
example$Sex<- as.factor(example$Sex)
example$Age<- as.factor(example$Age)
example$Survived<- as.factor(example$Survived)

trainRowNum <- createDataPartition(example$Survived, #Целевая переменная
#пропорция примеров для формирования обучающего набора
p=0.3,
#Не сохранять результат в список
list=FALSE);
# Шаг 2: Создать обучающий набор данных
trainData <- example[trainRowNum,] 
# Шаг 3: Создать тестовый набор данных
testData <- example[-trainRowNum,]

mod.surv.lg <- glm(Survived~., family=binomial(), data=trainData);
#Предоставить сводку модели
summary(mod.surv.lg)

p <- predict(mod.surv.lg, testData,type="response")
p_class <- ifelse(p > 0.5,"Yes","No")
table(p_class)
p_class
table(p_class, testData[["Survived"]])
confusionMatrix(p_class, testData$Survived);

Я получил ошибку при выполнении функции confusionMatrix

[1] Нет  Да
<0 строк> (или 0-длина row.names)
Предупреждающее сообщение:
В Ops.factor(predictedScores, threshold) : ‘<’ не имеет смысла для факторов

Вы не предоставили свой набор данных, поэтому я использовал библиотеку titanic. Я попытался сделать данные похожими на ваши, но могут быть различия (кстати, вот почему вам следует предоставлять воспроизводимый код, предпочтительно).


# Добавлено, чтобы сделать этот код воспроизводимым
library(caret)
library(titanic)

# выбираем столбцы, используемые автором запроса
# осторожно: название столбца отличается от автора запроса для "Class"
example <- titanic_train[,c('Pclass','Sex', 'Age', 'Survived')]
# удаляем строки с NA
example <- example[complete.cases(example),]
# изменяем класс на "Да"/"Нет" вместо 1/0 в этой версии данных Титаника, чтобы они были похожи на данные автора запроса
example$Survived <- ifelse(example$Survived==1,"Yes","No")

# не нужно
#example$Class<- as.factor(example$Pclass)
#example$Sex<- as.factor(example$Sex)
# это была ошибка, возраст должен быть числовой переменной
#example$Age<- as.factor(example$Age)

example$Survived<- as.factor(example$Survived)

trainRowNum <- createDataPartition(example$Survived, #Целевая переменная
                                   #пропорция примеров для формирования обучающего набора
                                   p=0.3,
                                   #Не сохранять результат в список
                                   list=FALSE)

# Шаг 2: Создать обучающий набор данных
trainData <- example[trainRowNum,] 
# Шаг 3: Создать тестовый набор данных
testData <- example[-trainRowNum,]

mod.surv.lg <- glm(Survived~., family=binomial(), data=trainData)
p <- predict(mod.surv.lg, testData,type="response")

p_class <- ifelse(p > 0.5,"Yes","No")

# обеспечить совместимость факторов в обоих векторах: золото и предсказанные:
all.as.factors <- as.factor(c(as.character(testData$Survived),as.character(p_class)))
gold.as.factors <- head(all.as.factors, length(testData$Survived))
pred.as.factors <- tail(all.as.factors, length(p_class))

confusionMatrix(p_class, testData$Survived)

Я думаю, проблема заключалась в отсутствии as.factors для p_class. Факторы в R не очень интуитивны, я сам часто путаюсь.

Ответ или решение

Создание матрицы замешательства в R для бинарной логистической регрессии может представлять определённые трудности, особенно для новичков. Ваша цель — построить матрицу замешательства для категорий "Да" и "Нет" из столбца "Survived" в наборе данных Titanic. Давайте подробно рассмотрим потенциальные проблемы и объясним, как избежать распространённых ошибок.

Проблемы и ошибки

  1. Преобразование переменных в факторы:
    Первое, что необходимо убедиться — это то, что ваши целевые переменные (в данном случае, "Survived") корректно преобразованы в факторы. Вы уже преобразовали "Survived" в факторы с использованием as.factor(), что является правильным подходом.

    Однако, если предсказанные значения p_class не являются факторами, это может вызывать ошибку. В R факторы — это специальные объекты, которые хранят данные категориально. Если p_class не имеет того же уровня факторов, что и "Survived", функция confusionMatrix() выдаст ошибку при сравнении.

  2. Проблема с уровнем факторов:
    Рекомендуется убедиться, что уровни факторов определены одинаково для предсказанных и реальных значений. Если одно из значений (например, "Yes" или "No") отсутствует в данных, тогда возникнет ошибка. Это происходит потому, что при расчёте матрицы сравниваются категории.

  3. Потенциальные ошибки в факторах и их уровнях:
    Чтобы избежать проблем с уровнями факторов, важно объединить и затем преобразовать все факторы вместе. Например, можно использовать следующие строки кода:

    all.as.factors <- as.factor(c(as.character(testData$Survived), as.character(p_class)))
    gold.as.factors <- head(all.as.factors, length(testData$Survived))
    pred.as.factors <- tail(all.as.factors, length(p_class))

Это гарантирует, что обе переменные будут иметь одинаковые уровни, что устранит любые проблемы с непонятными факторами при создании матрицы замешательства.

Пример кода

Обратим внимание на исправленный код, чтобы окончательно устранить возможные ошибки:

# Добавленный код для воспроизводимости
library(caret)
library(titanic)

# Выбор необходимых колонок
example <- titanic_train[,c('Pclass', 'Sex', 'Age', 'Survived')]
example <- example[complete.cases(example),]
example$Survived <- ifelse(example$Survived == 1, "Yes", "No")
example$Survived <- as.factor(example$Survived)

trainRowNum <- createDataPartition(example$Survived, p=0.3, list=FALSE)

# Создание тренировочного и тестового наборов данных
trainData <- example[trainRowNum,] 
testData <- example[-trainRowNum,]

mod.surv.lg <- glm(Survived ~ ., family=binomial(), data=trainData)
p <- predict(mod.surv.lg, testData, type="response")

p_class <- ifelse(p > 0.5, "Yes", "No")

# Объединение факторов
all.as.factors <- as.factor(c(as.character(testData$Survived), as.character(p_class)))
gold.as.factors <- head(all.as.factors, length(testData$Survived))
pred.as.factors <- tail(all.as.factors, length(p_class))

# Построение матрицы замешательства
confusionMatrix(pred.as.factors, gold.as.factors)

Заключение

Создание матрицы замешательства в R требует тщательной обработки данных и внимания к деталям. Особое внимание следует уделять факторам, их уровням и соответствию предсказанных значений и реальных. Следуя вышеприведённым рекомендациям, вы сможете успешно создать матрицу замешательства и оценить качество вашей логистической модели.

Оцените материал
Добавить комментарий

Капча загружается...