Изучение линейной регрессии: математические основы, преимущества и ограничения

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

В части 1 мы обсудили регрессию на высоком уровне и выполнили проектирование функций в наборе данных Facebook-Comment-Prediction. Наша цель - предсказать количество комментариев к сообщению с учетом различных функций. После предварительной обработки мы выбрали 14 последних функций. Описание набора данных можно найти здесь.

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

Итак, приступим!

Функция стоимости

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

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

Наиболее часто используемой функцией стоимости для линейной регрессии является функция среднего квадрата ошибки (MSE).

  • hθ(x(i))=θ0+θ1x(i)
  • (x(i),y(i))(x(i),y(i)) - это i-е обучающие данные.
  • m - количество обучающих выборок.
  • 1/2 - это константа, которая помогает получить среднее значение производной функции стоимости.

(hθ(x(i))−y(i))² - это, по сути, квадрат разности прогнозируемых и рассчитанных значений целевой переменной. Мы будем использовать эту формулу в следующем разделе фрагмента кода Python для расчета градиентного спуска.

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

Градиентный спуск

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

Но как нам достичь такой стадии?

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

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

Как мы это делаем?

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

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

Реализация градиентного спуска в Python

Давайте сначала взглянем на алгоритм градиентного спуска, а затем рассмотрим его шаг за шагом.

#saving the value of cost function at each step
costs = list()
#regularised gradient descent with lambda user-provided
def gradient_descent(alpha, x, y, numIterations, lmbda):
    m = x.shape[0] #number of samples
    x = np.c_[ np.ones(m), x]
    theta = np.ones(14)
    x_transpose = x.transpose()
    
    for iter in range(0, numIterations):
        hypothesis = np.dot(x, theta)
        loss = hypothesis - y
        J = (np.sum(loss**2)//(2*m))
        costs.append(J)
        gradient = np.dot(x_transpose, loss)/m   
        theta = theta - alpha * gradient 
        
    theta1 = theta
    y_train_pred = np.dot(x,theta1)
    # root mean square error
    rms_train = ((((y_train_pred - np.array(y))**2).sum())/m)**0.5
    
    x1 = np.c_[ np.ones(X_test.shape[0]), X_test]
    y_test_pred = np.dot(x1,theta)
   
    rms_test = ((((y_test_pred - np.array(Y_test))**2).sum())/(x1.shape[0]))**0.5 ## root mean square error
    xyz = (alpha,rms_train,rms_test)
    return xyz

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

theta = theta - alpha * gradient обновляет значение шага в соответствии с производной (градиент = наклон = производная). С помощью окончательного значения тета мы вычисляем значения y_pred, а затем значения rms_test и rms_train. Значения среднеквадратичной ошибки дают нам интуитивное представление о соответствии нашей модели. Поскольку по сути это квадрат разницы между прогнозируемым и рассчитанным целевым значением (квадратный корень), чем ниже среднеквадратичные значения, тем лучше модель.

Регуляризованная линейная регрессия

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

Типы регуляризации

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

Разница между техникой лассо и ридж

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

Реализация регуляризации в Python

Затем давайте реализуем гребневую регрессию в нашей модели. Функцию стоимости J нужно немного изменить, чтобы обеспечить регуляризацию. Регуляризация модели в нашем случае крайне необходима, потому что мы выполняем множественную регрессию. Мы завершили работу над 14 функциями, и эти многие функции могут привести к переобучению или смещению, поскольку в конечном итоге они могут иметь сложные отношения с целевой переменной.

Начинаем!

Когда нужно прекратить тренировку

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

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

Метрики для оценки производительности модели

Мы использовали значения rms_train и rms_test для оценки нашей модели для определенного альфа-значения. Вот совокупные результаты:

Как видите, наилучшие результаты для нашего набора данных были получены при использовании 0,30 в качестве альфа-значения.

Вот несколько других широко используемых показателей:

  1. Среднеквадратичная ошибка (MSE): среднее значение квадрата разницы между целевым значением и значением, предсказанным моделью.

2. Средняя абсолютная ошибка (MAE): абсолютная разница между целевым значением и значением, предсказанным моделью.

3. R² (R в квадрате): этот метод сравнивает нашу модель с постоянной базовой линией. Эта постоянная базовая линия изображена путем рисования среднего.

Преимущества линейной регрессии

Преимущества линейной регрессии заключаются в следующем:

  1. Простота. Линейная регрессия дает хорошие результаты, когда существует линейная связь между ковариатами и целевой переменной.
  2. Математически обосновано. Учитывая, что данные соответствуют всем предположениям модели линейной регрессии, математически оценить веса несложно, и у вас есть гарантия нахождения оптимальных весов. Кроме того, существует несколько показателей ошибок и значений для определения соответствия модели.
  3. Быстро. Структура модели и основные вычисления для регрессионной модели могут быть вычислены за очень короткое время. Таким образом, время отклика модели меньше даже при больших объемах данных.

Недостатки линейной регрессии

Ниже приведены некоторые недостатки линейной регрессии:

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

Репозиторий

Это ссылка на полный исходный код вместе с набором данных, который я использовал.



Источники для начала работы с линейной регрессией





Заключение

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

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

Пожалуйста, помогите мне расти и совершенствоваться! :)

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

Независимая редакция, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по обработке данных и группам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим участникам и не продаем рекламу.

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее создавать лучшие модели машинного обучения.