Модели линейной регрессии питон

Линейная регрессия. Разбор математики и реализации на python

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

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

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

или подставив уравнение модели

Минимизируем функцию ошибки MSE найдя частные производные по w0 и w1

И приравняв их к нулю получим систему уравнений, решение которой обеспечит минимизацию функции потерь MSE.

Раскроем сумму и с учетом того, что -2/n не может равняться нулю, приравняем к нулю вторые множители

Выразим w0 из первого уравнения

Подставив во второе уравнение решим относительно w1

И выразив w1 последнего уравнения получим

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

Для вычисления интерсепта (коэффициента w0) необходимо к таблице добавить столбец слева с фактором f0 все значения которого равны 1 (единичный вектор-столбец). И тогда столбцы f0-f3 (по количеству столбцов не ограничены, можно считать fn) можно выделить в матрицу X, целевую переменную в матрицу-столбец y, а искомые коэффициенты можно представить в виде вектора w.

Читайте также:  Java вывод числа на экран

можно представить в следующем виде

Представим в виде скалярного произведения < >и вычислим производную используя дифференциал

приведем формулу к следующему виду

Поскольку дифференциал разницы равен разнице дифференциалов, дифференциал константы (y) равен нулю и константу (в данном случае матрицу X) можно вынести за знак дифференциала, получим

Используя свойство скалярного произведения перенесем матрицу X справа налево незабыв транспонировать ее

Собственно, то что слева и есть дифференциал, найдем экстремум приравняв его к нулю и решив по параметрам w

раскроем скобки и перенесем значения без w вправо

Домножим слева обе стороны равенства на обратную матрицу произведения транспонированной матрицы X на X для выражения вектора w, тогда получим

Аналитическое решение получено, переходим к реализации на python.

#импорт необходимых библиотек import numpy as np from sklearn.linear_model import LinearRegression #зададим начальные условия f0 = np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) f1 = np.array([1.1, 2.1, 3.1, 4.4, 5.2, 6.4, 7.1, 8.2, 9.4, 10.5]) f2 = np.array([1.4, 2.3, 3.4, 4.1, 5.5, 6.2, 7.3, 8.4, 9.2, 10.1]) f3 = np.array([1.2, 2.2, 3.4, 4.2, 5.3, 6.2, 7.3, 8.4, 9.2, 10.3]) y = np.array([[1.2], [2.2], [3.3], [4.3], [5.2], [6.3], [7.2], [8.3], [9.3], [10.2]]) w = np.array([np.nan, np.nan, np.nan, np.nan]) X = np.array([f0, f1, f2, f3]).T #рассчитаем коэффициенты используя выведенную формулу coef_matrix = np.dot(np.dot(np.linalg.inv(np.dot(X.T, X)), X.T), y) print(f'Коэффициенты рассчитанные по формуле ') #Коэффициенты рассчитанные по формуле [0.05994939 0.42839296 0.09249473 0.46642055] #проверим расчет используя библиотеку sklearn model = LinearRegression().fit(X, y) coef_sklearn = model.coef_.T coef_sklearn[0] = model.intercept_ print(f'Коэффициенты рассчитанные с использованием библиотеки sklearn ') #Коэффициенты полученные с рассчитанные библиотеки sklearn [0.05994939 0.42839296 0.09249473 0.46642055]

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

Читайте также:  Telegram api bot php sendmessage

Источник

Простая линейная регрессия

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

Мы используем matplotlib , популярная библиотека для построения графиков на Python

plt.figure(figsize=(16, 8))
plt.scatter(
data['TV'],
data['sales'],
c='black'
)
plt.xlabel("Money spent on TV ads ($)")
plt.ylabel("Sales ($)")
plt.show()

Запустите эту ячейку кода, и вы должны увидеть этот график:

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

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

X = data['TV'].values.reshape(-1,1)
y = data['sales'].values.reshape(-1,1)reg = LinearRegression()
reg.fit(X, y)print("The linear model is: Y = + X".format(reg.intercept_[0], reg.coef_[0][0]))

Да! Это так просто, чтобы подогнать прямую линию к набору данных и увидеть параметры уравнения. В этом случае мы имеем

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

predictions = reg.predict(X)plt.figure(figsize=(16, 8))
plt.scatter(
data['TV'],
data['sales'],
c='black'
)
plt.plot(
data['TV'],
predictions,
c='blue',
linewidth=2
)
plt.xlabel("Money spent on TV ads ($)")
plt.ylabel("Sales ($)")
plt.show()

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

Оценка актуальности модели

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

X = data['TV']
y = data['sales']X2 = sm.add_constant(X)
est = sm.OLS(y, X2)
est2 = est.fit()
print(est2.summary())

Что дает вам этот прекрасный вывод:

Глядя на оба коэффициента, мы имеемр-значениеэто очень мало (хотя, вероятно, это не совсем 0). Это означает, что существует сильная корреляция между этими коэффициентами и целью (продажи).

Затем, глядя на значение R², мы получаем 0,612. Следовательно,около 60% изменчивости продаж объясняется суммой, потраченной на телевизионную рекламу, Это нормально, но точно не лучшее, что мы можем точно предсказать продажи. Конечно, расходы на рекламу в газетах и ​​на радио должны оказывать определенное влияние на продажи.

Читайте также:  Java char номера символов

Посмотрим, будет ли лучше работать множественная линейная регрессия.

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

моделирование

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

Xs = data.drop(['sales', 'Unnamed: 0'], axis=1)
y = data['sales'].reshape(-1,1)reg = LinearRegression()
reg.fit(Xs, y)print("The linear model is: Y = + *TV + *radio + *newspaper".format(reg.intercept_[0], reg.coef_[0][0], reg.coef_[0][1], reg.coef_[0][2]))

Больше ничего! Из этой ячейки кода мы получаем следующее уравнение:

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

Обратите внимание, что коэффициент для газеты является отрицательным, но также довольно небольшим. Это относится к нашей модели? Давайте посмотрим, рассчитав F-статистику, значение R² ир-значениеза каждый коэффициент.

Оценка актуальности модели

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

X = np.column_stack((data['TV'], data['radio'], data['newspaper']))
y = data['sales']X2 = sm.add_constant(X)
est = sm.OLS(y, X2)
est2 = est.fit()
print(est2.summary())

Как вы можете видеть, R² намного выше, чем у простой линейной регрессии, со значением0,897!

Кроме того, F-статистика570,3, Это намного больше, чем 1, и поскольку наш набор данных достаточно мал (всего 200 точек),демонстрирует тесную связь между расходами на рекламу и продажами,

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

Вы качаетесь 🤘. Поздравляю с завершением, теперь вы мастер линейной регрессии!

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

Я надеюсь, что вы когда-нибудь вернетесь к этой статье.

Источник

Оцените статью