M5 Forecasting_Kaggle(3/3부)

2020. 7. 5. 20:27Data Science/04_Competition(Kaggle, Dacon)

반응형
M5 Forecasting 대회 종료

 

1) 대회 결과

 

M5 성적

 

: 상위 5% 이내 목표를 세웠지만 결과는 참담했다.

: 1,946위로 상위 16%에 해당하는 성적으로 마무리, 쉐이크업으로 인해 성적이 1,787등이나 내렸갔다.

: 아직 공부할게 많이 남아있다는 것에 위안 삼으며 이번 대회를 마무리 짓고자 한다.

 

 

2) LSTM 모델 코드

 

: 내가 초기 M5에 사용했었던 LSTM 모델 코드(pytorch)는 다음과 같다.

: Many to Many, Bidirectional 을 사용

: 초기 모델은 연산량이 많았던 모델이였기 때문에 학습 시간이 많이 소요됨

: 임베딩층을 쓰지 않고 hidden layers 개수를 줄여도 성능의 큰 차이는 없다.

 

class TimeDistributed(nn.Module):

    def __init__(self, module, batch_first=False):
        super(TimeDistributed, self).__init__()

        self.module = module

        self.batch_first = batch_first

 

    def forward(self, x):

 

        if len(x.size()) <= 2:

        return self.module(x)

 

    x_reshape = x.contiguous().view(-1, x.size(-1))

 

    y = self.module(x_reshape)

 

    if self.batch_first:

        y = y.contiguous().view(x.size(0), -1, y.size(-1)) # (samples, timesteps, output_size)

    else:

        y = y.view(-1, x.size(1), y.size(-1)) # (timesteps, samples, output_size)

 

    return y

 

    class LSTM(nn.Module):

    def __init__(self, input_size=3053, hidden_layer_size=512, output_size=28,layers=2):

        super().__init__()

        self.hidden_layer_size = hidden_layer_size

        self.lstm = nn.LSTM(input_size, hidden_layer_size, dropout=0.3, num_layers=layers, bidirectional=True, batch_first=True)

        self.linear1 = TimeDistributed(nn.Linear(hidden_layer_size*2, 2048))

        self.linear2 = TimeDistributed(nn.Linear(2048, 1024))

        self.linear3 = TimeDistributed(nn.Linear(1024, 512))

        self.linear4 = TimeDistributed(nn.Linear(512, 256))

        self.linear5 = TimeDistributed(nn.Linear(256, 128))

        self.linear6 = TimeDistributed(nn.Linear(128, 64))

        self.linear7 = TimeDistributed(nn.Linear(64, 1))

 

        self.hidden_cell = (torch.zeros(1,1,self.hidden_layer_size),

        torch.zeros(1,1,self.hidden_layer_size))

 

    def forward(self, input_seq):

 

        lstm_out, self.hidden_cell = self.lstm(input_seq)

        # (batchsize, timestamp, hiddensize) 그대로 받기

        linear1_out = self.linear1(lstm_out)

        linear2_out = self.linear2(linear1_out)

        linear3_out = self.linear3(linear2_out)

        linear4_out = self.linear4(linear3_out)

        linear5_out = self.linear5(linear4_out)

        linear6_out = self.linear6(linear5_out)

        predictions = self.linear7(linear6_out)

        predictions = predictions.view(-1,28)

 

    return predictions

 

 

3) 내부 실험 결과

 

: LSTM 모델은 초기 학습에도 좋은 성능(Public score)을 나타냄

: 바닐라 모형 뿐만 아니라, 나중에 적용한 Seq2Seq 모델 또한 성능은 비슷했음

: Attention을 적용해봤지만 좋은 성능을 가져오지 못함

 

초기 모델 성능 평가(기록)

 

 

4) 아쉬운 점

 

: Transfomer Model을 구현해보지 못한 점

: 입력 데이터를 임베딩 혹은 2D Convnet에 태워보지 못한 점(나중에 꼭 실험해봐야함, FB DERT Model 참고하기)

: 메달 따지 못함점

 

반응형