Я пытаюсь применить то, что я изучил в курсе 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
Затем в конце этого я получаю функцию стоимости, которая выглядит следующим образом:
Вот что мне трудно понять,Почему это отрицательно?Это проблема с кодом или данными, или это так должно работать, а я что-то упустил?В последний день я пытался понять это, но нигде не получил.Только с этими функциями он по-прежнему правильно предсказывает исход боя примерно в 54% случаев в тестовом наборе с использованием весов после того, как он обучен с использованием вышеуказанных функций, но стоимость отрицательная.