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

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

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

Уравнение регрессии

Простая линейная регрессия точно оценивает, насколько изменится Y, когда X изменится на определенную величину. С коэффициентом корреляции переменные X и Y взаимозаменяемы. С помощью регрессии мы пытаемся предсказать переменную Y по X, используя линейную зависимость (то есть линию):

Y = b0 + b1 X

Символ b0 известен как точка пересечения (или константа), а b1 - как наклон для X. Оба значения появляются на выходе R как коэффициенты. Переменная Y известна как ответная или зависимая переменная, поскольку она зависит от X. Переменная X известна как предиктор или независимая переменная. Сообщество машинного обучения склонно использовать другие термины, называя Y целью, а X вектором функций.

Подходящие значения и остатки

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

Подбираемые значения, также называемые прогнозируемыми значениями, обычно обозначаются (Y-шляпа). Их дают:

где b0 & b1 указывает, что коэффициенты оценены по сравнению с известными.

Множественная линейная регрессия

Когда есть несколько предикторов, уравнение просто расширяется, чтобы учесть их:

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

Теперь, когда у нас есть представление о том, что такое линейная регрессия, мы подробно рассмотрим различные типы регрессионных моделей, чтобы спрогнозировать цену очень популярного набора данных по жилью в округе Кинг. Вы можете скачать набор данных здесь. Цель состоит в том, чтобы мы использовали разные модели для определения плоскости, которая лучше всего соответствует нашим данным с низким уровнем ошибок. Затем эта плоскость / линия будет использоваться для прогнозирования результатов по мере поступления новых данных.

Данные о жилищном строительстве округа Кинг

Перед началом анализа убедитесь, что у вас установлены и загружены следующие пакеты R:

library(doParallel)
library(‘randomForest’)
library(MASS)
library(readr)
library(ggplot2)
library(corrplot)
library(mlbench)
library(Amelia)
library(plotly)
library(reshape2)
library(caret)
library(caTools)
library(dplyr)
library(moments)

Исследовательский анализ данных

Пример использования регрессии - оценка стоимости домов. Оценщики округа должны оценить стоимость дома для определения налогов. Потребители и профессионалы в сфере недвижимости обращаются к популярным веб-сайтам, таким как Zillow, чтобы узнать справедливую цену. Вот несколько строк данных о жилье из округа Кинг (Сиэтл), штат Вашингтон, из файла house data.frame:

house <- read.csv(“C:/personal/kc_house_data.csv”)
head(house)

Сам набор данных состоит из 21 613 примеров с 19 функциями (без учета столбцов идентификатора и даты). Особенности:

Теперь, если вы заметили данные, несколько значений, которые вы видите, даны как категориальные, например набережная, вид, состояние, оценка и т. Д. Теперь у вас также есть возможность сгруппировать переменную почтового индекса, как номер почтового индекса отдельно ничего не определяет, но цена дома зависит от местоположения. Если вы знаете, что некоторые почтовые индексы принадлежат шикарному району города, вы можете сгруппировать их в zipgroup1, затем в zipgroup2 и так далее. Мы не будем делать этого здесь, так как у нас очень мало представления о том, какая область с почтовым индексом принадлежит какой части города. Но у нас есть значения lat и long, поэтому мы будем их использовать. Но если вы хотите узнать больше о преобразовании данных в категориальные значения, вы можете обратиться к этой ссылке. Обычно это делается с помощью команды relvel.

Отсутствующие значения

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

missmap(house,col=c(‘yellow’,’black’),y.at=1,y.labels=’’,legend=TRUE)

согласно этому графику отсутствуют пропущенные значения.

Теперь удалим столбец id и столбец даты (вся информация собирается только в течение одного года).

house <- house[,-c(1,2)]

Коррелированные предсказатели

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

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

corrplot(cor(house),type=”upper”,method=”color”,addCoef.col = “black”,tl.col = “black”, number.cex = 0.6,mar=c(0,0,0,0))

Теперь, когда мы знаем, какие пары переменных коррелированы, мы можем выбрать, какую из них оставить, а какую удалить:

