Почему оценщик TensorFlow не может сделать это простое предсказание линейной регрессии

1

Я изучаю tenorflow в настоящее время и не могу окутать голову, почему shadoworflow не делает правильного предсказания по следующей простой проблеме регрессии.

X - случайные числа от 1000 до 8000 Y - это X + 250

Поэтому, если X равно 2000, Y равно 2250. Это кажется проблемой линейной регрессии для меня. Тем не менее, когда я пытаюсь сделать прогнозы, это нигде близко к тому, что я ожидаю, X из 1000 дает мне прогноз 1048 вместо 1250.

Также потери и средняя потеря огромны:

{'average_loss': 10269.81, 'loss': 82158.48, 'global_step': 1000}

Вот полный код:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
from sklearn.model_selection import train_test_split

x_data = np.random.randint(1000, 8000, 1000000)
y_true = x_data + 250

feat_cols = [tf.feature_column.numeric_column('x', shape=[1])]
estimator = tf.estimator.LinearRegressor(feature_columns=feat_cols)

x_train, x_eval, y_train, y_eval = train_test_split(x_data, y_true, test_size=0.3, random_state=101)

input_func = tf.estimator.inputs.numpy_input_fn({'x': x_train}, y_train, batch_size=8, num_epochs=None, shuffle=True)
train_input_func = tf.estimator.inputs.numpy_input_fn({'x': x_train}, y_train, batch_size=8, num_epochs=1000, shuffle=False)
eval_input_func = tf.estimator.inputs.numpy_input_fn({'x': x_eval}, y_eval, batch_size=8, num_epochs=1000, shuffle=False)

estimator.train(input_fn=input_func, steps=1000)

train_metrics = estimator.evaluate(input_fn=train_input_func, steps=1000)
eval_metrics = estimator.evaluate(input_fn=eval_input_func, steps=1000)

print(train_metrics)
print(eval_metrics)

brand_new_data = np.array([1000, 2000, 7000])
input_fn_predict = tf.estimator.inputs.numpy_input_fn({'x': brand_new_data}, shuffle=False)

prediction_result = estimator.predict(input_fn=input_fn_predict)

print(list(prediction_result))

Я что-то делаю неправильно, или я неверно истолковываю то, что означает LinearRegression?

Теги:
tensorflow
machine-learning

1 ответ

0
Лучший ответ

Я думаю, что это происходит, когда вы настраиваете некоторые гиперпараметры. Я также изменил оптимизатор на AdamOptimizer.

В основном размер партии равен 1, а эпохи - None.

train_input_func = tf.estimator.inputs.numpy_input_fn ({'x': x_train}, y_train, batch_size = 1, num_epochs = None, shuffle = True)

Код:

import tensorflow as tf
import numpy as np
from sklearn.model_selection import train_test_split

x_data = np.random.randint(1000, 8000, 10000)
y_true = x_data + 250


feat_cols = tf.feature_column.numeric_column('x')
optimizer = tf.train.AdamOptimizer(1e-3)

estimator = tf.estimator.LinearRegressor(feature_columns=[feat_cols],optimizer=optimizer)

x_train, x_eval, y_train, y_eval = train_test_split(x_data, y_true, test_size=0.3, random_state=101)


train_input_func = tf.estimator.inputs.numpy_input_fn({'x': x_train}, y_train, batch_size=1, num_epochs=None,
                                                      shuffle=True)

eval_input_func = tf.estimator.inputs.numpy_input_fn({'x': x_eval}, y_eval, batch_size=1, num_epochs=None,
                                                     shuffle=True)

estimator.train(input_fn=train_input_func, steps=1005555)

train_metrics = estimator.evaluate(input_fn=train_input_func, steps=10000)
eval_metrics = estimator.evaluate(input_fn=eval_input_func, steps=10000)

print(train_metrics)
print(eval_metrics)

brand_new_data = np.array([1000, 2000, 7000])
input_fn_predict = tf.estimator.inputs.numpy_input_fn({'x': brand_new_data}, num_epochs=1,shuffle=False)

prediction_result = estimator.predict(input_fn=input_fn_predict)

for prediction in prediction_result:
    print(prediction['predictions'])

Метрики:

{'average_loss': 3.9024353e-06, 'loss': 3.9024353e-06, 'global_step': 1005555}

{'average_loss': 3.9721594e-06, 'loss': 3.9721594e-06, 'global_step': 1005555}

[1250.003]

[2250.002]

[7249.997]

  • 0
    Хорошо, вы не могли бы объяснить, почему размер эпохи должен быть Нет и почему это имеет значение?
  • 0
    Я настраивал гиперпараметры несколько раз, так как я тоже был обеспокоен этой проблемой. И заметил, что потери увеличивались постепенно, когда я увеличивал количество шагов. Подробное объяснение расчета - это ответ @ dmainz. Попробуйте сократить шаги и изменить оптимизатор, чтобы экспериментировать. Когда я использовал другие оптимизаторы с более высокими значениями для batch_size и num_epocs, он извергал наны, и я попытался обрезать градиенты. Не сработало Но, наконец, это код, который работал.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню