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

Почему вы должны беспокоиться?

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

Основы данных в машинном обучении.

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

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

  1. Выводы из данных
  2. Прогнозы для новых невидимых данных.

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

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

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

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

Линейная регрессия представляет собой модель, которая способна предсказывать некоторое количество y на основе некоторого признака x. Неотъемлемое предположение модели линейной регрессии заключается в том, что данные поступают из линейной функции и что изменение данных происходит только из-за случайного шума. Математическое уравнение, описывающее линейную функцию, можно сформулировать следующим образом:

В приведенном выше уравнении beta_1 представляет собой параметр модели, который объясняет взаимосвязь между функцией (x) и прогнозом (y). Первый параметр beta_0 представляет собой термин смещения, он в основном показывает, какое значение y имеет независимо от x.

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

Оценка параметров: обучающая часть в машинном обучении

У нас есть набор точек данных с некоторым значением x и некоторым значением y, связанным с каждой точкой. Предположим, что эти данные были сгенерированы уравнением, подобным описанному выше, и точки, которые мы видим, действительно коррелируют через эту линейную функцию. Загвоздка здесь в том, что мы не знаем параметров этой линейной функции. Итак, мы собираемся оценить для них некоторое значение, пусть наша оценочная функция будет следующей:

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

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

Приведенные выше данные были получены из следующей линейной функции.

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

Заменяя значение оценки y из нашего уравнения оценки, мы получаем:

Теперь, когда у нас есть способ измерить ошибку наших прогнозов, мы можем попытаться минимизировать ее. В математике, когда мы хотим минимизировать функцию, мы берем ее производную по тому, для чего мы хотим ее минимизировать, и приравниваем ее к 0. Например, если у меня есть функция y = f(x) и i хочу получить значение x, для которого я получу минимальное значение y, я найду производную функции по y и приравняю ее к 0, и найду значение x. Попробуем найти следующие значения производных для функции СКО:

Расширенные уравнения теперь становятся:

решение первой производной даст нам значение параметра перехвата:

Используя это значение beta_0 и вторую частную производную, мы получаем значение второго параметра:

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

import numpy as np 


class LinearRegression(): 

    def __init__(self, beta_0 = 0 , beta_1 = 0 ): 
        self.beta_0 = beta_0 
        self.beta_1 = beta_1 

    
    def fit(self, X, y): 
        x_mean = np.mean(X) 
        y_mean = np.mean(y) 

        self.beta_1 = self.beta_1_fit(X, x_mean, y, y_mean) 
        self.beta_0 = self.beta_0_fit(x_mean, y_mean, self.beta_1) 

        return self

    def beta_0_fit(self, x_mean, y_mean, beta_1):

        beta_0 = y_mean - (beta_1 * x_mean) 

        return beta_0 
    
    def beta_1_fit(self, X, x_mean, y, y_mean): 

        beta_1 = 0 
        sum_num = 0 
        sum_den = 0 


        for x_i, y_i in zip(X, y): 
            sum_num += (x_i - x_mean)* (y_i - y_mean) 
            sum_den += (x_i - x_mean)**2
        
        beta_1 =  sum_num / sum_den 

        return beta_1

    def predict(self, x): 
        value = self.beta_1 * x + self.beta_0  
        return value

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

Давайте проверим это на сгенерированных нами искусственных данных и посмотрим, подходит ли модель.

# script to test the LinearRegression class linear_regression.py file 
import numpy as np 
import matplotlib.pyplot as plt 
from linear_regression import LinearRegression 


def line_point(x, slope = 3, intercept = 2): 

    # straight line point generator. 
    # parameter values: slope = 3, intercept = 2. 

    y_value = intercept + slope *x

    return y_value


def randomize(values): 
    new_values = [] 
    # we are using a random seed to get consistent data on repeated runs. 
    rgen = np.random.RandomState(1) 

    for i in values: 
        new_values.append(i + rgen.normal(0, 3))
    
    return new_values


if __name__ == '__main__': 

   x = [i for i in range(10)] 

   y_true = [line_point(i) for i in x] 

   y_random = randomize(y_true) 

   plt.scatter(x, y_random, label = 'random point') 
   plt.plot(x, y_true, color ='orange', label = 'true function') 
   plt.xlabel("x values") 
   plt.ylabel("y value")


   model = LinearRegression() 

   model = model.fit(x, y_random) 

   print(model.beta_0, model.beta_1) 

   predictions = [model.predict(i) for i in x]

   plt.plot(x, predictions, color = 'red', label = "model fit") 
   plt.legend() 
   plt.show() 

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

output: 

2.218030836227591 2.8867881091898018

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

# model fit on the data with random noise of standard deviation 10 

output: 
2.726769454091974 2.622627030632673

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

Заключение

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

Вот и все, счастливого кодирования :)