Вы на правильном пути, просто упускаете некоторые ключевые моменты при нормализации ваших данных и построении модели.
В вашей нейронной сети есть только 2 точки данных.Вместо этого используйте np.arange()
для создания большего массива.
Нейронные сети, такие как точки данных между 0 и 1 (помогает в обучении конвергенции).Итак, давайте преобразуем массивы x и y с помощью sklearn.MinMaxScaler:
(это преобразует каждую переменную между 0 и 1, основываясь на ее значении, в минимальное и максимальное значения массива)
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
x = scaler.fit_transform(np.arange(1965, 1990).reshape(-1,1))
y = scaler.fit_transform(np.arange(320, 345).reshape(-1,1))
(примечание: мы изменяем x, y, чтобы соответствовать массиву (1,0) numpy)
Затем мы можем построить модель, используя 1 линейный плотный слой:
epochs = 20
model = keras.Sequential()
model.add(Dense( units=1, input_dim=1, activation="linear" ))
## Establishing optimizer so that we can modify the learning rate >= 1
sgd = keras.optimizers.SGD(lr=0.1, momentum=0.0, decay=0.0, nesterov=False)
model.compile( optimizer=sgd, loss="mean_squared_error" )
model.fit( x, y, batch_size=1, epochs=epochs)
Наконец, мы можем построить прогнозные и фактические переменные Y:
predicted = model.predict(x)
predicted = predicted + .01 ## offset prediction so the two lines don't overlap
plt.plot(scaler.inverse_transform(y), label='actual_y')
plt.plot(scaler.inverse_transform(predicted), label='predicted_y')
plt.legend(loc='upper left')
plt.show()
(Примечание: мы обращаемся к sklearn.tranform, чтобы показать фактические данные вместо Scaled версии)
Итоговый код все вместе:
import numpy as np
import matplotlib.pyplot as plt
import keras
from keras.layers.core import Dense
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
epochs = 20
## Using np.arange() instead of np.array()
## Transforming x,y so that the model can understand the variables
x = scaler.fit_transform(np.arange(1965, 1990).reshape(-1,1))
y = scaler.fit_transform(np.arange(320, 345).reshape(-1,1))
model = keras.Sequential()
model.add(Dense( units=1, input_dim=1, activation="linear" ))
## Establishing optimizer so that we can modify the learning rate >= 1
sgd = keras.optimizers.SGD(lr=0.1, momentum=0.0, decay=0.0, nesterov=False)
model.compile( optimizer=sgd, loss="mean_squared_error" )
model.fit( x, y, batch_size=1, epochs=epochs)
predicted = model.predict(x)
predicted = predicted + .01 ## offset prediction so the two lines don't overlap
plt.plot(scaler.inverse_transform(y), label='actual_y')
plt.plot(scaler.inverse_transform(predicted), label='predicted_y')
plt.legend(loc='upper left')
plt.show()