Введение в машинное обучение - страница 8
Увеличение коэффициента λ приводит к повышению степени обобщения алгоритма. В пределе при очень большом значении λ функция гипотезы превращается в прямую или гиперплоскость. Практически это означает, что алгоритм будет вести себя слишком линейно, что также неоптимально. Задача исследователя – подобрать коэффициент регуляризации таким образом, чтобы алгоритм был не слишком линеен и в то же время обладал достаточной способностью к обобщению.
Вычисление параметров регрессии методом градиентного спуска выполняется так же, как и ранее, за исключением небольшого дополнения в виде регуляризационного коэффициента, так что для j-го параметра на каждом шаге цикла вычисляется значение:
Рассмотрим пример.
В качестве исходных данных синтезируем набор данных в соответствии с выражением:
Добавив некоторый случайный коэффициент с помощью np.array([np.random.rand(x.size)]).T/50, получим примерно следующее (рисунок 2.5):
Рисунок 2.5. Исходные данные и результаты выполнения алгоритма полиномиальной регрессии
Введем переменную degree, означающую коэффициент регрессии. Например, при degree = 1 получим обычную линейную регрессию (r2_score = 0.27). Увеличивая степень регрессии, можем добится значительно лучших результатов. Например, при degree = 19 r2_score = 0.90. Использование коэффициента регуляризации lambda_reg позволяет «сглаживать» регрессионную кривую. Фрагмент программы, обеспечивающей расчет параметров полиномиальной регрессии, приведен ниже:
>xr=np.array([np.linspace(0,1,180)])
>x=xr.T
>print(x.size)
>y=f(x)
>(x,y)=plusRandomValues(x,y) #добавление случайных величин
>plt.figure(figsize=(9,9))
>plt.plot(x,y,'.')
>m=x.size
>degree=19 #коэффициент регрессии
>lambda_reg=0.00001
>on=np.ones([m,1])
>X=on
>#расчет степеней свободной переменной в соответствии со степенью регрессии degree
>for i in range(degree):
> xx=np.power(x, i+1)
> X=np.concatenate((X,xx),axis=1)
>theta=np.array([np.random.rand(degree+1)])
>h=np.dot(X,theta.T)
>t0=time.time()
>alpha=0.5
>iterations=100000
>for i in range(iterations):
> theta=theta-alpha*(1/m)*np.dot((h-y).T,X) -(lambda_reg/m)*theta
> h=np.dot(X,theta.T)
>t1=time.time()
>plt.plot(x,y,'.')
>plt.plot(x,h, label='Regression degree = {:0.2f})'.format(degree))
>leg=plt.legend(loc='upper left',shadow=True,fontsize=16)
>leg.get_frame().set_facecolor('#0055DD')
>leg.get_frame().set_facecolor('#')
>leg.get_frame().set_alpha(0.9)
>plt.show()
2.4. Классификаторы. Логистическая регрессия
Несмотря на присутствующее в названии данного метода слово «регрессия», цель данного алгоритма не восстановление значений или предсказание. Алгоритм применяется в случае, если необходимо решить задачу классификации. В случае логистической регрессии речь идет о задаче бинарной классификации, то есть отнесении объектов к классу «негативных» или «позитивных», вследствие чего набор обучающих примеров построен таким образом, что y ∈ {0,1}.
В этом случае от функции гипотезы требуется выполнение условия 0 ≤h>θ(x) ≤1, что достигается применением сигмоидальной (логистической) функции:
Где θ – вектор параметров.
Можно записать также
где n – число параметров (свойств или признаков) объектов; g(z) – сигмоидальная или логистическая функция.
В сокращенном виде h>θ(x) = g(θ>Tx).
Отметим, что сигмоидальная функция широко применяется и в нейронных сетях в качестве активационной функции нейронов, поскольку является непрерывно дифференцируемой и тем самым гарантирует сходимость алгоритмов обучения нейронной сети. Примерный вид сигмоиды показан в разделе «Активационные функции».