Почему я получаю функцию отрицательной стоимости для логистической регрессии с использованием градиентного спуска в Python? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь применить то, что я изучил в курсе Coursera Эндрю Нг.Я успешно реализовал этот же алгоритм так же, как я делаю это здесь, в наборе данных Kaggle Titanic, но теперь с этими данными (бои UFC) я получаю отрицательную цену.Я сократил набор данных до двух функций (противник и раунд, в котором бой закончился), а затем взял их zscore.

Это моя матрица дизайна: (на самом деле она намного больше, но я получаю тот же минусстоимость, когда она такая маленькая)

array([[ 1.        , -0.50373455, -0.35651205],
   [ 1.        , -1.54975476,  0.84266484],
   [ 1.        ,  0.63737841, -1.55568894],
   [ 1.        ,  1.11284214,  0.84266484],
   [ 1.        , -1.07429103,  0.84266484],
   [ 1.        , -1.07429103, -1.55568894],
   [ 1.        ,  0.25700742,  0.84266484],
   [ 1.        , -1.83503301, -0.35651205],
   [ 1.        ,  1.20793489, -0.35651205],
   [ 1.        ,  1.58830588, -1.55568894],
   [ 1.        , -1.16938378,  0.84266484],
   [ 1.        , -0.78901279, -0.35651205],
   [ 1.        , -0.50373455, -1.55568894],
   [ 1.        ,  1.0177494 , -0.35651205],
   [ 1.        , -0.21845631,  0.84266484],
   [ 1.        ,  0.92265665, -1.55568894],
   [ 1.        ,  0.06682193,  0.84266484],
   [ 1.        ,  1.30302764, -0.35651205],
   [ 1.        ,  0.44719292, -0.35651205],
   [ 1.        , -0.69392004,  0.84266484],
   [ 1.        ,  1.39812038, -1.55568894],
   [ 1.        , -0.97919828,  0.84266484],
   [ 1.        ,  0.16191468,  0.84266484],
   [ 1.        , -1.54975476,  0.84266484],
   [ 1.        , -0.02827082,  0.84266484],
   [ 1.        ,  0.63737841, -0.35651205],
   [ 1.        , -0.88410554,  0.84266484],
   [ 1.        ,  0.06682193,  0.84266484],
   [ 1.        , -1.73994026,  0.84266484],
   [ 1.        , -0.12336356,  0.84266484],
   [ 1.        , -0.97919828,  0.84266484],
   [ 1.        ,  0.8275639 , -1.55568894],
   [ 1.        ,  0.73247116,  0.84266484],
   [ 1.        ,  1.68339863, -1.55568894],
   [ 1.        ,  0.35210017, -1.55568894],
   [ 1.        , -0.02827082,  0.84266484],
   [ 1.        ,  1.30302764,  0.84266484]])

Мой вектор весов инициализируется всеми нулями:

array([[0.],
   [0.],
   [0.]])

Для полноты вот вектор Y:

array([[0],
       [0],
       [1],
       [1],
       [0],
       [0],
       [1],
       [0],
       [0],
       [1],
       [0],
       [0],
       [1],
       [0],
       [1],
       [0],
       [1],
       [0],
       [1],
       [1],
       [0],
       [1],
       [1],
       [0],
       [0],
       [1],
       [1],
       [1],
       [1],
       [0],
       [0],
       [1],
       [1],
       [1],
       [1],
       [0],
       [1]], dtype=uint8)

Это моя функция стоимости и функции сигмоида / прогнозирования:

def cost_function(X, Y, theta):
    m = len(Y)
    h = predict(X,theta)
    cost = (np.dot((-Y.T), np.log(h)) - np.dot((1-Y).T, np.log(1-h))) / m
    return cost

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

def predict(X, theta):
    z = np.dot(X, theta)
    return sigmoid(z)

Вот функция градиентного спуска:

def gradient_descent(X, Y, theta, rate):
    m = len(Y)
    h = predict(X, theta)

    gradient = rate * np.dot(X.T, (h-Y)) / m
    theta -= gradient
    return theta

Затем я использую эту функцию train, чтобы вызвать обе из n итераций.

def train(X, Y, theta, rate, iters):
    cost_history = []

    for i in range(iters):
        theta = gradient_descent(X, Y, theta, rate)

        cost = cost_function(X, Y, theta)
        cost_history.append(cost)

        if i % 100 == 0:
            print("iter: " + str(i) + " cost: " + str(cost))
    return theta, cost_history

Затем в конце этого я получаю функцию стоимости, которая выглядит следующим образом: enter image description here

Вот что мне трудно понять,Почему это отрицательно?Это проблема с кодом или данными, или это так должно работать, а я что-то упустил?В последний день я пытался понять это, но нигде не получил.Только с этими функциями он по-прежнему правильно предсказывает исход боя примерно в 54% случаев в тестовом наборе с использованием весов после того, как он обучен с использованием вышеуказанных функций, но стоимость отрицательная.

1 Ответ

0 голосов
/ 16 апреля 2019

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

Так что Y вектора dtype равен uint8, и это, очевидно, вызывает проблемы где-то внизлиния.Изменение его на int64 исправило все.Извините, я не знаю, почему это вызывает проблему, но если я узнаю, я отредактирую это в своем ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...