Всем привет!

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

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

  1. Линейная регрессия
  2. Полиномиальная регрессия
  3. Преобразование журнала
  4. Сплайновая регрессия
  5. Обобщенные аддитивные модели

Мы проведем наш анализ, используя набор данных «Boston» в пакете «MASS» в R. Давайте сначала вызовем наш набор данных:

data(“Boston”,package=”MASS”)

Давайте посмотрим на их описательную статистику:

Давайте рассмотрим взаимосвязь между переменными medv и lstat в этом наборе данных. Здесь переменная «lstat» представляет собой процент низкого статуса населения, а переменная «medv» указывает среднюю стоимость домов, занятых владельцем. Здесь;

  • зависимая переменная– ›medv
  • независимая переменная - ›lstat

можно определить. Давайте посмотрим на взаимосвязь между этими двумя переменными:

plot(Boston$lstat,Boston$medv)

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

library(tidyverse)
library(caret)
library(ggplot2)
library(splines)
library(mgcv)

Теперь мы можем приступить к нашему анализу. Во-первых, давайте разделим наш набор данных на 80% набора данных для обучения и 20% набора данных для тестирования. Коды R для этого показаны ниже:

set.seed(123)
training.samples<-Boston$medv %>%
   createDataPartition(p=0.8,list=FALSE)
train.data<-Boston[training.samples, ]
test.data<-Boston[-training.samples, ]

Таким образом, мы разделили наш набор данных на наборы данных для обучения и тестирования.

Давайте смоделируем этот набор данных, используя методы, указанные в элементах, и сравним методы с точки зрения критериев среднеквадратичной ошибки (RMSE) и R-Squared (R2):

1. Линейная регрессия

Давайте смоделируем взаимосвязь между переменными с помощью простой линейной регрессии и рассмотрим критерии RMSE и R-квадрат:

model<-lm(medv~lstat,data=train.data)
predictions<-model %>% predict(test.data)
data.frame(
  RMSE=RMSE(predictions,test.data$medv),
  R2=R2(predictions,test.data$medv)
)
      RMSE        R2
1 6.073002 0.5354403

Значения RMSE и R-квадрата нашего набора тестовых данных составляют 6,073002 и 0,5354403 соответственно. Давайте рассмотрим линию регрессии для простой модели линейной регрессии между переменными. Коды R показаны ниже.

ggplot(train.data, aes(lstat,medv))+
  geom_point()+
  stat_smooth(method=lm, formula=y~x)

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

2. Полиномиальная регрессия.

Полиномиальная регрессия получается путем взятия степеней независимой переменной. Здесь важно то, в какой степени это нужно принимать. Например; Модель линейной регрессии для генерации полиномиальной регрессии 2-й степени показана ниже.

medv = bo + b1 * lstat + b2 * lstat²

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

model<-lm(medv~poly(lstat,2),data=train.data)
summary(model)

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

model<-lm(medv~poly(lstat,6),data=train.data)
summary(model)

Когда мы посмотрим на результат, мы можем сказать, что он имеет смысл для первых 5 градусов. Мы видим, что 6-я степень значима. В этом случае мы можем создать модель для первых 5 градусов и интерпретировать результаты.

model<-lm(medv~poly(lstat,5),data=train.data)
predictions<-model %>% predict(test.data)
data.frame(
  RMSE=RMSE(predictions,test.data$medv),
  R2=R2(predictions,test.data$medv)
)
        RMSE     R2
1 4.96127 0.6887199

Мы видим, что RMSE и R-квадрат составляют 4,96127 и 0,6887199 соответственно. Давайте исследуем линию регрессии на взаимосвязь между переменными:

ggplot(train.data, aes(lstat,medv))+
  geom_point()+
  stat_smooth(method=lm,formula=y~poly(x,5))

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

3. Преобразование журнала

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

model<-lm(medv~log(lstat),data=train.data)
predictions<-model %>% predict(test.data)
data.frame(
  RMSE=RMSE(predictions,test.data$medv),
  R2=R2(predictions,test.data$medv)
)
         RMSE     R2
1 5.243127 0.6565156

Таким образом, мы получили значения RMSE и R-квадрат. Теперь посмотрим на линию регрессии:

ggplot(train.data, aes(lstat,medv))+
  geom_point()+
  stat_smooth(method=lm,formula=y~log(x))

4. Сплайновая регрессия.

Другой способ справиться с нелинейными отношениями - это сплайн-регрессия. Здесь, как и в полиномиальной регрессии, модель создается путем получения степеней. Кроме того, значения узлов (узлов) получаются, и линия регрессии может быть построена путем правильного объединения узлов с заданной степенью. При сплайн-регрессии обычно устанавливается модель с 3-й степенью. Теперь давайте проверим результаты, применив этот метод к набору обучающих данных:

knots<-quantile(train.data$lstat,p=c(0.10,0.50,0.90))
model<-lm(medv~bs(lstat, knots=knots),data=train.data)
predictions<-model %>% predict(test.data)
data.frame(
  RMSE=RMSE(predictions,test.data$medv),
  R2=R2(predictions,test.data$medv)
)
      RMSE        R2
1 4.958616 0.6911364

Здесь при определении узлов используется функция «квантиль». Видно, что всего используется 3 разных узла. 3 узла определяются с квантилями (квантилями) 0,1, 0,5 и 0,9 набора данных. Однако при желании значения узлов можно изменить. Эти значения квантилей, по-видимому, дают лучшие результаты в этом наборе данных. Значения RMSE и R-квадрата равны «4,958616» и «0,6911364» соответственно. Можно сказать, что он дает лучшие результаты, особенно по сравнению с другими методами. Давайте создадим линию регрессии для связи между переменными:

ggplot(train.data, aes(lstat,medv))+
  geom_point()+
  stat_smooth(method=lm,formula=y~splines::bs(x,df=3))

На рисунке показана взаимосвязь между переменными для сплайн-регрессии.

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

В полиномиальной регрессии определяются степени, а в сплайн-регрессии определяются узлы и создаются модели. В обобщенных аддитивных моделях это не так. Оценка данных может быть получена автоматически. Для обобщенных аддитивных моделей функция «гамма» должна использоваться в R. Коды R показаны ниже:

model<-gam(medv~s(lstat),data=train.data)
predictions<-model %>% predict(test.data)
data.frame(
  RMSE=RMSE(predictions,test.data$medv),
  R2=R2(predictions,test.data$medv)
)
     RMSE        R2
1 5.01729 0.6838236

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

ggplot(train.data, aes(lstat,medv))+
  geom_point()+
  stat_smooth(method=gam,formula=y~s(x))

Таким образом, мы создали линию регрессии.

ЗАКЛЮЧЕНИЕ

Мы обсудили альтернативные методы, которые можно использовать для моделирования нелинейных отношений, и сравнили их с точки зрения критериев RMSE и R-квадрат. В результате мы можем сказать, что для этого набора данных могут быть предпочтительны полиномиальная регрессия, сплайн-регрессия и обобщенные аддитивные модели. Увидимся в моей следующей статье ...

Хорошего дня :)

ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА

  • Альбукадель Кассамбара (2017), Основы машинного обучения - Практическое руководство в R.