[sqft_living, grade] : 0.76 , will keep sqft_living
[sqft_living, sqft_above] : 0.88 , will keep sqft_living
[sqft_living, sqft_living15] : 0.76 , will keep sqft_living
[sqft_lot, sqft_lot15] : 0.72 , will keep sqft_lot

Итак, мы удаляем оценку, sqft_above, sqft_living15, sqft_lot15, поскольку информация, которую они переносят, уже предоставляется другими переменными.

house <- house[,-c(10,11,18,19)]

Размерность

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

Хотя я бы удалил почтовый индекс из набора данных, поскольку данные о местоположении содержатся в lat и long.

house <- house[,-c(13)]

Асимметрия

Далее мы попытаемся проанализировать асимметрию наших числовых переменных. Проверка асимметрии выполняется для того, чтобы данные были нормальными, что является одним из допущений линейной регрессии. Некоторые люди предполагают здесь, что приемлемый диапазон значений асимметрии лежит между (-2,2). Следовательно, мы определяем, какие переменные находятся за пределами этого диапазона, и они будут преобразованы с помощью функции журнала [мы не будем преобразовывать категориальные данные].

apply(house, 2, skewness, na.rm =TRUE)

Преобразование необходимых данных в журнал:

house$price <- log(house$price)
house$sqft_lot <- log(house$sqft_lot)

Разницу в асимметрии до и после преобразования можно проверить на следующих двух гистограммах:

Моделирование данных

Теперь, когда мы выполнили наш EDA, мы начнем с цели спрогнозировать продажную цену на основе других переменных. Для начала мы возьмем все переменные / характеристики для создания нашей модели; аргумент na.action = na.omit заставляет модель отбрасывать записи с пропущенными значениями.

Загруженный набор данных разделяется на наборы для обучения и проверки с использованием разделения 70/30. Теперь у нас есть обучающий набор данных, который мы будем использовать для обучения наших моделей, и набор проверки, который мы будем использовать позже для измерения производительности наших моделей.

set.seed(1000)
i <- sample(2, nrow(house), replace=TRUE, prob=c(0.7, 0.3))
trainData <- house[i==1,]
testData <- house[i==2,]
model_lm <- lm(price ~ bedrooms + bathrooms + sqft_living + sqft_lot + floors +waterfront+ view + sqft_basement + condition + yr_built + lat + long, data = trainData)
summary(model_lm)

Как мы можем видеть, обобщая нашу линейную модель, коэффициент детерминации (или R-Squared) хороший. 70,8% дисперсии результата можно предсказать из созданной нами модели линейной регрессии.

Затем мы проанализируем RMSE (или среднеквадратическую ошибку) нашей модели.

prediction_lm <- predict(model_lm, testData, type=”response”)
model_lm_output <- cbind(testData, prediction_lm)
# RMSE value
RMSE_lm <- sqrt(mean((model_lm_output$price — model_lm_output$prediction_lm)^2,na.rm=TRUE))
print(RMSE_lm)

Как мы видим выше, наша RMSE составляет 0,28. Он измеряет разницу между ценами, прогнозируемыми нашей моделью, и фактическими значениями. Чем ниже значение, тем лучше. Наш близок к нулю, так что это хороший показатель.

Теперь, когда у нас есть базовая модель, нам нужно понять ее эффективность:

Наиболее важным показателем производительности с точки зрения науки о данных является среднеквадратичная ошибка или RMSE. RMSE - это квадратный корень из средней квадратичной ошибки предсказанных значений:

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

RMSE_house_lm <- sqrt(mean(residuals(house_lm)^2))

Это измеряет общую точность модели и является основой для сравнения ее с другими моделями (включая модели, подходящие с использованием методов машинного обучения).

Подобно RMSE стандартная остаточная ошибка или RSE. В этом случае у нас есть p предикторов, а RSE определяется как:

MSE_house_lm <- (mean(residuals(house_lm)^2))

Единственная разница в том, что знаменатель - это степени свободы, а не количество записей. На практике для линейной регрессии разница между RMSE и RSE очень мала, особенно для приложений с большими данными.

В нашем случае наблюдаемые значения цен отклоняются от прогнозируемой в среднем примерно на 202700 единиц. Это соответствует коэффициенту ошибок 202700 / среднее значение (цена дома) = 37,5%, что является высоким показателем.

Остаточная сумма квадратов (RSS) - это сумма квадратов остатков:

rss <- sum(residuals(fit)^2)

Стандартная остаточная ошибка (RSE) - это квадратный корень из (RSS / степени свободы):

rse <- sqrt( sum(residuals(fit)^2) / fit$df.residual )

Еще одна полезная метрика, которую вы увидите в выводе программного обеспечения, - это коэффициент детерминации, также называемый статистикой R-квадрата. R-квадрат находится в диапазоне от 0 до 1 и измеряет долю вариации данных, которая учитывается в модели. Это полезно в основном для объяснения использования регрессии, когда вы хотите оценить, насколько хорошо модель соответствует данным. Формула:

Знаменатель пропорционален дисперсии Y. Выходные данные R также представляют скорректированный R-квадрат, который корректирует степени свободы; редко это существенно отличается при множественной регрессии.

В нашем случае R2 равняется 0,69, и это нормально.

Наряду с оцененными коэффициентами R сообщает стандартную ошибку коэффициентов (SE) и t-статистику:

T-статистика - и ее зеркальное отображение, p-значение - измеряет степень, в которой коэффициент является «статистически значимым», то есть вне диапазона того, что может дать случайное расположение предиктора и целевой переменной. Чем выше t-статистика (и чем ниже p-значение), тем значительнее предсказатель.

ВНИМАНИЕ!

Помимо t-статистики, R и другие пакеты часто сообщают p-значение (Pr (›| t |) в выходных данных R) и F-статистику. Специалисты по анализу данных обычно не слишком увлекаются интерпретацией этих статистических данных или вопросом статистической значимости. Специалисты по анализу данных в первую очередь сосредотачивают внимание на t-статистике как на полезном руководстве по поводу того, следует ли включать предиктор в модель или нет. Высокие t-статистики (которые идут с p-значениями, близкими к 0) указывают на то, что предиктор должен быть сохранен в модели, в то время как очень низкий t-статистика указывает, что предиктор может быть отброшен.

Мы можем получить некоторое представление о графическом представлении нашей линейной модели:

# Graphic representation
par(mfrow=c(2,2))
plot(model_lm)

Как теперь читать эти графики?

  • Остаточные и подобранные: не должно быть сильных закономерностей и выбросов, поскольку остатки случайным образом распределяются вокруг нуля. Как мы видим на нашем графике, все наши остатки распределены в пределах (-1,1) и близки к 0.
  • Нормальный Q-Q: остатки должны нормально распределяться по диагональной линии, как это происходит в нашем случае.
  • Scale-Location: он похож на первый график, но невязки по оси Y масштабируются. Никакого сильного паттерна быть не должно, как в данном случае, хотя у нас ровная положительная диагональная линия.
  • Остаточные суммы и кредитное плечо: полезно обнаруживать выбросы. В нашем случае кажется, что наш график не содержит выбросов за прерывистой красной линией (расстояние Кука). Посмотрите на значения расстояния Кука: любое значение выше 1 указывает на случай, который может повлиять на модель. В статистике Куковское расстояние или Кука D - это обычно используемая оценка влияния точки данных при выполнении регрессионного анализа методом наименьших квадратов. В обычном практическом анализе методом наименьших квадратов расстояние Кука можно использовать несколькими способами: для обозначения важных точек данных, которые особенно стоит проверить на достоверность; или указать области пространства дизайна, где было бы хорошо получить больше точек данных.

В некоторых текстах говорится, что точки, для которых расстояние Кука больше 1, следует рассматривать как важные. Другие тексты дают вам порог 4 / N или 4 / (N - k −1), где N - количество наблюдений, а k - количество независимых переменных. Джон Фокс в своем буклете по регрессионной диагностике довольно осторожен, когда дело доходит до определения числовых пороговых значений. Он советует использовать графику и более детально изучить точки со «значениями D, которые существенно больше остальных». По словам Фокса, пороговые значения следует использовать только для улучшения графического отображения. В наших данных мы видим как минимум 2 таких точки, на которые стоит обратить внимание.

cooksd <- cooks.distance(model_lm)
# Plot the Cook’s Distance
sample_size <- nrow(trainData)
plot(cooksd, pch=”*”, cex=2, main=”Influential Obs by Cooks distance”) # plot cook’s distance
text(x=1:length(cooksd)+1, y=cooksd, labels=ifelse(cooksd>0.1, names(cooksd),””), col=”red”) # add labels

С помощью приведенной выше команды и графика мы можем получить номера строк данных выбросов. Если вы проверите эти данные вручную, вы увидите расхождения в этих данных (в одной спальне 33), давайте посмотрим, что произойдет, если мы удаляем это:

#try to remove the top x outliers to have a look
top_x_outlier <- 2
influential <- as.numeric(names(sort(cooksd, decreasing = TRUE)[1:top_x_outlier]))
house2 <- house[-c(15871,12778), ]

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

Ранжируйте функции по важности

Очень сложно угадать, какие функции включить в нашу модель, поскольку мы не знали, какие функции выбрать, мы взяли все функции в нашей исходной модели. Важность функций можно оценить на основе данных, построив модель. Некоторые методы, такие как деревья решений, имеют встроенный механизм для сообщения о важности переменных. Для других алгоритмов важность может быть оценена с помощью анализа кривой ROC, проводимого для каждого атрибута. Затем varImp используется для оценки важности переменной, которая печатается и наносится на график.

# prepare training scheme
control <- trainControl(method=”repeatedcv”, number=10, repeats=3)
# train the model
model <- train(price~., data=trainData, method=”lm”, preProcess=”scale”, trControl=control)
# estimate variable importance
importance <- varImp(model, scale=FALSE)
# summarize importance
print(importance)
# plot importance
plot(importance)

После выполнения указанной выше команды мы можем увидеть функции, которые модель считает важными.

Выбор функций

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

Популярный автоматический метод выбора функции, предоставляемый пакетом R с курсором, называется рекурсивным устранением признаков или RFE.

В приведенном ниже примере показан пример метода RFE для набора данных. Алгоритм случайного леса используется на каждой итерации для оценки модели. Алгоритм настроен на изучение всех возможных подмножеств атрибутов. В этом примере выбраны все 13 атрибутов, хотя на графике, показывающем точность размеров различных подмножеств атрибутов, мы видим, что всего 6 атрибутов дают почти сопоставимые результаты.

Проблема с алгоритмом RFE заключается в том, что на его выполнение требуется огромное количество времени (я говорю о 10–12 часах), чтобы сократить время, затрачиваемое на использование кластера (сокращено почти до 2 часов, пытаясь проверить ваш диспетчер задач в это время).

Чтобы настроить прогнозную модель с использованием нескольких рабочих процессов, используется отдельная функция для регистрации метода параллельной обработки и определения количества используемых рабочих процессов. Например, чтобы использовать пакет doParallel с пятью ядрами на одном компьютере, пакет загружается и они регистрируются (проверьте диспетчер задач один раз, вы заметите разницу):

library(doParallel)
cl <- makePSOCKcluster(5)
registerDoParallel(cl)
control <- rfeControl(functions=rfFuncs, method=”cv”, number=10)
# run the RFE algorithm, once the cluster cl is built then the algorithm is by default run in parallel.
results <- rfe(house[,2:19], house[,1], sizes=c(1:19), rfeControl=control)
# summarize the results
print(results)
# list the chosen features
predictors(results)
# plot the results
plot(results, type=c(“g”, “o”))
# once the job is done, stop the cluster
stopCluster(cl)

Согласно выходным данным модели, приведенным ниже, 6 переменных дают наименьшее среднеквадратичное значение:

“lat” “long” “sqft_living” “sqft_lot” “yr_built” “view”

Если вы заметили, что функция, выбранная в RFE, и способ varIMP немного отличаются, разные методы будут выбирать разные подмножества функций. Скорее всего, не существует «лучшего набора» функций, как и нет лучшей модели.

Перекрестная проверка

Если вы заметили, что мы используем method = ’CV’, теперь мы увидим, что означает это резюме. Метрики классической статистической регрессии (R2, F-статистика и p-значения) - это все «инсайтовые» метрики - они применяются к тем же данным, которые использовались для соответствия модели. Интуитивно вы можете видеть, что имеет смысл отложить некоторые исходные данные, а не использовать их для соответствия модели, а затем применить модель к отложенным (отложенным) данным, чтобы увидеть, насколько хорошо они работают. Обычно вы будете использовать большую часть данных для соответствия модели и использовать меньшую часть для тестирования модели. Идея валидации «вне выборки» не нова, но на самом деле она не прижилась до тех пор, пока большие наборы данных не стали более распространенными; имея небольшой набор данных, аналитики обычно хотят использовать все данные и подобрать наилучшую возможную модель. Однако использование удерживающей выборки оставляет вас в условиях некоторой неопределенности, которая возникает просто из-за изменчивости небольшой удерживающей выборки. Насколько изменилась бы оценка, если бы вы выбрали другую выборку несогласных?

Перекрестная проверка расширяет идею удерживающей выборки на несколько последовательных удерживающих выборок. Алгоритм базовой k-кратной перекрестной проверки следующий:

1. Set aside 1/k of the data as a holdout sample.
2. Train the model on the remaining data.
3. Apply (score) the model to the 1/k holdout, and record needed model assessment metrics.
4. Restore the first 1/k of the data, and set aside the next 1/k (excluding any records that got picked the first time).
5. Repeat steps 2 and 3.
6. Repeat until each record has been used in the holdout portion.
7. Average or otherwise combine the model assessment metrics.

Разделение данных на обучающую выборку и удерживающую выборку также называется сверткой.

Пошаговая регрессия

В нашей задаче многие переменные могут использоваться в качестве предикторов регрессии. Существует метод, называемый Пошаговой регрессией, который последовательно добавляет или удаляет элементы из модели и проверяет производительность модели.

Обратите внимание, что функция train () [пакет каретки] обеспечивает простой рабочий процесс для выполнения пошагового выбора с использованием скачков и пакетов MASS. У него есть опция с именем method, которая может принимать следующие значения:

  • «LeapBackward», чтобы соответствовать линейной регрессии с обратным выбором
  • «LeapForward», чтобы соответствовать линейной регрессии с прямым выбором
  • «LeapSeq», чтобы соответствовать линейной регрессии с пошаговым выбором.

Вам также необходимо указать параметр настройки nvmax, который соответствует максимальному количеству предикторов, которые должны быть включены в модель.

Например, вы можете изменить nvmax от 1 до 5. В этом случае функция начинается с поиска различных лучших моделей разного размера, вплоть до лучшей модели с 5 переменными. То есть он ищет лучшую модель с одной переменной, лучшую модель с двумя переменными,…, лучшие модели с пятью переменными.

Мы будем использовать 10-кратную перекрестную проверку, чтобы оценить среднюю ошибку прогноза (RMSE) каждой из 5 моделей. Статистическая метрика RMSE используется для сравнения 5 моделей и для автоматического выбора лучшей, где лучший определяется как модель, которая минимизирует RMSE.

Пошаговая регрессия очень полезна для многомерных данных, содержащих несколько переменных-предикторов. Другими альтернативами являются штрафная регрессия (регрессия гребня и лассо) и методы регрессии на основе основных компонентов (PCR и PLS).

## THIS IS FOR STEPWISE REGRESSION
set.seed(123)
# Set up repeated k-fold cross-validation
train.control <- trainControl(method = “cv”, number = 10)
# Train the model
step.model <- train(price ~., data = trainData[,1:14],method = “leapSeq”,tuneGrid = data.frame(nvmax = 1:13),trControl = train.control)
step.model$results
step.model$bestTune
summary(step.model$finalModel)

RMSE с 7 переменными почти аналогичен тому, который мы нашли в начале, с большим количеством переменных.

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

Включение дополнительных переменных обычно снижает RMSE и увеличивает R2. Следовательно, они не подходят для помощи при выборе модели. В 1970-х Хиротугу Акаике, выдающийся японский статистик, разработал метрику под названием AIC (информационные критерии Акаике), которая ограничивает добавление терминов в модель. В случае регресса AIC имеет вид:

AIC = 2P + n журнал (RSS / n)

где p - количество переменных, а n - количество записей. Цель состоит в том, чтобы найти модель, которая минимизирует AIC; модели с k дополнительными переменными штрафуются на 2k.

AIC, BIC И MALLOWS CP

