Тренируйте регрессию логистики c с моделью регуляризации с нуля - PullRequest
0 голосов
/ 06 апреля 2020

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

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def Probability(theta, X):
    return sigmoid(np.dot(X,theta))


def  cost_function_regression(theta, x, y, Lambda):
    # Computes the cost function for all the training samples
    m = x.shape[0]
    total_cost = (-(1 / m) * np.sum(
    np.dot(y.T, np.log(Probability( theta,x))) + np.dot((1 - y).T, np.log(
            1 - Probability(theta,x))))) + (Lambda/ 2)* np.sum(np.dot(theta, theta.T))
    return total_cost

def Gradient_regression( theta, X,y, Lambda ):
    m=X.shape[0]

    grad=(((1/m)* np.dot(X.T, Probability(theta,X)-y)) + np.sum((Lambda/m )* theta))
    return(grad)

1 Ответ

0 голосов
/ 12 апреля 2020

Мы начнем с создания теории, сопровождаемой рабочим примером, и закончим некоторыми комментариями.

Постановка задачи

Шаги по подгонке / обучению регрессионной модели логистики c (как с любой контролируемой моделью ML), используя метод градиентного приличия, как показано ниже

  1. Определение функции гипотезы [h(X)] с параметрами [w,b]
  2. Определение функции потерь [J(w,b)]
  3. Прямое распространение: делать прогнозы с использованием функций гипотез [y_hat = h(X)]
  4. Рассчитать ошибку между фактической меткой [y] и прогнозируемой меткой [y_hat] с использованием функции потерь.
  5. Обратное распространение: отрегулируйте параметры в функции гипотезы на основе ошибки (путем расчета градиентов), используя правило обновления

    enter image description here

  6. Переходим к шагу 3, если градиенты высокие, иначе конец

Расчет градиентов

Функция гипотезы для логистики c регресс ion:

enter image description here

Где X - вектор, а X^i - i-й элемент вектора.

Обычно используемая функция потерь для логистической регрессии c - это потеря журнала. Журнал потерь с регуляризацией l2:

enter image description here

Рассчитаем градиенты

enter image description here

Аналогично

enter image description here

Теперь, когда мы знаем градиенты, давайте закодируем алгоритм достойного градиента, чтобы соответствовать параметрам нашей логистики c регрессии модель

Пример игрушки

# load data
iris = datasets.load_iris()
# Lets take only two classes
y = iris.target
X = iris.data[y != 2] 
y = y[y != 2]

# Normalize data to 0 mean and 1 std
X[:, 0] = (X[:, 0] - np.mean(X[:, 0]))/np.std(X[:, 0])
X[:, 1] = (X[:, 1] - np.mean(X[:, 1]))/np.std(X[:, 1])
X[:, 2] = (X[:, 2] - np.mean(X[:, 2]))/np.std(X[:, 2])
X[:, 3] = (X[:, 3] - np.mean(X[:, 3]))/np.std(X[:, 3])

def sigmoid(x):
    return 1 / (1+math.exp(-x))  

# initialize weights
w0, w1, w2, w3, b = 0.01,0.01,0.01,0.01,0.01
n = len(X)
# Learning rate
alpha = 0.01
# The gardient decent loop
while True:
    y_hat = [sigmoid(w0*x[0] + w1*x[1] + w2*x[2] + w3*x[3] + b) for x in X]
    delta_w0 = -np.sum([(y[j] - y_hat[j])*X[j,0] for j in range(n)])/n + 2*w0
    delta_w1 = -np.sum([(y[j] - y_hat[j])*X[j,1] for j in range(n)])/n + 2*w1
    delta_w2 = -np.sum([(y[j] - y_hat[j])*X[j,2] for j in range(n)])/n + 2*w2
    delta_w3 = -np.sum([(y[j] - y_hat[j])*X[j,3] for j in range(n)])/n + 2*w3
    delta_b = -np.sum([(y[j] - y_hat[j]) for j in range(n)])/n + 2*b

    w0 = w0 - alpha*delta_w0
    w1 = w1 - alpha*delta_w1
    w2 = w2 - alpha*delta_w2
    w3 = w3 - alpha*delta_w3

    b = b - alpha*delta_b

    if np.sum(np.abs([delta_w0, delta_w1, delta_w2, delta_w3, delta_b])) < 1e-5:
        break

# Make predictions
pred = [1 if i > 0.5 else 0 for i in y_hat]
# Find no:of correct predictions
correct  = np.sum([1 if pred[i] == y[i] else 0 for i in range(n)])
print (correct)

Комментарии

  1. Приведенный выше пример игрушки закодирован наиболее неэффективным способом. Намерение было показать шаги четко, а не эффективность. Сказав это, мы должны будем векторизовать операции (используя массивы np и операции с матрицами) для эффективности.
  2. Нормализация данных важна
  3. Модели обучаются на данных поезда, а производительность измеряется на данные испытаний / валидации.
...