Точность линейной регрессионной модели всегда равна 1,0 в тензорном потоке

Проблема:

Я строю модель, которая будет прогнозировать стоимость жилья. Итак, сначала я решил построить модель линейной регрессии в Tensorflow. Но когда я начинаю тренироваться, я вижу, что моя точность всегда 1

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

Вот мой код

df_train = df_train.loc[:, ['OverallQual', 'GrLivArea', 'GarageArea', 'SalePrice']]
df_X = df_train.loc[:, ['OverallQual', 'GrLivArea', 'GarageArea']]
df_Y = df_train.loc[:, ['SalePrice']]
df_yy = get_dummies(df_Y)
print("Shape of df_X: ", df_X.shape)

X_train, X_test, y_train, y_test = train_test_split(df_X, df_yy, test_size=0.15)
X_train = np.asarray(X_train).astype(np.float32)
X_test = np.asarray(X_test).astype(np.float32)
y_train = np.asarray(y_train).astype(np.float32)
y_test = np.asarray(y_test).astype(np.float32)


X = tf.placeholder(tf.float32, [None, num_of_features])
y = tf.placeholder(tf.float32, [None, 1])

W = tf.Variable(tf.zeros([num_of_features, 1]))
b = tf.Variable(tf.zeros([1]))

prediction = tf.add(tf.matmul(X, W), b)
num_epochs = 20000
# calculating loss
cost = tf.reduce_mean(tf.losses.softmax_cross_entropy(onehot_labels=y, logits=prediction))

optimizer = tf.train.GradientDescentOptimizer(0.00001).minimize(cost)

correct_prediction = tf.equal(tf.argmax(prediction, axis=1), tf.argmax(y, axis=1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in range(num_epochs):
    if epoch % 100 == 0:
        train_accuracy = accuracy.eval(feed_dict={X: X_train, y: y_train})
        print('step %d, training accuracy %g' % (epoch, train_accuracy))
        optimizer.run(feed_dict={X: X_train, y: y_train})

print('test accuracy %g' % accuracy.eval(feed_dict={
X: X_test, y: y_test}))

Выход:

step 0, training accuracy 1
step 100, training accuracy 1
step 200, training accuracy 1
step 300, training accuracy 1
step 400, training accuracy 1
step 500, training accuracy 1
step 600, training accuracy 1
step 700, training accuracy 1
............................
............................
step 19500, training accuracy 1
step 19600, training accuracy 1
step 19700, training accuracy 1
step 19800, training accuracy 1
step 19900, training accuracy 1
test accuracy 1

РЕДАКТИРОВАТЬ: я изменил свою функцию стоимости на это

cost = tf.reduce_sum(tf.pow(prediction-y, 2))/(2*1241)

Но все равно мой вывод всегда 1.

РЕДАКТИРОВАТЬ 2: В ответ на комментарий lejlot: Спасибо lejlot. Я изменил свой код точности на этот

with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
merged_summary = tf.summary.merge_all()
writer = tf.summary.FileWriter("/tmp/hpp1")
writer.add_graph(sess.graph)

for epoch in range(num_epochs):
    if epoch % 5:
        s = sess.run(merged_summary, feed_dict={X: X_train, y: y_train})
        writer.add_summary(s, epoch)
    sess.run(optimizer,feed_dict={X: X_train, y: y_train})
    if (epoch+1) % display_step == 0:
        c = sess.run(cost, feed_dict={X: X_train, y: y_train})
        print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c), \
            "W=", sess.run(W), "b=", sess.run(b))

print("Optimization Finished!")
training_cost = sess.run(cost, feed_dict={X: X_train, y: y_train})
print("Training cost=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n')

Но на выходе все нано

....................................
Epoch: 19900 cost= nan W= nan b= nan
Epoch: 19950 cost= nan W= nan b= nan
Epoch: 20000 cost= nan W= nan b= nan
Optimization Finished!
Training cost= nan W= nan b= nan 

1 ответ

Вы хотите использовать линейную регрессию, но на самом деле вы используете логистическую регрессию. Взгляни на tf.losses.softmax_cross_entropy: выводит распределение вероятностей, то есть вектор чисел, суммирующих до 1, В вашем случае вектор имеет size=1 следовательно, он всегда выводит [1],

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

Другие вопросы по тегам