Формула для AIC может показаться немного загадочной, но на самом деле она основана на асимптотических результатах теории информации. Существует несколько вариантов AIC:

AICc: версия AIC, скорректированная для малых размеров выборки.

BIC или байесовские информационные критерии: аналогичны AIC с более сильным штрафом за включение дополнительных переменных в модель.

Mallows Cp: вариант AIC, разработанный Колином Мэллоуз.

Специалистам по обработке данных обычно не нужно беспокоиться о различиях между этими метриками в выборке или лежащей в их основе теории.

Как найти модель, которая минимизирует AIC? Один из подходов - перебор всех возможных моделей, который называется регрессией всех подмножеств. Это требует больших вычислительных ресурсов и неосуществимо для задач с большими данными и многими переменными. Привлекательной альтернативой является использование пошаговой регрессии, о которой мы узнали выше, которая последовательно добавляет и отбрасывает предикторы, чтобы найти модель, которая снижает AIC. Еще проще - прямой выбор и обратный выбор. При прямом выборе вы начинаете без предикторов и добавляете их один за другим, на каждом шаге добавляя предиктор, который имеет наибольший вклад, и останавливаетесь, когда вклад больше не является статистически значимым. При обратном выборе или обратном исключении вы начинаете с полной модели и отбираете предикторы, которые не являются статистически значимыми, пока не остаетесь с моделью, в которой все предикторы статистически значимы.

Проблема с пошаговыми методами заключается в том, что они оценивают соответствие переменной на основе других переменных, которые были в модели. Некоторые люди используют аналогию с одеванием, чтобы описать эту проблему. Если вы выбираете одежду с помощью метода ступенчатой ​​регрессии, он будет определять, какую одежду вам следует носить, на основе уже выбранной одежды.

Штрафная регрессия по духу аналогична AIC. Вместо явного поиска по дискретному набору моделей уравнение подгонки модели включает ограничение, которое штрафует модель за слишком много переменных (параметров). Вместо полного исключения переменных-предикторов - как при пошаговом, прямом и обратном выборе - регрессия со штрафными санкциями применяет штраф за счет уменьшения коэффициентов, в некоторых случаях почти до нуля. Распространенными методами регрессии со штрафными санкциями являются гребневая регрессия и регрессия лассо.

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

Регрессия гребня и лассо

Этот раздел взят из превосходной статьи по аналитике видхья. Чтобы узнать больше о математике, лежащей в основе регрессии Риджа и Лассо, перейдите по ссылке.

Регуляризация помогает решить проблему чрезмерной подгонки в машинном обучении. Простая модель будет очень плохим обобщением данных. В то же время сложная модель может не работать на тестовых данных из-за чрезмерной подгонки. Нам нужно выбрать правильную модель между простой и сложной моделью. Регуляризация помогает выбрать предпочтительную сложность модели, чтобы модель лучше предсказывала. Регуляризация - это не что иное, как добавление штрафного члена к целевой функции и управление сложностью модели с помощью этого штрафного члена. Его можно использовать для многих алгоритмов машинного обучения. В регрессии Риджа и Лассо используются регуляризации L2 и L1.

Регрессия Риджа и Лассо - мощные методы, обычно используемые для создания экономичных моделей при наличии «большого» количества функций. Здесь "большой" обычно означает одно из двух:

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

Хотя может показаться, что Ridge и Lasso работают для достижения общей цели, присущие им свойства и практические варианты использования существенно различаются. Если вы слышали о них раньше, вы должны знать, что они работают, штрафуя величину коэффициентов функций и минимизируя ошибку между прогнозируемыми и фактическими наблюдениями. Это так называемые методы «регуляризации». Ключевое различие заключается в том, как они назначают штраф коэффициентам:

  1. Ридж-регрессия:
  • Выполняет L2-регуляризацию, т.е. добавляет штраф, эквивалентный квадрату величины коэффициентов.
  • Цель минимизации = LS Obj + α * (сумма квадратов коэффициентов)

2. Регрессия лассо:

  • Выполняет регуляризацию L1, т.е. добавляет штраф, эквивалентный абсолютному значению величины коэффициентов.
  • Цель минимизации = LS Obj + α * (сумма абсолютных значений коэффициентов)

