Выполнение кусочно-множественной полиномиальной регрессии на наборе данных Auto (ISLR2)

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

В настоящее время я пытаюсь проанализировать некоторые данные из набора данных Auto (из ISLR2). Я пытаюсь подогнать кусочно-полиномиальную функцию к столбцу ускорений. Но каждый раз, когда я запускаю свой код, R выдает эту ошибку:

Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 
factor cut(acceleration, 8) has new levels (7.98,10], (10,12], (12,14], (14,16], (16,18], (18,20], (20,22], (22,24]

Я запускал код ниже, с некоторыми изменениями для набора данных Wage для кусочно-полиномиального подбора на 8 шагов, и он работал отлично. Интересно, что я делаю не так. Вот мой код:

cv.steps <- c()
for (i in 2:10) {
  Auto$acc.cut <- cut(Auto$acceleration, i)
  glm.fit <- glm(mpg ~ acc.cut, data = Auto)
  cv.steps[i] <- cv.glm(Auto, glm.fit, K = 10)$delta[1]
}

#Plot to see the lowest value. 
plot(2:10, cv.steps[-1], xlab = "Number of Breaks", ylab = "CV Errors", type = "l")
lm.fit <- glm(mpg ~ cut(acceleration, 8), data = Auto)
alims <- range(Auto$acceleration)
agrid <- seq(from = alims[1], to = alims[2])
preds.a <- predict(lm.fit, data.frame(acceleration = agrid))
plot(mpg ~ acceleration, data = Auto,  col = "darkgrey")

Любая помощь будет принята с благодарностью. Спасибо!

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

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

Начнем с теоретической части. Кусочно-полиномиальная регрессия — это метод, который позволяет моделировать данные с различными тенденциями на разных участках. В отличие от простой линейной или обычной полиномиальной регрессии, кусочно-полиномиальная регрессия применяется, когда разные части данных имеют различные паттерны и углы наклона. Этот метод заключается в разбиении одной из переменных на интервалы (или «срезы») и подгонке полинома отдельного порядка на каждом из этих интервалов. Это позволяет моделям более гибко адаптироваться к изменениям распределения данных.

Теперь перейдем к проблеме, с которой вы столкнулись. Проанализируем ваш код и ошибку, которая в нем возникает:

Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 
factor cut(acceleration, 8) has new levels (7.98,10], (10,12], (12,14], (14,16], (16,18], (18,20], (20,22], (22,24]

Ошибка гласит, что границы уровней фактора не совпадают с ожидаемыми. Это может случиться, если данные, которые вы используете для обучения и проверки модели, не синхронизированы, или если различные уровни были заданы во время разбиения. Часто такое происходит, если после разрезания данных с помощью функции cut() изменяются границы, и при этом модель не успевает адаптироваться к измененной факторной переменной.

Вот несколько рекомендаций и шагов, которые нужно предпринять для устранения ошибки:

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

  2. Проверьте, что данные очищены. Убедитесь, что у вас нет пропущенных значений в столбце acceleration, так как они могут нарушить правильное разбиение и моделирование. Используйте функцию na.omit() или соответствующие методы для обработки пропусков.

  3. Визуализируйте и проверьте уровни. Добавьте вывод levels(cut(Auto$acceleration, 8)) до применения модели и после, чтобы удостовериться, что уровни соответствуют ожидаемым как при обучении, так и при проверке.

  4. Стандартизируйте данные. Если между разными запускаемыми моделями обнаруживаются различия, то хранение разрезанных уровней вместе с моделью может помочь избежать расхождений. Это можно сделать либо путем добавления этих уровней в данные до их передачи в модель, либо путем его принудительного обеспечения для каждого запуска.

Пример применения:

# При фиксации уровней разбиения
breaks_fixed <- cut(Auto$acceleration, 8)
Auto$acc.cut <- factor(breaks_fixed, levels = levels(breaks_fixed))

glm.fit <- glm(mpg ~ acc.cut, data = Auto)
cv.steps <- rep(NA, 10)

for (i in 2:10) {
  Auto$acc.cut <- cut(Auto$acceleration, breaks = i)
  cv.steps[i] <- cv.glm(Auto, glm.fit, K = 10)$delta[1]
}

# Проверка результатов
print(levels(Auto$acc.cut))

Использование этих рекомендаций поможет устранить проблему с уровнями факторов и позволит модели корректно обучаться и предсказывать значения. Такая методология улучшит точность результата и повысит надежность данного машинного обучения.

Убедитесь, что все данные последовательно обрабатываются, что приводит к улучшению качества моделирования и надежности ваших выводов в бизнес-контексте. Таким образом, применение концептуальных знаний, примеров и рекомендаций на практике существенно улучшает аналитические способности и способствует всеобъемлющему пониманию данных.

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

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