Я думаю, что это должен быть первый алгоритм, который изучено большинством из нас или, по крайней мере, у меня есть, и сегодня мы поговорим о линейной регрессии более подробно.
Пример для начала? Ага, главные герои нашей истории - сотрудники компании. Они много занимаются передовыми технологиями компьютерного зрения и ежегодно нанимают выпускников. Нового выпускника Рахула наняли, но его зарплата не понравилась. Он пожаловался, что всем в компании платят больше, чем ему. Компания объяснила ему, что по мере того, как он набирает опыт и расширяет свои навыки, ему будут платить больше. Чтобы еще больше укрепиться, они показали ему график заработной платы своих сотрудников в зависимости от опыта. Рахул был удовлетворен.
Но кого волнует Рахул? : p Извините, Рахул, но если вы посмотрите на график, то, как увеличивается зарплата, кажется очень…. линейный, верно?
Линейная регрессия - это метод контролируемого машинного обучения, который
предсказывает что-то, формируя линейные отношения с одной или несколькими независимыми функциями.
Прежде чем мы перейдем к работе с алгоритмом, полезно иметь в виду несколько предположений. Эти моменты помогут нам решить, полностью ли мы используем возможности линейной регрессии. Если вам не удается выполнить какое-либо из условий, это означает, что ваша модель не самая лучшая и вы можете добиться большего.
- Зависимая переменная (что бы вы ни пытались предсказать) всегда должна формировать линейную связь с независимыми переменными (какие функции вы используете для прогнозирования).
- Оно следует нормальному распределению - колоколообразной кривой.
- Мультиколлинеарность - убийца игры. Избегайте этого любой ценой.
- Ошибки должны иметь одинаковую дисперсию.
Сейчас у нас в основном два типа линейной регрессии.
Простая линейная регрессия - здесь вы пытаетесь предсказать что-то с помощью одной независимой функции.
Уравнение выглядит примерно так: 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()
Поздравляем, вы только что создали свою первую модель!