Обратите внимание, что здесь «LS Obj» означает «цель наименьших квадратов», то есть цель линейной регрессии без регуляризации.

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

1. Ключевое отличие

  • Ридж: он включает в себя все (или ни одного) из элементов модели. Таким образом, основным преимуществом гребневой регрессии является уменьшение коэффициента и уменьшение сложности модели.
  • Лассо. Наряду с коэффициентами сжатия лассо также выполняет выбор функций. Некоторые коэффициенты становятся в точности равными нулю, что эквивалентно исключению конкретной характеристики из модели.

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

2. Типичные варианты использования

  • Ридж: в основном используется для предотвращения переобучения. Поскольку он включает в себя все функции, он не очень полезен в случае чрезмерно высоких функций, скажем, миллионов, поскольку создает вычислительные проблемы.
  • Лассо: поскольку он предоставляет разреженные решения, он обычно является предпочтительной моделью (или некоторым вариантом этой концепции) для моделирования случаев, когда #features исчисляются миллионами или более. В таком случае получение разреженного решения имеет большое вычислительное преимущество, поскольку особенности с нулевыми коэффициентами можно просто игнорировать.

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

3. Наличие высококоррелированных функций

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

Наряду с Ridge и Lasso, Elastic Net - еще один полезный метод, который сочетает в себе регуляризацию L1 и L2. Его можно использовать для уравновешивания плюсов и минусов регрессии по гребню и лассо. Я призываю вас изучить его дальше.

Теперь давайте попробуем регрессию гребня и лассо на нашем наборе данных:

#Ridge Regression Model
tr.control <- trainControl(method=”repeatedcv”, number = 10,repeats = 10)
lambdas <- seq(1,0,-.001) #Tuning Parameter
set.seed(123)
ridge_model <- train(price~., data=trainData,method=”glmnet”,metric=”RMSE”,maximize=FALSE,trControl=tr.control,tuneGrid=expand.grid(alpha=0,lambda=lambdas))
ridge_model$results
varImp(ridge_model)
ridge_preds <- predict(ridge_model,newdata = testData)
model_rrm_output <- cbind(testData, ridge_preds)
RMSE_rrm <- sqrt(mean((model_rrm_output$price - model_rrm_output$ridge_preds)^2,na.rm=TRUE))
print(RMSE_rrm)

Затем мы попробуем регрессию Лассо и посмотрим, сможем ли мы получить лучший результат.

#Lasso Regression Model
set.seed(123)
lasso_model <- train(price~., data=trainData,method=”glmnet”,metric=”RMSE”,maximize=FALSE,trControl=tr.control,tuneGrid=expand.grid(alpha=1,lambda=c(1,0.1,0.05,0.01,seq(0.009,0.001,-0.001), 0.00075,0.0005,0.0001)))
varImp(lasso_model)
lasso_preds <- predict(lasso_model,newdata = testData)
model_lrm_output <- cbind(testData, lasso_preds)
RMSE_lrm <- sqrt(mean((model_lrm_output$price - model_lrm_output$ridge_preds)²,na.rm=TRUE))
print(RMSE_lrm)

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

Взвешенная регрессия

Взвешенная регрессия используется статистиками для различных целей; в частности, это важно для анализа сложных опросов. Специалисты по обработке данных могут счесть взвешенную регрессию полезной в двух случаях:

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

Например, с данными о жилье старые продажи менее надежны, чем более свежие продажи.

Теперь, когда мы попробовали разные режимы линейной регрессии, мы можем перейти к другим методам и посмотреть, сможем ли мы еще больше уменьшить RMSE.

Нелинейная регрессия

В некоторых случаях истинная связь между результатом и переменной-предиктором может быть нелинейной.

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

  • Полиномиальная регрессия. Это простой подход к моделированию нелинейных отношений. Он добавляет полиномиальные или квадратичные члены (квадрат, кубы и т. Д.) К регрессии.
  • Сплайновая регрессия. Подходит для гладкой кривой с серией полиномиальных сегментов. Значения, ограничивающие сегменты сплайна, называются узлами.
  • Обобщенные аддитивные модели (GAM). Подходит для шлицевых моделей с автоматическим подбором узлов.

