Введение в машинное обучение - страница 10



Разработаем логистическую функцию logisticFunction(X,theta) и функцию, обеспечивающую оценку объекта на основе предсказанного значения гипотезы, – logRegPredictMatrix(h,threshold). Как показано выше, функция гипотезы принимает значение от 0 до 1. Для того чтобы получить оценку принадлежности объекта к классу (1 – «положительный», 0 – «отрицательный»), необходимо для каждого значения гипотезы вычислить номер класса («предсказать») по правилу predicted = 0 If h = threshold. Обычное значение порога threshold=0.5.

Функция, вычисляющая значения коэффициентов логистической регрессии первого порядка:


>def logisticRegressionByNumpy(X,y):

>   m=y.size

>   X=np.concatenate((np.ones([m,1]),X), axis=1)

>   theta=np.array(np.random.rand(X.shape[1]))

>   h=logisticFunction(X,theta)

>   alpha=0.05

>   iterations=1500

>   lambda_reg=0.01

>   for i in range(iterations):

>   theta=theta – alpha*(1/m) *np.dot(X.T,(h-y))-(lambda_reg/m)*theta

>      h=logisticFunction(X,theta)

>   return theta,h


Вызов функции и вывод показателей качества можно выполнить:


>theta,h=logisticRegressionByNumpy(X_train,y_train)

>predicted_train=logRegPredictMatrix(h,threshold=0.50)

>matrix_train = confusion_matrix(y_train, predicted_train)#,labels)

>print('Logistic regression')

>print('Results on train set')

>print('Accuracy on train set: {:.2f}'.format(accuracy_score(y_train, predicted_train)))

>print('Conf. matrix on the train \n', matrix_train)

>print('Classification report at train set\n',

>    classification_report(y_train, predicted_train, target_names = ['not 1', '1']))


В результате получим на тренировочном множестве значение accuracy = 0.57, а на тестовом 0.4. Другими словами, точность предсказания нашей функции хуже, чем при случайном выборе классов! Подобный результат вполне предсказуем, поскольку мы попытались использовать прямую там, где требуется как минимум окружность.

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

X=np.concatenate((np.ones([m,1]),X,X**2), axis=1)

После этого мы получим значение accuracy на тренировочном и тестовом множествах, равное 0.9, что вполне приемлемо для нашей задачи.

Необходимость подбора значимых параметров и формирования новых параметров является одним из недостатков логистической регрессии.

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

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

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

Примечание. Программный код примера MLF_logReg_Python_numpy_002.ipynb, описанного в этом разделе, можно получить по ссылке

https://www.dropbox.com/s/vlp91rtezr5cj5z/MLF_logReg_Python_numpy_002.ipynb?dl=0

2.5. Контрольные вопросы

Что такое объект в задачах машинного обучения?

Как в общем виде записать функцию стоимости в задаче классификации?

Как в общем виде записать функцию стоимости в задаче регрессии?

Приведите выражение для функции гипотезы линейной регрессии одной переменной.