Машинное обучение — классификация логистической регрессии (практика машинного обучения)

машинное обучение

"Это седьмой день моего участия в ноябрьском испытании обновлений, ознакомьтесь с подробностями события:Вызов последнего обновления 2021 г."

логистическая регрессия

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

двухклассный

Начнем с определения синих круглых данных как типа 1, а остальных данных как типа 2; нужно только классифицировать 1 шаг: 1->2.

图片.png

Мультикласс

Сначала мы определяем один класс как тип 1 (положительный класс), а остальные данные как отрицательный класс (остальные); затем удаляем данные типа 1, а оставшуюся часть снова делим на тип 2 и отрицательный класс; если есть класс ?, то нужно классифицировать ?-1 раз.

图片.png

сигмод функция

Используя логистическую регрессию, нам нужно использовать очень важную функцию, функцию Sigmod.

Нам нужно использовать эту функцию для классификации образцов, чтобы пометить 1 или 0 для достижения эффекта классификации.

?(?) представляет собой общую логистическую функцию (логистическая функция) является ? сигмовидной функцией, тогда: ?(?) = ?(?) = 1+1/(1+?−?) В совокупности мы получаем функцию гипотезы для логистической регрессии модель:

? (?^, ?) = −?log(?^) − (1 − ?)log(1 − ?^) (y^ представляет прогнозируемое значение, y представляет фактическое значение)

Когда ?(?) больше или равно 0,5, предсказать y=1. Когда ?(?) меньше 0,5, предсказать y=0.

图片.png

Решение функции логистической регрессии

Функция потерь: ? (?^, ?) = −?log(?^) − (1 − ?)log(1 − ?^) (y^ представляет прогнозируемое значение, y представляет фактическое значение)

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

Функция стоимости:

图片.png

Формула параметра обновления:

图片.png

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

Код

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

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
path = 'ex2data1.txt'
data = pd.read_csv(path, header=None, names=['Exam 1', 'Exam 2', 'Admitted'])
positive = data[data['Admitted'].isin([1])]
negative = data[data['Admitted'].isin([0])]

fig, ax = plt.subplots(figsize=(10, 6))
ax.scatter(positive['Exam 1'],
           positive['Exam 2'],
           s=50,
           c='b',
           marker='o',
           label='Admitted')
ax.scatter(negative['Exam 1'],
           negative['Exam 2'],
           s=50,
           c='r',
           marker='x',
           label='Not Admitted')
ax.legend()
ax.set_xlabel('Exam 1 Score')
ax.set_ylabel('Exam 2 Score')
plt.show()
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def cost(w, X, y):
    w = np.matrix(w)
    X = np.matrix(X)
    y = np.matrix(y)
    first = np.multiply(-y, np.log(sigmoid(X * w.T)))
    second = np.multiply((1 - y), np.log(1 - sigmoid(X * w.T)))
    return np.sum(first - second) / (len(X))
# add a ones column - this makes the matrix multiplication work out easier
data.insert(0, 'Ones', 1)

# set X (training data) and y (target variable)
cols = data.shape[1]
X = data.iloc[:, 0:cols - 1]
y = data.iloc[:, cols - 1:cols]

# convert to numpy arrays and initalize the parameter array w
X = np.array(X.values)
y = np.array(y.values)
w = np.zeros(3)
cost(w,X,y)
def gradient(w, X, y):
    w = np.matrix(w)
    X = np.matrix(X)
    y = np.matrix(y)

    parameters = int(w.ravel().shape[1])
    grad = np.zeros(parameters)

    error = sigmoid(X * w.T) - y

    for i in range(parameters):
        term = np.multiply(error, X[:, i])
        grad[i] = np.sum(term) / len(X)

    return grad
import scipy.optimize as opt
result = opt.fmin_tnc(func=cost, x0=w, fprime=gradient, args=(X, y))
def predict(w, X):
    probability = sigmoid(X * w.T)
    return [1 if x >= 0.5 else 0 for x in probability]
w_min = np.matrix(result[0])
predictions = predict(w_min, X)
correct = [
    1 if ((a == 1 and b == 1) or (a == 0 and b == 0)) else 0
    for (a, b) in zip(predictions, y)
]
accuracy = (sum(map(int, correct)) % len(correct))
print('accuracy = {0}%'.format(accuracy))

В конце концов, правильный показатель составляет 89%