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

Пример для начала? Ага, главные герои нашей истории - сотрудники компании. Они много занимаются передовыми технологиями компьютерного зрения и ежегодно нанимают выпускников. Нового выпускника Рахула наняли, но его зарплата не понравилась. Он пожаловался, что всем в компании платят больше, чем ему. Компания объяснила ему, что по мере того, как он набирает опыт и расширяет свои навыки, ему будут платить больше. Чтобы еще больше укрепиться, они показали ему график заработной платы своих сотрудников в зависимости от опыта. Рахул был удовлетворен.

Но кого волнует Рахул? : p Извините, Рахул, но если вы посмотрите на график, то, как увеличивается зарплата, кажется очень…. линейный, верно?

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

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

  1. Зависимая переменная (что бы вы ни пытались предсказать) всегда должна формировать линейную связь с независимыми переменными (какие функции вы используете для прогнозирования).
  2. Оно следует нормальному распределению - колоколообразной кривой.
  3. Мультиколлинеарность - убийца игры. Избегайте этого любой ценой.
  4. Ошибки должны иметь одинаковую дисперсию.

Сейчас у нас в основном два типа линейной регрессии.

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

Уравнение выглядит примерно так: y = mx + c

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

Уравнение: y = mx1 + mx2 + mx3 ……. + c

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

Я объясню в два этапа.
1. Формирование линии - возьмите сюжет и просто нарисуйте произвольную линию. Теперь измерьте расстояния до всех точек вашей линии, сложите их и возведите в квадрат. Мы возводим в квадрат, чтобы убедиться, что отрицательные значения под линией не отменяют положительные значения над линией. Эта общая сумма называется суммой в квадрате ошибок!
2. Итерация - возьмите тот же график и нарисуйте еще одну линию, которая теперь слегка озаглавлена. Остальное остается таким же, как в шаге 1.

Допустим, я проделал это 5 раз, так что у меня будет 5 различных наборов квадратов ошибок, верно? Наименьшее значение ошибок - это лучшая линия, поскольку она лучше всего соответствует точкам данных на графике и, следовательно, называется наилучшим соответствием! Также по общей интуиции мы хотим что-то с наименьшими ошибками, верно :)

Пора куоооооооооооо!

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
class LinearRegression: #the class
    def __init__(self, learning_rate = 0.01, n_iters = 10):
        self.lr = learning_rate
        self.n_iters = n_iters
        self.weights = None
        self.bias = None
    
    def fit(self, X, y):
        rows , columns = X.shape
        self.weights = np.zeros(columns)
        self.bias = 0
        for _ in range(self.n_iters):
            y_predicted = np.dot(X, self.weights) + self.bias
            dw = 1/rows * np.dot(X.T, (y_predicted - y))
            db = 1/rows * np.sum(y_predicted - y)
            self.weights = self.weights - self.lr * dw
            self.bias = self.bias - self.lr * db
    
    def predict(self, X):
        return  np.dot(X, self.weights) + self.bias
if __name__ == '__main__':
    def mse(true, pred):
        return np.mean((true - pred) ** 2)
    
    X, y = datasets.make_regression( #artificial data
        n_samples= 200, n_features =1, noise = 20
    )
    
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size = 0.2, random_state = 42
    )
    regressor = LinearRegression(learning_rate=0.01, n_iters=1000)
    regressor.fit(X_train, y_train)
    predictions = regressor.predict(X_test)
    err = mse(y_test, predictions)
    print("MSE:", err)
    y_pred_line = regressor.predict(X)
    cmap = plt.get_cmap("viridis")
    fig = plt.figure(figsize=(8, 6))
    m1 = plt.scatter(X_train, y_train, color=cmap(0.9), s=10)
    m2 = plt.scatter(X_test, y_test, color=cmap(0.5), s=10)
    plt.plot(X, y_pred_line, color="black", linewidth=2,    label="Prediction")
    plt.show()

Поздравляем, вы только что создали свою первую модель!