Линейная регрессия для машинного обучения

искусственный интеллект алгоритм

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

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

Когда есть только одна независимая переменная, это становится простой линейной регрессией.

Идея простой модели линейной регрессии

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

clipboard.png

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

Предположим, что уравнение линии наилучшего соответствия имеет вид:y = ax + b, то для выборочных признаковxкаждое значениеx^{(i)}Прогнозируемое значение:\hat{y}^{(i)} = ax^{(i)} +b. И то, что мы хотим, это правдаy^{(i)}и прогнозируемое значение\hat{y}^{(i)}Промежуток между ними как можно меньше.

Можно использовать|y^{(i)} - \hat{y}^{(i)}|Представляет разрыв между двумя значениями, для всех выборок используйте формулу суммирования, чтобы подвести итог:

∑ я знак равно 1 м |у ( я ) -у ^ ( я ) |

Однако с этой формулой есть проблема, и ее нелегко дифференцировать.Чтобы решить эту проблему, мы можем сначала|y^{(i)} - \hat{y}^{(i)}|Квадрат, поэтому окончательная формула принимает вид:

∑ я =1 м (у ( я ) - у ^ ( я ) ) 2

Наконец, замените\hat{y}^{(i)}, это:

∑ я =1 м (у ( я ) -а Икс ( я ) -b ) 2

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

Наименьших квадратов

найти подходящие a и b такие, что\sum_{i=1}^{m}(y^{(i)} - ax^{(i)}-b)^2Значение минимально возможное, такой метод называется методом наименьших квадратов.

Как найти а и б? Пусть функцияJ(a, b), делая производную от a и b равной 0 соответственно.

Производная по b:\frac{\partial{J(a, b)}}{\partial{b}} = \sum_{i=1}^{m}2(y^{(i)} - ax^{(i)}-b)(-1) = 0,придется:

б = у ¯ ¯ ¯ −a х ¯ ¯ ¯

Производная по a:\frac{\partial{J(a, b)}}{\partial{a}} = \sum_{i=1}^{m}2(y^{(i)} - ax^{(i)}-b)(-x^{(i)}) = 0,придется:

а =∑ м я =1 (х ( я ) -х ¯ ¯ ¯ )(у ( я ) -у ¯ ¯ ¯ ) ∑ м я =1 ( х ( я ) - х ¯ ¯ ¯ ¯ ) 2

Примечание. Процесс вывода формулы здесь опущен.

Реализация простой линейной регрессии

С помощью математики удобнее реализовать простую линейную регрессию.

Сначала объявите набор образцов:

import numpy as np

x = np.array([1., 2., 3., 4., 5.])
y = np.array([1., 3., 2., 3., 5.])

Среднее значение x и y используется в формуле:

x_mean = np.mean(x)
y_mean = np.mean(y)

Есть два способа найти значения a и b. Первый заключается в использовании цикла for:

# 分子
num = 0.0

# 分母
d = 0.0

for x_i, y_i in zip(x, y):
    num += (x_i - x_mean) * (y_i - y_mean)
    d += (x_i - x_mean) ** 2
    
a = num / d
b = y_mean - a * x_mean

Во-вторых, использовать умножение матриц:

num = (x - x_mean).dot(y - y_mean)
d = (x - x_mean).dot(x - x_mean)

a = num / d
b = y_mean - a * x_mean 

Примечание. Более эффективно использовать умножение матриц.

Найдя a и b, простая линейная модель имеет:\hat{y} = a*x + b. Графическое представление текущего примера:

clipboard.png

Метрики для измерения линейной регрессии

ошибка

Обученная модель обычно проверяется на точность модели с использованием тестового набора данных. Для простых моделей линейной регрессии, конечно, вы можете использовать\sum_{i=1}^{m}(y_{test}^{(i)} - \hat{y}_{test}^{(i)})^2Чтобы измерить, но его значение связано с количеством тестовых образцов m, метод улучшения очень прост, достаточно разделить на m, то есть среднеквадратичную ошибку (Mean Squared Error):

M SE : 1 м ∑ i =1 м (y ( i) t est −y ^ ( i) t est ) 2
np.sum((y_predict - y_true) ** 2) / len(y_true)

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

R MS E: 1 m ∑ i =1 m (y (i) t est −y ^ _test (i) ) 2 − −− −− −− −− −− −− −− −− −− √ =M SE t es t − −− −− −− √
import math

math.sqrt(np.sum((y_predict - y_true) ** 2) / len(y_true))

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

M AE : 1 м ∑ я знак равно 1 м |y ( я ) т эс т - y ^ ( я ) т эс т |
np.sum(np.absolute(y_predict - y_true)) / len(y_true)

Примечание: в модуле метрик Scikit Learnmean_squared_error()метод представляет MSE,mean_absolute_error()Метод представляет MAE, нет метода для представления RMSE.

R Squared

Идя дальше, ограничение MSE, RMSE и MAE заключается в том, что измерение модели может быть выполнено только в том случае, если чем меньше значение, тем лучше модель.Обычно измерение модели использует 1 для представления наилучшего и 0 для представления наихудшего.Поэтому вводится новая модель Метрики: R в квадрате, рассчитывается как:

R 2 =1 −S S r es i d u al S S t ot a l

