Линейная регрессия — это первый шаг для всех, кто хочет изучать машинное обучение. Или любой, кто хочет быть гадалкой с научным вкусом.
Простая линейная регрессия
Возможно, вы спросите себя: почему регрессия так важна в машинном обучении? Вы часто оказываетесь в ситуации, когда вам нужно предсказать что-то, основываясь на наборе прошлой информации. Это то, что пытается заполнить алгоритм регрессии, чтобы помочь вам что-то предсказать. Ну, это звучит очень статистически, но основная задача машинного обучения — создать модель для прогнозирования будущих результатов на основе прошлых входных данных. Вы можете позаимствовать любую концепцию из разных областей для построения модели машинного обучения. Хорошо, давайте начнем.
Простая линейная регрессия — это линейная модель, которая предполагает линейную связь между входом и выходом. Чтобы прояснить утверждения выше, давайте посмотрим на эти уравнения
Приведенное выше уравнение называется простым линейным уравнением. Он называется простым, потому что выход зависимой переменной y является функцией только одной независимой переменной x. В то время как m и b являются константами, обычно называемыми наклоном и точкой пересечения. В терминах машинного обучения y называются метками, а x называются функциями. Когда вы передаете значение как функцию x, метка y будет давать значение, которое линейно пропорционально x, оно будет взвешено по наклону m, умноженному на x, плюс точка пересечения b. Вы можете рассматривать перехват b как значение y по умолчанию, если в функцию не было никакой функции x (x равно нулю). Если вы поднимете x, то y будет расти линейно, если вы уменьшите x, произойдет обратное, то y уменьшится линейно.
Предположим, у вас есть такой набор данных
Это набор данных тестовых результатов. Исходя из этого набора данных, вы можете предположить линейную зависимость между часом, потраченным на учебу, и результатами тестов, это указывает на то, что чем больше часов потрачено на учебу, тем выше результаты тестов. Вот график рассеяния, чтобы сделать ваше предположение верным.
Вам может быть интересно, а какой будет балл за тест, если студент потратил на обучение 3,5 часа, а может быть, 10 часов обучения? Это тип вопросов, простая линейная регрессия готова ответить… или предсказать. Проще говоря, задачи простой линейной регрессии таковы:
Простая линейная регрессия – это попытка подогнать наборы данных к простому линейному уравнению, найдя оптимальный наклон m и точку пересечения b по известным функциям. x и известные метки y.
После определения оптимального значения наклона m и точки пересечения b прогнозируемые метки для всех наборов данных yi в зависимости от признаков xi равны
Затем будут даны ответы на вопросы о том, что такое тестовый балл учащегося y за любое количество часов, потраченных на обучение x. .
Градиентный спуск
Чтобы найти оптимальное значение наклона m и точки пересечения b, вам нужно понять градиентный спуск. Градиентный спуск – это метод оптимизации, основанный на функции стоимости. Существует много типов функций стоимости, вы собираетесь использовать эту функцию:
где;
J = функция стоимости
ш=вес
б = смещение
y=фактическое значение (известная метка)
y (шляпа) = предсказанное значение (предсказанная метка)
Это среднее значение квадрата различий между известными (y) и прогнозируемыми метками (y hat), обычно называемое среднеквадратичными ошибками — MSE.
Вся идея градиентного спуска состоит в том, чтобы минимизировать функцию стоимости, чтобы сделать квадрат общей разницы между известными метками и предсказанными метками как можно меньше.
Когда функция стоимости имеет минимальное значение? На рисунке выше минимальное значение функции стоимости — это точка на дне долины. С этой точки зрения оптимальным значением является вес, придающий функции стоимости минимальное значение. Как вы можете быть уверены, что в этой функции стоимости есть только одна долина, является ли текущее значение самым минимальным значением? Функция стоимости, которую вы выбрали, является квадратичной функцией, каждая квадратичная функция имеет только одну долину.
В исчислении минимальное значение функции — это когда ее градиент равен нулю, или, в геометрическом смысле, градиент с самой плоской линией наклона кривой (см. рисунок выше). Итак, чтобы вычислить оптимальный вес и смещение, вам нужен градиент функции стоимости относительно веса и смещения:
для простого линейного уравнения
Теперь, когда вы нашли градиенты функции стоимости, чтобы достичь минимального значения функции стоимости, вам придется настраивать вес и смещение от начального значения до тех пор, пока вы не достигнете оптимального значения, которое дает минимальное значение функции стоимости. Это означает, что вам нужно будет изменять значение веса и смещения итеративно. Но насколько изменились вес и уклон? У вас есть градиенты, но как градиенты связаны с весом и смещением?
Градиенты также известны как скорость изменений. Таким образом, градиент функции стоимости по отношению к весу является мерой того, насколько функция стоимости изменяется при изменении веса, тот же принцип применяется и к систематической ошибке. Таким образом, обновленное значение веса и смещения аппроксимируется с использованием градиентов функции стоимости в качестве шагов обновления:
Теперь вам может быть интересно, сойдутся ли эти приближения? другими словами, будут ли найдены вес и смещение до определенного числа итераций?
Градиенты функций стоимости имеют тенденцию быть более плоскими по мере приближения к минимальному значению, это означает, что направление градиента всегда направлено к долине кривой, поэтому мы итерируем w и b шаг за шагом в направлении градиентов. Если шаг будет слишком большим, вы упустите оптимальный вес, но если он будет слишком маленьким, у вас будет много времени на итерацию. Для этого вам нужно добавить скорость обучения к приближению. Скорость обучения — это гиперпараметр, который определяет, насколько шаг градиентов изменит следующий вес и смещение.
где альфа — скорость обучения.
Выполнение
Теперь давайте реализуем градиентный спуск для простой линейной регрессии, начнем с создания шаблона класса, а затем вы будете выполнять этот шаблон шаг за шагом.
import numpy as np class LinearRegression: def __init__(self): pass def fit(self,X,y): pass def predict(self,X): pass
для части конструктора вы захотите передать скорость обучения и количество итераций в качестве свойств класса.
## Set the learning rate and number of iterations def __init__(self,learning_rate=0.01,iter=1000): self.learning_rate=learning_rate self.iter=iter
Затем метод подгонки, именно здесь будет реализован градиентный спуск с помощью следующих шагов (см. комментарии к коду ниже):
def fit(self,X,y): #set the initial value for weights and bias self.weights=0 self.bias=0 #get number of samples features X n_samples=length(X) #start the iteration for i in range(self.iter): #predict the known label y y_predict=self.weights*X + self.bias #calculate the gradients of weights and bias grad_w=(2/n_samples)*np.sum(X*(y_predict-y)) grad_b=(2/n_samples)*np.sum(y_predict-y) #update the weights and bias self.weight-=grad_w*self.learning_rate self.bias-=grad_b*self.learning_rate
Теперь для метода прогнозирования просто рассчитайте новые метки, используя простое линейное уравнение
def predict(self,X): return self.weights*X + self.bias
Теперь давайте попробуем предсказать что-нибудь, вы собираетесь использовать данные результатов теста. Вы можете загрузить данные из файла или записать данные напрямую, так как они имеют небольшое количество функций и меток.
X=np.array([1.,2.,3.,4.,5.,6.,7.,8.,9.]) y=np.array([40,43,55,60,68,77,82,86,94])
создать экземпляр и подогнать набор данных
linreg=LinearRegression() linreg.fit(X,y)
Настройте новые функции и прогнозируйте
new_hours=np.array([1.5,2.3,3.2,4.3,5.1,6.4,7.5,8.2]) predict=linreg.predict(new_hours)
Давайте узнаем, насколько хороша ваша модель, определим функцию для расчета функции стоимости (MSE)
def mean_squared_error(y_true, y_pred): return np.mean((y_true - y_pred) ** 2) existing=c.predict(X) mse=mean_squared_error(y,existing) print(mse)
Результат около 3.30. Это очень хорошо. Чтобы увидеть, насколько близок ваш прогноз, давайте построим его.
import matplotlib.pyplot as plt plt.scatter(X,y) plt.scatter(new_hours,predict) plt.plot(X,existing)
Синяя точка — это данные из наборов данных, оранжевые точки — это метки для новых функций, а линия — это линия регрессии. Вот полный код
Заключение
В этой статье вы узнали
- Важность линейной регрессии в машинном обучении
- Основная концепция градиентного спуска
- Реализация на Python
Пожалуйста, поделитесь этим постом и похлопайте, если он вам понравился. Для множественной линейной регрессии вы можете проверить этот пост: