banner banner banner
Введение в машинное обучение
Введение в машинное обучение
Оценить:
Рейтинг: 0

Полная версия:

Введение в машинное обучение

скачать книгу бесплатно

В нашем случае мы задали фиксированное множество примеров (m = 30), однако в дальнейшем мы можем его изменить. Для тогo чтобы программа воспринимала любое множество примеров, определим его, используя метод size:

m=x.size

#сформируем первую колонку матрицы X, состоящую из единиц

on=np.ones([m,1])

#и сформируем матрицу X, объединив колонки

X=np.concatenate((on,x),axis=1)

Это матрица, в первой колонке которой стоят единицы, а во второй – значения x

, x

,…, x

. Затем зададим абсолютно произвольно начальные значения коэффициентов регрессии:

theta=np.matrix('0.1;1.3')

#и рассчитаем значения функции гипотезы

h=np.dot(X,theta)

#дополним предыдущий график регрессионной прямой

plt.plot(x,h)

Получим график вида:

Рисунок 2.3. Начальное положение прямой регрессии

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

t0=time.time()

alpha=0.05

iterations=500

for i in range(iterations):

theta=theta-alpha*(1/m)*np.sum(np.multiply((h-y),x))

h=np.dot(X,theta)

t1=time.time()

#Построим графики

plt.figure(figsize=(9,9))

plt.plot(x,y,'.')

plt.plot(x,h,label='regressionByIteration')

leg=plt.legend(loc='upper right',shadow=True,fontsize='x-small')

leg.get_frame().set_facecolor('#0055DD')

leg.get_frame().set_facecolor('#eeeeee')

leg.get_frame().set_alpha(0.5)

plt.show()

Получим следующий график регрессионной прямой:

Рисунок 2.4. Результат выполнения алгоритма градиентного спуска

#рассчитаем среднеквадратическую ошибку

mse=np.sum(np.power((h-y),2))/m

print('regressionByIteration mse= ', mse)

#и распечатаем длительность выполнения цикла градиентного спуска

print('regressionByIterations takes ',(t1-t0))

Получим примерно следующий вывод:

regressionByIterations mse = 63.270782365456206

regressionByIterations takes 0.027503490447998047

В качестве небольшого дополнения рассчитаем показатели точности регрессии с применением библиотеки метрик sklearn.

from sklearn.metrics import mean_squared_error, r2_score

y_predict = h

y_test=y

print("Mean squared error: {:.2f}".format(mean_squared_error(y_test,y_predict)))

print("r2_score: {:.2f}".format(r2_score(y_test, y_predict)))

Получим следующие результаты:

Mean squared error: 63.27

r2_score: 0.93

Подробнее о метриках точности классификации и регрессии см. в разделе «3. Оценка качества методов ML».

2.3. Полиномиальная регрессия

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

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

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

Вычисление параметров регрессии методом градиентного спуска выполняется так же, как и ранее, за исключением небольшого дополнения в виде регуляризационного коэффициента, так что для 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, что достигается применением сигмоидальной (логистической) функции: