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

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

Линейная регрессия является одним из наиболее часто используемых алгоритмов в статистике. В основном линейная регрессия используется, когда вы хотите представить математическую связь между двумя переменными. Когда вы его используете, вы сначала предполагаете линейную связь между выходной переменной (иногда называемой переменной отклика, зависимой переменной или меткой) и переменной-предиктором (иногда называемой независимой переменной, независимой переменной или функцией). Конечно, эта линейная зависимость может также существовать между одной выходной переменной и несколькими предикторными переменными. Линейная связь между выходной переменной и переменной-предиктором — смелое предположение, но также и одно из самых простых. С точки зрения математического представления линейные функции проще, чем нелинейные. Линейные модели всегда являются самым простым способом параметризации. Это связано с тем, что многие проблемы, даже нелинейные по своей сути, можно решить с помощью линейных моделей.

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

\[Y_i = \beta _0 + \beta _1X_{i1}+\beta _2X_{i2}+...+\beta _pX_{ip}+\varepsilon _i, i = 1,2,...,n\]

где Y — линейная функция X,\varepsilon _iЭто ошибка. ЛинейностьY_iУсловное среднее , в параметре\betaявляется линейным. Некоторые функциональные модели не обязательно являются моделями линейной регрессии, но могут быть преобразованы в модели линейной регрессии с помощью алгебраических преобразований. Для простой линейной регрессии это можно выразить следующим образом:

\[Y_i = \alpha +\beta x_i\]

Для одномерной линейной регрессии в настоящее время это самая простая для понимания линейная модель Формула регрессии выглядит следующим образом:

\[Y = \alpha +\beta x + \varepsilon\]

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

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

\[y = b + \sum_{i=1}^{n}w_ix_i\]

где b называется смещением,w_i– коэффициент регрессии. Для приведенной выше формулы пустьx_0=1Тогда вышеуказанная формула может быть выражена как:

\[y = \sum_{i=0}^{n}w_ix_i\]

В модели линейной регрессии цель состоит в том, чтобы найти уравнение регрессии линейной модели, то есть найти коэффициент регрессии в уравнении линейной регрессииw_i. Оценка линейной регрессии относится к тому, как измерить близость между прогнозируемым значением (Прогноз) и меткой (Метка).Функция потерь модели линейной регрессии может быть абсолютной потерей (Абсолютная потеря). убыток) или квадратный убыток. Среди них абсолютная функция потерь:

\[l = |y-\hat{y}|\]

в,\hat{y}является прогнозируемым значением, и:\hat{y} = \sum_{i=0}^{n}w_ix_i

Функция квадратных потерь:

\[l =(y- \hat{y})^2\]

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

\[l = \frac{1}{2}\sum_{i=1}^{m}(y^i-\sum_{j=0}^{n-1}w_jx_j^i)^2\]

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

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

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

Основная идея метода наименьших квадратов состоит в том, чтобы попытаться найти наиболее вероятное уравнение функции путем минимизации суммы квадратов ошибок. Например, в двумерной системе координат есть пять точек данных (10,20), (11,23), (12,25), (13,27), (14,26), и мы надеемся найти одну из пяти точек данных. Прямая линия с кратчайшим расстоянием между точками согласно бинарному линейному уравнению:y = ax + b. Приведение пяти точек в бинарное уравнение соответственно дает следующее:

\[20=10a+b\]

\[23=11a+b\]

\[25=12a+b\]

\[27=13a+b\]

\[26=14a+b\]

Поскольку метод наименьших квадратов заключается в том, чтобы минимизировать дисперсию по обе стороны от знака равенства, насколько это возможно, поэтому:

\[S(a,b) = [20-(10a+b)]^2 + [23-(11a+b)]^2+[25-(12a+b)]62+[27-(13a+b)]^2+[26-(14a+b)]^2\]

Таким образом, минимальное значение может быть получено путемS(a,b)Получена частная производная, а обратное значение первого порядка равно 0, поэтому:

\[\frac{\partial S }{\partial a}= 1460a+120b-2936\]

\[\frac{\partial S }{\partial b}= 12a + 10b -242\]

То есть получается бинарное линейное уравнение для решения неизвестных переменных a и b:

\[\left\{\begin{matrix}1460a+120b = 2936\\ 12a+10b = 242\end{matrix}\right.\]

A=0,0243, b=24,1708 можно получить, вычислив описанным выше бинарным методом первого порядка. Следовательно, в вышеуказанных пяти точках уравнение прямой линии получается методом наименьших квадратов: y=24,1708+0,0243x — прямая, минимизирующая расстояние от пяти точек до прямой.

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

Для модели линейной регрессии, предполагая, что в обучающем наборе есть m обучающих выборок, и каждая обучающая выборка имеет n-1 признаков, можно использовать метод матричного представления, а функцию прогнозирования можно выразить как:Y=XW, а его функция потерь выражается как:(Y-XW)^T(Y-XW).

Среди них метка Y представляет собой матрицу размера m×1, функция обучения X представляет собой матрицу размера m×n, а коэффициент регрессии W представляет собой матрицу размера n×1. В методе наименьших квадратов возьмите производную по W, то есть:

\[\frac{d}{dW}(Y-XW)^T(Y-XW) = X^T(Y-XW)\]

Пусть это будет 0, мы получим:

\[\hat{W} = (X^TX)^{-1}X^TY\]

Реализация Python:

def least_square(feature, label):
    '''最小二乘法
    input:  feature(mat):特征
            label(mat):标签
    output: w(mat):回归系数
    '''
    w = (feature.T * feature).I * feature.T * label
    return w

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

Градиентный спуск

Что такое градиентный спуск

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

В исчислении нахождение параметров многомерной функции\partialЧастная производная, запишите полученную частную производную каждого параметра в виде вектора, который является градиентом. Например, функция f(x, y) принимает частные производные от x и y соответственно, а полученный вектор градиента равен(\frac{\partial f }{\partial x},\frac{\partial f }{\partial y})^T, обозначаемый как grad f(x,y) или\bigtriangledown f(x,y). для точки(x_0,y_0)Конкретный вектор градиента(\frac{\partial f }{\partial x_0},\frac{\partial f }{\partial y_0})^T,или\bigtriangledown f(x_0,y_0).如果是3个参数的向量梯度,就是(\frac{\partial f }{\partial x},\frac{\partial f }{\partial y},\frac{\partial f }{\partial z})^T, и так далее.

Так какой смысл находить этот вектор градиента? Его смысл в геометрическом смысле заключается в том, где изменение функции увеличивается быстрее всего. В частности, для функции f(x,y) в точке(x_0,y_0), вдоль направления вектора градиента(\frac{\partial f }{\partial x_0},\frac{\partial f }{\partial y_0})^TНаправление - это то, где f (x, y) увеличивается быстрее всего. Другими словами, вдоль направления вектора градиента проще найти максимальное значение функции. И наоборот, вдоль направления, противоположного вектору градиента, т. е.-(\frac{\partial f }{\partial x_0},\frac{\partial f }{\partial y_0})^TВ направлении градиент убывает быстрее всего, т. е. легче найти минимальное значение функции.

Для задач выпуклой оптимизации точка, в которой производная равна 0 (градиент является нулевым вектором), является решением задачи оптимизации. Чтобы найти это решение, мы выполняем линейный поиск вдоль противоположного направления градиента, каждый поиск с размером шага определенного значения\alpha, пока градиент не станет очень близким к вектору 0. Описанный выше метод представляет собой градиентный спуск. Шаги итеративного алгоритма следующие:

  1. когдаi=0, задайте начальную точку самостоятельно\textbf{x}^0=(x_1^0,x_2^0,\cdots, x_n^0), установите размер шага (также называемый скоростью обучения)\alpha, который устанавливает допуск ошибок tol для завершения итерации.
  2. Вычислить целевую функциюfв точкуx_iградиент на\nabla f_{\textbf{x}^i}.
  3. рассчитать\textbf{x}^{i+1}, формула выглядит следующим образом:\textbf{x}^{i+1} = \textbf{x}^{i} - \alpha \nabla f_{\textbf{x}^i}
  4. Рассчитать градиент\nabla f_{\textbf{x}^{i+1}}. если\|\nabla f_{\textbf{x}^{i+1}}\|_2\leq tolЗатем итерация останавливается, и оптимальное решение принимает значение\textbf{x}^{i+1}; если двойная норма градиента больше tol, то i=i+1, и возвращаемся к шагу (3).

Типы градиентного спуска

Градиентный спуск может быть определен в различных вариантах в зависимости от того, как производная функции стоимости вычисляется с использованием данных. В частности, по количеству используемых данных (количество данных), временной сложности (временной сложности) и точности алгоритма (точность алгоритма) метод градиентного спуска можно разделить на:

  • Пакетный градиентный спуск (BGD);
  • стохастический градиентный спуск (SGD);
  • Мини-пакетный градиентный спуск (MBGD).

Пакетный градиентный спуск BGD

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

Функция потерь пакетного градиентного спуска:

\[\frac{\partial J(\theta) }{\partial {\theta}_j} = \sum_{i=1}^{m}(h_\theta(x^i)-y^i )x_j^i\]

Итерационная формула для дальнейшего пакетного градиентного спуска:

\[{\theta}'_j = \theta _j - \alpha \frac{\partial J(\theta )}{\partial \theta _j} = \theta _j = \alpha \sum_{i=1}^{m}(h_\theta (x^i)-y^i)x_j^i\]

где m — количество обучающих примеров.

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

Преимущества: глобальное оптимальное решение, простота параллельной реализации;

Недостаток: при большом количестве выборок процесс обучения будет медленным.

  • Если обучающая выборка содержит 300 миллионов единиц данных, вам необходимо прочитать все данные с жесткого диска в память;
  • После расчета каждой суммы параметры обновляются;
  • Затем повторите каждый шаг выше;
  • Это означает, что для сходимости требуется больше времени;
  • Тем более, что дисковый ввод/вывод (disk I/O) является типичным узким местом системы, такой подход неизбежно потребует большого количества операций чтения.

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

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

Следующий код Python реализует пакетный градиентный спуск:

import numpy as np
 
 
def gradient_descent(alpha, x, y, ep=0.0001, max_iter=10000):
    converged = False
    iter = 0
    m = x.shape[0]  # number of samples  
 
    # initial theta  
    t0 = np.random.random(x.shape[1])
    t1 = np.random.random(x.shape[1])
 
    # total error, J(theta)  
    J = sum([(t0 + t1 * x[i] - y[i]) ** 2 for i in range(m)])
 
    # Iterate Loop  
    while not converged:
        # for each training sample, compute the gradient (d/d_theta j(theta))  
        grad0 = 1.0 / m * sum([(t0 + t1 * x[i] - y[i]) for i in range(m)])
        grad1 = 1.0 / m * sum([(t0 + t1 * x[i] - y[i]) * x[i] for i in range(m)])
        # update the theta_temp  
        temp0 = t0 - alpha * grad0
        temp1 = t1 - alpha * grad1
 
        # update theta  
        t0 = temp0
        t1 = temp1
 
        # mean squared error  
        e = sum([(t0 + t1 * x[i] - y[i]) ** 2 for i in range(m)])
 
        if abs(J - e) <= ep:
            print('Converged, iterations: ', iter, '!!!')
            converged = True
 
        J = e  # update error   
        iter += 1  # update iter  
 
        if iter == max_iter:
            print('Max interactions exceeded!')
            converged = True
 
    return t0, t1

Мини-пакетный градиентный спуск MBGD

Мини-пакетный градиентный спуск — это наиболее широко используемый алгоритм, который обучается на m обучающих выборках (называемых пакетом) за раз и может быстрее получать точные ответы. Вместо использования полного набора данных мини-пакетный градиентный спуск использует только m обучающих выборок для вычисления градиента функции стоимости на каждой итерации. Как правило, количество образцов, выбранных методом мини-пакетного градиентного спуска, составляет от 50 до 256, в зависимости от конкретного приложения.

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

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

Здесь b представляет количество обучающих выборок в пакете, а m — общее количество обучающих выборок.

Стохастический градиентный спуск (SGD)

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

\[{\theta }'_j = \theta _j + \frac{1}{m}(y^i-h_\theta (x^i))x_j^i\]

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

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

Стохастический градиентный спуск итеративно обновляется через каждую выборку.Если размер выборки велик (например, сотни тысяч), то для итерации тета до оптимума могут использоваться только десятки тысяч или тысячи выборок.Решено, по сравнению с приведенным выше пакетный градиентный спуск, одна итерация должна использовать сотни тысяч обучающих выборок, и одна итерация не может быть оптимальной.Если есть 10 итераций, необходимо пройти обучающие выборки 10 раз. Однако проблема с SGD заключается в том, что здесь больше шума, чем в BGD, поэтому SGD не находится в направлении общей оптимизации на каждой итерации.

Преимущества: быстрая скорость обучения;

Недостатки: Снижается точность, не является глобально оптимальным, сложно реализовать параллельно.

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

Ссылка на ссылку:SofaS, волосы .io/tutorials/страх...

метод Ньютона

В дополнение к упомянутому выше методу градиентного спуска метод Ньютона также является алгоритмом оптимизации, используемым в машинном обучении. Основная идея метода Ньютона заключается в использовании итерационных точекx_kПроизводная первого порядка (градиент) и производная второго порядка (матрица Гессена) целевой функции аппроксимируются квадратичной функцией, а затем в качестве новой точки итерации используется точка минимума квадратичной модели, и этот процесс повторяется до Приближенных минимумов, удовлетворяющих точности. Метод Ньютона спускается быстрее, чем градиентный спуск, и очень близок к оптимальному значению. Метод Ньютона делится на базовый метод Ньютона и глобальный метод Ньютона.

Основной метод Ньютона

Базовый метод Ньютона представляет собой алгоритм, основанный на производной, и итеративное направление каждого шага является направлением убывания значения функции в текущей точке. Для одномерного случая для оптимизационной функции f(x), которую необходимо решить, задача нахождения экстремального значения функции может быть преобразована в производную функцию{f}'(x)=0. В разложении Тейлора функции f(x) до второго порядка получаем:

\[f(x)=f(x_k) + {f}'(x_k)(x-x_k) + \frac{1}{2}f^n(x_k)(x-x_k)^2\]

Взяв производную от приведенной выше формулы и приравняв ее к 0, мы получим:

\[{f}'(x) + {f}''(x_k)(x-x_k) = 0\]

То есть получить:

\[x = x_k - \frac{{f}'(x_k)}{{f}''(x_k)}\]

Это обновленная формула метода Ньютона.

Поток основного метода Ньютона

  1. заданное значение ошибки завершения0 \leq \varepsilon \leq 1, начальная точкаx_0 \in \mathbb{R}^n, пусть к=0;
  2. рассчитатьg_k = \triangledown f(x_k),как\left \| g_k \right \| \leq \varepsilon, затем стоп, выводx^* \approx x_k;
  3. рассчитатьG_k = \triangledown ^2 f(x_k), и решить систему линейных уравненийG_kd=-g_kпониматьd_k;
  4. сделатьx_{k+1} = x_k + d_k, k=k+1, и очередь 2.

Глобальный метод Ньютона

Наиболее заметным преимуществом метода Ньютона является то, что он имеет высокую скорость сходимости и имеет локальную сходимость второго порядка.Однако начальная точка базового метода Ньютона должна быть «достаточно близко» к точке минимума, иначе алгоритм может не работать. сходятся, и в это время вводится глобальный метод Ньютона. Процесс глобального метода Ньютона:

  1. заданное значение ошибки завершения0 \leq \varepsilon \leq 1,\delta \in (0,1),\sigma \in (0,0.5), начальная точкаx_0 \in \mathbb{R}^n, пусть к=0;
  2. рассчитатьg_k = \triangledown f(x_k),как\left \| g_k \right \| \leq \varepsilon, затем стоп, выводx^* \approx x_k;
  3. рассчитатьG_k = \triangledown ^2 f(x_k), и решить систему линейных уравненийG_kd=-g_kпониматьd_k;
  4. Предполагатьm_k— наименьшее неотрицательное целое число m, не удовлетворяющее следующим неравенствам:f(x_k+\delta ^md_k)\leq f(x_k)+\sigma \delta ^mg_k^Td_k
  5. сделать\alpha _k = \delta ^{m_k},x_{k+1}=x_k+\alpha _kd_k,k=k+1, и очередь 2.

Конкретная реализация глобального метода Ньютона:

def newton(feature, label, iterMax, sigma, delta):
    '''牛顿法
    input:  feature(mat):特征
            label(mat):标签
            iterMax(int):最大迭代次数
            sigma(float), delta(float):牛顿法中的参数
    output: w(mat):回归系数
    '''
    n = np.shape(feature)[1]
    w = np.mat(np.zeros((n, 1)))
    it = 0
    while it <= iterMax:
        # print it
        g = first_derivativ(feature, label, w)  # 一阶导数
        G = second_derivative(feature)  # 二阶导数
        d = -G.I * g
        m = get_min_m(feature, label, sigma, delta, d, w, g)  # 得到最小的m
        w = w + pow(sigma, m) * d
        if it % 10 == 0:
            print "\t---- itration: ", it, " , error: ", get_error(feature, label , w)[0, 0]
        it += 1       
    return w

В программе функция newton использует глобальный метод Ньютона для изучения параметров в модели линейной регрессии.Вводом функции newton является функция обучения, метка целевого значения обучения, максимальное количество итераций iterMax глобального Ньютона метод и два глобальных метода Ньютона, параметры сигма и дельта. Выходом функции newton является параметр w модели линейной регрессии. В функции Ньютона необходимо рассчитать первую производную функции потерь, необходимо рассчитать вторую производную функции потерь, одновременно необходимо рассчитать минимальное значение m, и, наконец, вес обновляется в соответствии с к вышеуказанному значению.

def get_min_m(feature, label, sigma, delta, d, w, g):
    '''计算步长中最小的值m
    input:  feature(mat):特征
            label(mat):标签
            sigma(float),delta(float):全局牛顿法的参数
            d(mat):负的一阶导数除以二阶导数值
            g(mat):一阶导数值
    output: m(int):最小m值
    '''
    m = 0
    while True:
        w_new = w + pow(sigma, m) * d
        left = get_error(feature, label , w_new)
        right = get_error(feature, label , w) + delta * pow(sigma, m) * g.T * d
        if left <= right:
            break
        else:
            m += 1
    return m

В программе реализовано определение минимального значения m в глобальном методе Ньютона.В функции get_min_m входом является характерный признак обучающих данных, метка целевого значения обучающих данных, параметры глобального метода Ньютона сигма, delta, d и первый порядок функции потерь Производное значение g. Его выходом является наименьшее значение m m. В процессе расчета используется функция get_error при расчете значения функции потерь, и ее конкретная реализация:

def get_error(feature, label, w):
    '''计算误差
    input:  feature(mat):特征
            label(mat):标签
            w(mat):线性回归模型的参数
    output: 损失函数值
    '''
    return (label - feature * w).T * (label - feature * w) / 2

Армиджо Поиск

данный\delta \in (0,1),\sigma  \in (0,0.5), пусть ступенчатый множитель\alpha _k = \delta ^{m_k}m_k— наименьшее целое неотрицательное число, удовлетворяющее следующим неравенствам:f(x_k+\delta ^md_k)\leq f(x_k)+\sigma \delta ^mg_k^Td_k

Решение моделей линейной регрессии с использованием глобального метода Ньютона

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

\[l = \frac{1}{2}\sum_{i=1}^{m}(y^i-\sum_{j=0}^{n-1}w_jx_j^i)^2\]

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

\[\frac{\partial l}{\partial w_j} = -\sum_{i=1}^{m}[(y^i-\sum_{j=0}^{n-1}w_j\cdot x_j^i)*x_j^i]\]

Вторая производная функции потерь:

\[\frac{\partial l}{\partial w_j\partial w_k} = \sum_{i=1}^{m}(x_j^i\cdot x_k^i)\]

Соответствующий код:

def first_derivativ(feature, label, w):
    '''计算一阶导函数的值
    input:  feature(mat):特征
            label(mat):标签
    output: g(mat):一阶导数值
    '''
    m, n = np.shape(feature)
    g = np.mat(np.zeros((n, 1)))
    for i in xrange(m):
        err = label[i, 0] - feature[i, ] * w
        for j in xrange(n):
            g[j, ] -= err * feature[i, j]
    return g     
 
def second_derivative(feature):
    '''计算二阶导函数的值
    input:  feature(mat):特征
    output: G(mat):二阶导数值
    '''
    m, n = np.shape(feature)
    G = np.mat(np.zeros((n, n)))
    for i in xrange(m):
        x_left = feature[i, ].T
        x_right = feature[i, ]
        G += x_left * x_right
    return G

first_derivativ реализует решение первой производной функции потерь. В функции first_derivativ ее входные данные — это признак обучающих данных и метка целевого значения обучающих данных, а ее выход — первая производная g функции потерь, где g — вектор n × 1.

Функция second_derivative реализует вычисление второй производной функции потерь. В функции second_derivative ее входом является особенность обучающих данных, а выходом является вторая производная G функции потерь, где G — матрица размера n×n.

локально взвешенная линейная регрессия

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

\[\hat{W}=(X^TMX)^{-1}X^TMY\]

M - вес, присвоенный каждой точке.

LWLR использует функцию ядра, чтобы придать более высокие веса ближайшим точкам.Обычно используются ядра Гаусса, и соответствующие веса:

\[w(i,i)=\exp(\frac{\left | X^{(i)-x} \right |}{-2k^2})\]

Такая весовая матрица содержит только диагональные элементы.

Конкретная реализация локально взвешенной линейной регрессии:

import numpy as np
 
def lwlr(feature, label, k):
    '''局部加权线性回归
    input:  feature(mat):特征
            label(mat):标签
            k(int):核函数的系数
    output: predict(mat):最终的结果
    '''
    m = np.shape(feature)[0]
    predict = np.zeros(m)
    weights = np.mat(np.eye(m))
    for i in xrange(m):
        for j in xrange(m):
            diff = feature[i, ] - feature[j, ]
            weights[j,j] = np.exp(diff * diff.T / (-2.0 * k ** 2))
        xTx = feature.T * (weights * feature)
        ws = xTx.I * (feature.T * (weights * label))
        predict[i] = feature[i, ] * ws
    return predict

Линейный регрессионный анализ с помощью Scikit-Learn

Здесь мы используем набор данных, который поставляется с SkLearn для тестирования:

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
 
boston = load_boston()
X = boston.data
y = boston.target
 
print(X.shape)  # 样本个数及特征数
print(boston.feature_names)  # 特征标签名字
 
# 把数据分为训练数据集和测试数据集(20%数据作为测试数据集)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=3)
 
model = LinearRegression()
model.fit(X_train, y_train)
 
train_score = model.score(X_train, y_train)  # 模型对训练样本得准确性
test_score = model.score(X_test, y_test)  # 模型对测试集的准确性
print(train_score)
print(test_score)

Оптимизация модели

Полиномиально-линейная регрессия

Когда модель линейной регрессии слишком проста и приводит к недостаточному соответствию, мы можем увеличить полином признаков, чтобы модель линейной регрессии лучше соответствовала данным. как две особенностиx_1,x_2, что может увеличить произведение двух функцийx_1 \cdot x_2как новая функцияx_3. Мы также можем добавить x_1^2 в качестве еще одной новой функции.x_4.

В scikit-learn линейная регрессия реализуется классом sklearn.linear_model.LinearRegression, а полиномиальная реализуется классом sklearn.preprocessing.PolynomialFeatures. Итак, как добавить полиномиальные функции? Нам нужно соединить два класса с помощью конвейера, т. е. соединить две модели с помощью sklearn.pipeline.Pipeline. Конвейер может содержать несколько узлов обработки. В scikit-learn все узлы, кроме последнего узла, должны реализовывать методы «fit ()» и «transform ()». Последний узел должен только реализовать метод fit (). Вот и все . Когда данные обучающей выборки отправляются в конвейер для обработки, он вызывает методы fit() и transform() узлов один за другим, а затем вызывает метод fit() последнего узла для подбора данных.

нормализация данных

Когда модель линейной регрессии имеет несколько входных признаков, в частности, при использовании полинома, необходимо нормализовать данные. Например, характеристикиx_1Диапазон находится между [1, 4], функцияx_2Диапазон находится между [1, 2000], в этом случае вы можете позволитьx_1Разделить на 4 как новую функциюx_1, при этом позволяяx_2Разделить на 2000 как новую функциюx_2, этот процесс называется масштабированием признаков. Обучающие выборки можно нормализовать с помощью масштабирования признаков, а значения обработанных признаков находятся в диапазоне от [0, 1].

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

В scikit-learn при использовании LinearRegression для линейной регрессии вы можете указать normalize=True для нормализации данных. Подробнее см. в документации scikit-learn.

Код после оптимизации:

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
 
boston = load_boston()
X = boston.data
y = boston.target
 
print(X.shape)  # 样本个数及特征数
print(boston.feature_names)  # 特征标签名字
 
# 把数据分为训练数据集和测试数据集(20%数据作为测试数据集)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=3)
 
 
def polynomial_model(degree=1):
    polynomial_features = PolynomialFeatures(degree=degree, include_bias=False)
    linear_regression = LinearRegression(normalize=True)
    pipeline = Pipeline([("polynomial_features", polynomial_features), ("linear_regression", linear_regression)])
    return pipeline
 
 
model = polynomial_model(degree=2)
model.fit(X_train, y_train)
 
train_score = model.score(X_train, y_train)  # 模型对训练样本得准确性
test_score = model.score(X_test, y_test)  # 模型对测试集的准确性
print(train_score)
print(test_score)

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

Наградить автора