코로나 19 확진자 수 예측
코로나 19 확진자 수를 예측하기 위해 이전 며칠 동안의 확진자 수 추이를 활용하는 방법을 살펴볼 것이다. 이를 위해 3일 동안의 확진자 수 데이터를 사용하고, 순환 신경망(RNN) 모델을 구축하여 다음 날의 확진자 수를 예측하는 모델을 만들 것이다.
환경 설정 및 데이터 로드
먼저 필요한 모듈을 불러오고 코로나 데이터를 다운로드하고 로드한다.
# 필요한 모듈 불러오기
from keras.models import Sequential
from keras.layers import SimpleRNN, Dense
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
import math
import numpy as np
import matplotlib.pyplot as plt
from pandas import read_csv
# 코로나 데이터 다운로드 및 로드
!git clone https://github.com/yhlee1627/deeplearning.git
dataframe = read_csv('/content/deeplearning/corona_daily.csv', usecols=[3], engine='python', skipfooter=3)
dataset = dataframe.values
dataset = dataset.astype('float32')
코로나 데이터는 깃허브에 올라와 있는 자료를 사용하였다.
데이터 전처리
데이터를 불러온 후, 데이터를 정규화합니다. 이를 위해 사이킷런 의 MinMaxScaler 함수를 사용하며, 데이터 정규화 범위는 0에서 1 사이로 설정한다.
# 데이터 전처리
scaler = MinMaxScaler(feature_range=(0, 1))
Dataset = scaler.fit_transform(dataset)
# 데이터 분할
train_data, test_data = train_test_split(Dataset, test_size=0.2, shuffle=False)
print(len(train_data), len(test_data))
# 89 23
입력 데이터 생성
입력 데이터를 생성하기 위해, 이전 며칠 동안의 확진자 수 추이를 기반으로 학습 데이터와 테스트 데이터를 생성한다.
# 입력 데이터 생성
look_back = 3
x_train, y_train = create_dataset(train_data, look_back)
x_test, y_test = create_dataset(test_data, look_back)
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
모델 생성 및 학습
모델을 생성하고 학습합니다. 여기서는 SimpleRNN 레이어를 사용한 모델을 구성한다.
# 모델 생성
model = Sequential()
model.add(SimpleRNN(3, input_shape=(1, look_back)))
model.add(Dense(1, activation="linear"))
model.compile(loss='mse', optimizer='adam')
model.summary()
# 데이터 형태 변경
x_train = x_train.reshape(x_train.shape[0], 1, look_back)
x_test = x_test.reshape(x_test.shape[0], 1, look_back)
# 모델 학습
model.fit(x_train, y_train, epochs=100, batch_size=1, verbose=1)
학습 결과
학습된 모델을 통해 예측을 수행하고 결과를 분석합니다. 이를 위해 RMSE (Root Mean Squared Error)를 계산하여 모델의 성능을 평가한다.
# 모델을 사용하여 학습 데이터에 대한 예측을 수행합니다.
trainPredict = model.predict(x_train)
testPredict = model.predict(x_test)
# 모델의 예측 결과는 정규화된 값이므로, 이를 다시 역변환하여 원래의 데이터 단위로 변환합니다.
TrainPredict = scaler.inverse_transform(trainPredict)
Y_train = scaler.inverse_transform([y_train])
TestPredict = scaler.inverse_transform(testPredict)
Y_test = scaler.inverse_transform([y_test])
# 학습 데이터와 테스트 데이터의 예측 결과를 기반으로 RMSE를 계산하여 모델의 성능을 평가합니다.
trainScore = math.sqrt(mean_squared_error(Y_train[0], TrainPredict[:,0]))
print('Train Score: %.2f RMSE' % (trainScore))
testScore = math.sqrt(mean_squared_error(Y_test[0], TestPredict[:,0]))
print('Test Score: %.2f RMSE' % (testScore))
이 코드는 모델의 예측 결과를 역변환하여 원래의 데이터 단위로 되돌리고, RMSE를 계산하여 모델의 학습 및 테스트 성능을 평가하는 부분이다.
시각화
# trainPredict 및 testPredict의 크기 확인
print("TrainPredict shape:", TrainPredict.shape)
print("TestPredict shape:", TestPredict.shape)
# trainPredictPlot 및 testPredictPlot 배열 초기화
trainPredictPlot = np.empty_like(dataset)
trainPredictPlot[:, :] = np.nan
testPredictPlot = np.empty_like(dataset)
testPredictPlot[:, :] = np.nan
# trainPredict 및 testPredict 배열을 trainPredictPlot 및 testPredictPlot에 복사
trainPredictPlot[look_back:len(TrainPredict)+look_back, :] = TrainPredict
# TestPredict 배열을 testPredictPlot에 복사할 때 크기를 조정하여 복사
testPredictPlot[len(TrainPredict)+(look_back+1)*2:len(TrainPredict)+(look_back+1)*2+len(TestPredict), :] = TestPredict
# 결과 시각화
plt.plot(dataset)
plt.plot(trainPredictPlot)
plt.plot(testPredictPlot)
plt.show()
결론
전 며칠 동안의 확진자 수 추이를 바탕으로 다음 날의 확진자 수를 예측하는 작업에 RNN (Recurrent Neural Network) 모델을 이용하는 시간을 가졌다. 일단 수업에서 코드를 작성하며 진행하셔서 따라 타이핑 해보았지만 아직 확실하게 이해를 하지 못한 부분이 있어 추가로 RNN에 대해 찾아서 공부를 진행해야 될 것 같다.
해당 내용은 김성규 교수님의 수업을 바탕으로 정리하였습니다.