SS_{residual} = \sum_{i=1}^{m}(\hat{y}^{(i)} - y^{(i)})^2, указывающий на ошибку, возникшую при использовании модели;SS_{total} = \sum_{i=1}^{m}(\overline{y} - y^{(i)})^2, что означает использоватьy = \overline{y}ошибка в предсказании.

Более подробно прогнозируемое значение x для каждой прогнозируемой выборки является средним значением выборки.\overline{y}, такая модель называется базовой моделью, когда наша модель равна базовой модели,R^2равно 0, когда наша модель не делает ошибокR^2Получите максимальное значение 1.

R^2Вы также можете конвертировать, и результат конвертации:

R 2 =1 −M SE ( y ^ ,y ) Варьируется

Реализация тоже проста:

1 - np.sum((y_predict - y_true) ** 2) / len(y_true) / np.var(y_true)

Примечание: в модуле метрик Scikit Learnr2_score()Методы представляют R в квадрате.

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

Идея модели множественной линейной регрессии

Когда имеется более одной независимой переменной, это множественная линейная регрессия, как показано на рисунке:

clipboard.png

Для n независимых переменных линейная модель, которую мы хотим получить, выглядит следующим образом:

y =θ 0 +θ 1 x 1 +θ 2 x 2 +.. .+θ n x n

Согласно идее простой линейной регрессии, наша цель:

оказаться\theta_{0},\theta_{1},\theta_{2}, ...,\theta_{n}, так что\sum_{i=1}^{m}(y^{(i)} - \hat{y}^2)^2как можно меньше, где\hat{y}^{(i)} = \theta_{0} + \theta_{1}X_{1}^{(i)} + \theta_{2}X_{2}^{(i)} + ... + \theta_{n}X_{n}^{(i)}.

\hat{y}^{(i)}: прогнозируемое значение i-й выборки в обучающих данных;X_{j}^{(i)}: j-я независимая переменная i-го образца в обучающих данных.

Если это представлено матрицей, это:

у ^ ( я ) = Икс ( я ) ⋅ θ

в:{X^{(i)} = (X_{0}^{(i)},X_{1}^{(i)},X_{2}^{(i)},...,X_{n}^{(i)}), X_{0}^{(i)}\equiv1};\theta = (\theta_{0}, \theta_{1}, \theta_{2},..., \theta_{n})^T.

Идя дальше, будет\hat{y}^{(i)}Он также представлен матрицей, которая имеет вид:

у ^ =Х б ⋅θ

в:X_b = \begin{pmatrix} 1 & X_1^{(1)} & X_2^{(1)} & \cdots & X_n^{(1)} \\\ 1 & X_1^{(2)} & X_2^{(2)} & \cdots & X_n^{(2)} \\\ \cdots & & & & \cdots \\\ 1 & X_1^{(m)} & X_2^{(m)} & \cdots & X_n^{(m)} \end{pmatrix},\theta =  \begin{pmatrix} \theta_0 \\\ \theta_1 \\\ \theta_2 \\\ \cdots \\\ \theta_n \end{pmatrix}

Поэтому наша цель - сделать(y-X_b·\theta)^T(y-X_b·\theta)как можно меньше. Решение этой формулы называется решением нормального уравнения множественной линейной регрессии (номинальное уравнение):

θ = (X T b Xb ) − 1 (X T b y )

Реализуйте множественную линейную регрессию

Реализуйте множественную линейную регрессию в классе LinearRegression, используя стиль Scikit Learn.

_init_()Метод сначала инициализирует модель линейной регрессии,_thetaвыражать\theta,interception_представляет собой перехват,chef_Коэффициенты, представляющие независимые переменные в регрессионной модели:

class LinearRegression:
    def __init__(self):
        self.coef_ = None
        self.interceiption_ = None
        self._theta = None

fit_normal()Метод обучает модель в соответствии с набором обучающих данных, X_b указывает, что добавленныйX_{0}^{(i)}\equiv1Данные выборки признаков и используйте решение нормального уравнения множественной линейной регрессии, чтобы найти\theta:

def fit_normal(self, X_train, y_train):
    X_b = np.hstack([np.ones((len(X_train), 1)), X_train])
    self._theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y_train)

    self.interception_ = self._theta[0]
    self.coef_ = self._theta[1:]

    return self

predict()Этот метод является методом прогнозирования, который также использует матричное умножение:

def predict(self, X_predict):
    X_b = np.hstack([np.ones((len(X_predict), 1)), X_predict])
    return X_b.dot(self._theta)

score()Рассчитайте точность модели, используя метрику R Squared для данного набора тестовых данных:

def score(self, X_test, y_test):
    y_predict = self.predict(X_test)
    return r2_score(y_test, y_predict)
Реализация линейной регрессии в Scikit Learn размещена в модуле linear_model и используется следующим образом:

from sklearn.linear_model import LinearRegression

Особенности линейной регрессии

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

Недостатком является то, что решение нормального уравнения для множественной линейной регрессии\theta = (X_b^TXb)^{-1}(X_b^Ty)Временная сложность высока, т.к.O(n^3), который можно оптимизировать какO(n^{2.4}).

Адрес источника

Github | ML-Algorithms-Action