Предположим, вы подозреваете наличие нелинейной связи между ответом и переменной-предиктором либо на основании априорного знания, либо путем изучения регрессионной диагностики. Полиномиальные члены могут быть недостаточно гибкими, чтобы зафиксировать взаимосвязь, а члены сплайна требуют указания узлов. Обобщенные аддитивные модели или GAM - это метод автоматического подбора сплайновой регрессии. Итак, в следующий раз мы попробуем GAM на наших данных.

Обобщенные аддитивные модели

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

plot(house$lat,house$price)

Кривая регрессии ниже подходит намного лучше:

thegam<-gam(price ~ s(lat),data=trainData)
plot(thegam, residuals=TRUE,shade.col=”gray80")

Запустив GAM на наших данных, мы имеем:

library(mgcv)
lm_gam <- gam(price ~ bedrooms + bathrooms + s(sqft_living) + sqft_lot + floors +waterfront+ view + s(sqft_basement) + condition + yr_built + s(lat) + s(long),data=trainData)
prediction_lm <- predict(lm_gam, testData, type=”response”)
model_lm_output <- cbind(testData, prediction_lm)
# RMSE value
RMSE_lm <- sqrt(mean((model_lm_output$price-model_lm_output$prediction_lm)²,na.rm=TRUE))
print(RMSE_lm)

Термин s (SqFtTotLiving) сообщает функции гаммы найти «лучшие» узлы для сплайнового члена.

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

Случайный лес

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

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

library(randomForest)
set.seed(2000)
tree_rf <- price ~ bedrooms + bathrooms + sqft_living + sqft_lot + floors + condition + grade + sqft_above + yr_built + zipcode + lat + long + sqft_living15 + sqft_lot15
model_rf <- randomForest(tree_rf, data=trainData, ntree=100,proximity=T, do.trace=10)
varImpPlot(model_rf)
plot(model_rf, main = “”)
# Making predictions
prediction_rf <- predict(model_rf, testData)
model_rf_output <- cbind(testData, prediction_rf)
# RMSE
RMSE_rf <- sqrt(mean((model_rf_output$price - model_rf_output$prediction_rf)²,na.rm=TRUE))

Как мы видим выше, наша RMSE для модели случайного леса составляет 0,18. Значение RMSE - самое низкое, что мы видели до сих пор.

Повышение градиента

Повышение градиента - один из самых эффективных методов решения задач машинного обучения. Это алгоритм обучения ансамбля, который объединяет предсказание нескольких базовых оценщиков для повышения надежности по сравнению с одним оценщиком. Как случайный лес, это также модель древовидного классификатора. Мы узнаем больше о GBM позже.

Приведенный ниже код запускает GBM на наших данных:

fitControl <- trainControl(method = “cv”, number = 50)
tune_Grid <- expand.grid(interaction.depth = 2, n.trees = 500, shrinkage = 0.1, n.minobsinnode = 10)
set.seed(825)
tree_gbm <- price ~ bedrooms + bathrooms + sqft_living + sqft_lot + floors + condition + grade + sqft_above + yr_built + zipcode + lat + long + sqft_living15 + sqft_lot15
model_gbm <- train(tree_gbm, data = trainData, method = “gbm”, trControl = fitControl, verbose = FALSE)
print(model_gbm)
prediction_lm <- predict(model_gbm, testData, type=”response”)
model_lm_output <- cbind(testData, prediction_lm)
# RMSE value
RMSE_lm <- sqrt(mean((model_lm_output$price-model_lm_output$prediction_lm)²,na.rm=TRUE))
print(RMSE_lm)

Это тоже хорошо, но не так хорошо, как у случайного леса. Подведем итоги всех моделей, которые мы видели до сих пор в этой статье:

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

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

Ссылки:

Книги:

  • Введение в статистическое обучение с приложениями в R - Gareth James | Даниэла Виттен | Тревор Хасти | Роберт Тибширани
  • 100-страничная книга по машинному обучению - Андрей Бурков
  • Обнаружение статистики с помощью r - Энди Филд | Джереми Майлз | Зои Филд
  • Практическая статистика для специалистов по данным - Питер Брюс | Эндрю Брюс
  • Практическая наука о данных с R - NINA ZUMEL | ДЖОН МОУНТ