il = Input(shape = (nfeatures, ))
hl1 = Dense(10, activation = 'relu')(il)
hl2 = Dense(10, activation = 'relu')(hl1)
hl3 = Dense(2, activation = 'relu')(hl2)
ol = Dense(1)(hl3)
model = Model(inputs = il, outputs = ol)
다중 입력
모델 선언
concatenate
옆으로 붙이기, 하나의 레이어처럼 묶기
cbl = concatenate([hl1_1, hl1_2])
모델 사용
모델 예측 시, 전처리 된 두 가지 입력을 리스트로 묶어서 사용
pred = model.predict([x_val1, x_val2])
# 모델 구성
input_1 = Input(shape=(nfeatures1,), name='input_1')
input_2 = Input(shape=(nfeatures2,), name='input_2')
# 첫 번째 입력을 위한 레이어
hl1_1 = Dense(10, activation='relu')(input_1)
# 두 번째 입력을 위한 레이어
hl1_2 = Dense(20, activation='relu')(input_2)
# 두 히든레이어 결합
cbl = concatenate([hl1_1, hl1_2])
# 추가 히든레이어
hl2 = Dense(8, activation='relu')(cbl)
# 출력 레이어
output = Dense(1)(hl2)
# 모델 선언
model = Model(inputs = [input_1, input_2], outputs = output)
model.summary()
시계열 데이터
ML 기반 시계열 모델링
특정 시점 데이터들(1차원)과 예측대상시점(𝑦𝑡+1) 과의 관계로 부터 패턴을 추출하여 예측
모델 구조 예 : 𝑦𝑡+1 = 𝑤1𝑥1𝑡 + 𝑤2𝑥2𝑡+ 𝑤3𝑥3𝑡 + 𝑤4𝑦𝑡 + 𝑤0
시간의 흐름을 x변수로 도출하는 것이 중요.
DL 기반 시계열 모델링
시간흐름 구간(timesteps) 데이터들(2차원)과 예측대상시점(𝑦𝑡+1) 과의 관계로 부터 패턴 추출
어느정도 구간(timesteps)을 하나의 단위로 정할 것인가?
분석 단위를 2차원으로 만드는 전처리 필요. ➔ 데이터셋은 3차원
잔차 분석
잔차(Residuals) = 실제 데이터 – 예측값
시계열 모델 𝑦 = 𝑓(𝑥) + 𝜀
모델이 잘 만들어 졌다면, 잔차𝜀는 White Noise에 가까워야 함.
잔차𝜀가 White Noise에 가깝지 않다면 𝑓(𝑥)는 아직 𝑦 의 패턴을 제대로 반영하지 않음. ➔ 더 해야 할 일이 남아 있음.
잔차 분석
시각화 : ACF, PACF
검정
정상성 검정(ADF Test, KPSS Test)
정규성 검정(Shapiro-wilk Test)
자기상관 검정(Ljung-Box Test)
등분산성 검정(G-Q Test)
RNN(Recurrent Neural Networks)
RNN으로 시계열 데이터 모델링 하기
✓과거의 정보를 현재에 반영해 학습하도록 설계
RNN을 위한 데이터 전처리
데이터 분할 1 : x, y
스케일링
X 스케일링은 필수
Y 값이 크다면 최적화를 위해 스케일링 필요 ➔ 단, 모델 평가 시 원래 값으로 복원
3차원 데이터셋 만들기
데이터 분할2 : train, val
SimpleRNN
노드 수 1개 ➔ 레이어의 출력 형태 : timesteps * 노드 수
return_sequences : 출력 데이터를 다음 레이어에 전달할 크기 결정 ★ ★
True : 출력 크기 그대로 전달 ➔ timesteps * node수
False : 가장 마지막(최근) hidden state 값만 전달 ➔ 1 * node 수
# target 확인
target = 'ADMIT'
# 데이터 분리
x = data.drop(target, axis=1)
y = data.loc[:, target]
# 모듈 불러오기
from sklearn.model_selection import train_test_split
# 7:3으로 분리
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1 )
# 변수 제거
drop_cols = ['Month', 'Day']
# data.drop(drop_cols, axis=1, inplace=True)
data.drop(columns = drop_cols, inplace=True)
# 확인
data.head(1)
x와 y 분리
# target 확인
target = 'Ozone'
# 데이터 분리
x = data.drop(target, axis=1)
y = data.loc[:, target]
# 모듈 불러오기
from sklearn.model_selection import train_test_split
# 7:3으로 분리
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1)
# stratify=y를 활용하면 일정한 기준으로 나뉘어진 y값으로 분리됨
# 분석에 의미 없는변수 제거
drop_cols = ['Month', 'Day']
data.drop(columns = drop_cols, inplace = True)
# 확인
data.head(1)
x, y, 분리
알아내고자 하는것 = target = 오존 농도
# target 확인
target = 'Ozone'
# 데이터 분리
x = data.drop(target, axis = 1) #( columns = target)
y = data.loc[ :, target] #data['Ozone']
머신러닝을 위한 변수 생성
# 모듈 불러오기
from sklearn.model_selection import train_test_split
# 7:3으로 분리 중요함!!!
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 1)
#random_state = n 으로 같은 random값을 준다면 같은 결과를 줌 seed와 같은 원리
#만약 회귀가 아닌 분류라면stratify = y 를 활용하여 일정한 데이터로 분리
코드를 쓰면서 response를 찍어보고 데이터 구조를 파악하길 바란다. 그리고 왜 item_ids를 리스트 컴프리헨션을
사용해 짜게 되었는지 이해하길 바란다.
url = f'https://apis.zigbang.com/v2/items/oneroom?geohash={geohash}&depositMin=0&rentMin=0&salesTypes[0]=전세&salesTypes[1]=월세&domain=zigbang&checkAnyItemWithoutFilter=true'
response = requests.get(url)
item_ids = [data['itemId'] for data in response.json()['items']]
len(item_ids), item_ids[:5]