파이썬 코드 구현 질문입니다.

조회수 687회

Python

def make_dataset(data, seq_length=480, target_delay=24, strides=5,
                 mode='train', train_mean=None, train_std=None):

    assert mode in ['train', 'val', 'test']
    if mode is not 'train':
        if train_mean is None or train_std is None:
            print('Current mode is {}'.format(mode))
            print('This mode needs mean and std of train data')
            assert False

    # 정규화
   ## 코드 시작 ##
    if mode is 'train':
        mean = train_data.mean(axis=0)        #1-1
        std = train_data.std(axis=0)          #1-1
    else: 
        mean = train_mean               #1-2
        std = train_std                 #1-2
    data = (data - mean) / std          #1-3
    ## 코드 종료 ##

    # 입력, 타겟 데이터 생성
    sequence = []
    target = []
    for index in range(len(data) - seq_length - target_delay):
        if index % strides == 0:

            ## 코드 시작 ##
            sequence.append(index - seq_length)                  #2-1
            target.append(index + seq_length + target_delay)     #2-2
            ## 코드 종료 ##

    if mode is 'train':
        print(np.array(sequence).shape, np.array(target).shape)
        return np.array(sequence), np.array(target), mean, std
    else:
        print(np.array(sequence).shape, np.array(target).shape)
        return np.array(sequence), np.array(target)

"## 코드 시작 ##"과 "## 코드 종료 ##" 사이의 부분만 작성해 주세요.

1-1 : train 모드일 때: train 디렉토리에 있는 데이터 셋(train_data)의 mean, std를 구해야 합니다. 함수를 사용할 경우 axis를 주의해 주세요.
1-2 : val 또는 test 모드일 때: train_mean, train_std를 이용합니다.
1-3 : normalize 코드를 작성해보세요. (수식은 (𝑋−𝔼(𝑋))/√Var(𝑋))
𝔼(𝑋) 는 데이터의 평균(mean), √Var(𝑋)는 데이터의 표준편차(std)입니다.

for문으로 전체 타임스텝 (range(len(data) - seq_length - target_delay))을 돌면서 인덱스(변수명 index)가 stride로 나누어 떨어질 때만 훈련 데이터 셋으로 저장을 합니다.
2-1 : stride=3 이면 index가 0, 3, 6, 9, ... 일 때만 sequence와 target에 데이터를 집어넣는 것입니다. 즉 해당 인덱스는 각 배치 데이터의 첫번째 인덱스가 됩니다. 따라서 data 변수에 해당하는 데이터를 index부터 seq_length(480시간)만큼 잘라내어 sequence에 추가합니다. 이는 곧 모델에게 전달되는 입력 데이터가 됩니다.
2-2 : data의 index부터 seq_length만큼의 떨어진 위치에서 다시 target_delay(즉 24시간) 만큼 떨어진 위치의 기온(0번째 컬럼)을 target에 추가합니다.
최종 Numpy로 변경되었을때 sequence의 shape은 (N, seq_length, 9), target의 shape은 (N,)이 되어야 합니다. N은 전체 데이터 갯수 입니다.

코드 시작과 종료 사이는 직접 작성하였습니다. 다만 위의 코드로 실행하면 결과의 sequence shape이 제대로 구현되지 않는 것 같습니다.
제대로 결과가 나오려면 ## 코드 시작 ##"과 "## 코드 종료 ## 사이를 어떻게 수정하는게 좋을지 도움 부탁드립니다. 긴 글 읽어주셔서 감사합니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • '갑'님이 이곳에도 계시는군요...그래도 '갑'님은 수고비라도 주던데요. 정영훈 2020.7.28 18:12

1 답변

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)