Keras의 LSTM을 사용하여 데이터 세트에서 15 개의 이전 샘플을 사용하여 한 단계 앞서 예측을 수행하고 있습니다.
데이터 csv 파일은 여기에서 찾을 수 있습니다. ( https://drive.google.com/file/d/0Byiipc0dArG0LVZJelB4NFBucms/view?usp=sharing )
두 번째 열 col [1] 값이 사용됩니다. 첫 번째 열 (타임 스탬프)의 값은 전혀 사용되지 않습니다.
다음 코드를 사용합니다.
# convert an array of values into a dataset matrix
def create_dataset(dataset, look_back=1):
dataX, dataY = [], []
for i in range(len(dataset)-look_back-1):
a = dataset[i:(i+look_back), 0]
dataX.append(a)
dataY.append(dataset[i + look_back, 0])
return numpy.array(dataX), numpy.array(dataY)
# fix random seed for reproducibility
numpy.random.seed(7)
# load the dataset
dataframe = pandas.read_csv('node70-3000.csv', usecols=[1],
engine='python', skipfooter=3)
dataset = dataframe.values
dataset = dataset.astype('float32')
# normalize the dataset
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)
# split into train and test sets
train_size = int(len(dataset) * 0.7)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:],
dataset[train_size:len(dataset),:]
# reshape into X=t and Y=t+1
look_back = 15
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
# reshape input to be [samples, time steps, features]
trainX = numpy.reshape(trainX, (trainX.shape[0], trainX.shape[1], 1))
testX = numpy.reshape(testX, (testX.shape[0], testX.shape[1], 1))
# create and fit the LSTM network
batch_size = 11
model = Sequential()
model.add(LSTM(32, batch_input_shape=(batch_size, look_back, 1),
stateful=True))
#model.add(LSTM(32, stateful = True))
model.add(Dense(32))
model.add(Dense(1))
# default lr=0.001
optim = Adam(lr=0.05, beta_1=0.9, beta_2=0.999, epsilon=1e-08,
decay=0.1)
model.compile(loss='mean_squared_error', optimizer=optim)
for i in range(50):
model.fit(trainX, trainY, nb_epoch=1, batch_size=batch_size,
verbose=2, shuffle=False)
model.reset_states()
# make predictions
문제 :
이 코드를 사용하여주기적이고 깨끗한 시계열을 예측했으며 잘 작동합니다. 그러나이 데이터 세트에는 Adam의 다른 매개 변수 (학습률 등)를 사용했습니다. 그래도 실제 값에서 큰 오프셋이있는 예측을 얻습니다. 예측 값은 항상 데이터 값의 평균에 가까운 것 같습니다. 다음 그래프를 참조하십시오. csv 파일에 1850 개의 데이터 포인트가 있습니다. 이들은 크기 15의 시퀀스로 그룹화됩니다. 입력은 크기 15의 시퀀스입니다. 출력은 예측 된 다음 값이어야합니다. 데이터의 70 %는 학습에 사용되고 나머지는 테스트 데이터 세트입니다. 다음 이미지에서 각각 녹색과 빨간색으로 표시된 기차 및 테스트 데이터 세트에서 예측이 수행됩니다.
( https://drive.google.com/file/d/0Byiipc0dArG0OEN5el9lc0puNGM/view?usp=sharing )
왜 이런 일이 발생하고 원인이 무엇인지 알고 있습니까?
감사!
데이터는 이진 데이터 + 노이즈와 매우 유사합니다. 아래는 원시 데이터의 히스토그램과 원시 데이터의 첫 번째 차이에 대한 히스토그램입니다. 예측의 정확한 값이 중요하지 않은 경우 데이터를 바이너리로 만들고 다른 비용 함수 (예 : 바이너리 크로스 엔트로피)를 사용하는 것이 좋습니다.하지만 아래 설명을 제공하는 것이 작동 할 것이라는 데 회의적입니다.
가능한 다음 값이 여러 개인 유사한 시퀀스가있는 경우 네트워크는 평균 값을 예측하려고합니다. 예를 들어 시퀀스 (0,0,1) 및 (0,0,0) 및 (0,0, -1)과 마지막 값을 학습하려는 네트워크를 고려하십시오. 이 장난감 데이터를 사용하면 예측 모델의 가장 좋은 MSE는 마지막 값의 평균을 예측하는 것입니다 (이 경우 0).
목표 값 Y와 예측 된 목표 값 Y_hat을 플로팅하여 네트워크가 무엇을 학습하는지 확인하는 것이 좋습니다. 도움이 되었기를 바랍니다!
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다