Вопрос или проблема
Я новичок в регрессии и матрице ошибок и пытаюсь создать матрицу ошибок на основе модели логистической бинарной регрессии. Я пытаюсь создать матрицу ошибок из значений “Да” или “Нет” из колонки “Выжили”. Я использую стандартный набор данных, “Титаник”. Я получил ошибку, пытаясь выполнить матрицу ошибок.
Содержимое набора данных “Титаник” можно найти здесь.
Содержимое Титаника
Вот код на 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. Давайте подробно рассмотрим потенциальные проблемы и объясним, как избежать распространённых ошибок.
Проблемы и ошибки
-
Преобразование переменных в факторы:
Первое, что необходимо убедиться — это то, что ваши целевые переменные (в данном случае, "Survived") корректно преобразованы в факторы. Вы уже преобразовали "Survived" в факторы с использованиемas.factor()
, что является правильным подходом.Однако, если предсказанные значения
p_class
не являются факторами, это может вызывать ошибку. В R факторы — это специальные объекты, которые хранят данные категориально. Еслиp_class
не имеет того же уровня факторов, что и "Survived", функцияconfusionMatrix()
выдаст ошибку при сравнении. -
Проблема с уровнем факторов:
Рекомендуется убедиться, что уровни факторов определены одинаково для предсказанных и реальных значений. Если одно из значений (например, "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))
Это гарантирует, что обе переменные будут иметь одинаковые уровни, что устранит любые проблемы с непонятными факторами при создании матрицы замешательства.
Пример кода
Обратим внимание на исправленный код, чтобы окончательно устранить возможные ошибки:
# Добавленный код для воспроизводимости
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 требует тщательной обработки данных и внимания к деталям. Особое внимание следует уделять факторам, их уровням и соответствию предсказанных значений и реальных. Следуя вышеприведённым рекомендациям, вы сможете успешно создать матрицу замешательства и оценить качество вашей логистической модели.