- 개요
이 프로젝트를 하면서 다른 비슷한 내용을 글을 살펴보니 가장 먼저 하는 일은입력 변수의 빈도 분포 분석, 예측하고자 하는 변수와 입력변수끼리의 상관계수를 살펴보는 것입니다.
생각해보면 다중선형회귀라고 해도 아무튼 선형회귀라 예측하고자 하는 변수와 다른 변수와의 상관계수를 확인해보는 것이 가장 먼저 할 일이었던 것 같습니다.
이번 포스트에서는 [다중선형회귀모델 2]에서 만든 계절성을 제거한 서울기온예측 모델을 기준으로 다른 변수와의 선형상관계수를 확인합니다.
- 계절성 제거한 서울기온예측 모델의 성능
저번 포스트에서 만든 계절성을 제거한 서울기온예측 모델의 상관계수는 0.78, RMSE는 2.01이었습니다.
전 모델의 성능을 상관계수로 확인하고 있습니다만 일반적으로 Root Mean Square Error(RMSE)처럼 실제값과 예측값의 차이를 이용한 평가지표를 사용하는 경우가 더 많습니다.
하지만 RMSE를 쓰면 모델의 예측 변수가 바뀌는 경우 RMSE의 크기 또한 예측 변수의 크기가 바뀌기 때문에 모델 간 성능 비교가 어렵습니다.
전 서울기온과 계절성을 제거한 서울기온을 예측하는 모델 2개를 만들었고, 예측한 변수의 크기가 다르기에 두 모델의 RMSE로 두 모델 간 성능 비교를 할 수 있습니다. 반면, 상관계수를 이용하면 예측 변수가 바뀌어도 성능을 비교 할 수 있죠.
그럼 입력 변수, 예측 변수 간 상관계수를 그림으로 그려보죠.
"""
[서울기온예측 2]의 코드와 동일
계절성을 제거하고 예측 변수 넣기
"""
df_raw = read_ASOS108()
use_cols = ['일시', '평균기온(°C)', '일강수량(mm)', '평균 풍속(m/s)',
'평균 이슬점온도(°C)', '평균 상대습도(%)',
'평균 현지기압(hPa)', '평균 전운량(1/10)', '합계 일사량(MJ/m2)']
df_raw1 = process_cols(df_raw, use_cols)
df_raw1 = remove_seasonal_cycle(df_raw1, use_cols)
target = '평균기온(°C)_detrended'
df_raw1['Y'] = df_raw1[target].shift(-1)
df_raw1 = df_raw1.iloc[:-1]
use_cols_detrend = df_raw1.columns
use_cols_detrend = [ col for col in use_cols_detrend if col not in use_cols]
df_raw1 = df_raw1[use_cols_detrend]
"""
그림 그리는 부분
"""
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.font_manager as fm
fn_font = 'NanumGothic.ttf' # 나눔고딕 폰트 사용
fontprop = fm.FontProperties(fname=fn_font)
plt.rcParams['axes.unicode_minus'] = False
plt.rc('font', family=fontprop.get_name()) # matplotlib.pyplot을 쓸 때 이 폰트를 쓰겠다는 뜻
col_corr = df_raw1.columns.tolist()[4:]
df_corr = df_raw1[col_corr]
corr = df_corr.corr()
plt.figure(figsize=(8, 6))
sns.heatmap(corr, annot=True, cmap='coolwarm', fmt=".2f", linewidths=0.5)
plt.title("Correlation Heatmap")
plt.show()
위는 상관계수 그림입니다.
지금 우리가 예측하고자 하는 변수 이름은 'Y'이므로 'Y'가 들어간 행(가장 아래쪽 행)이나 열(가장 오른쪽 열)을 봐주세요.
가장 상관계수의 절대값이 높은 입력 변수 3개는 평균기온, 평균 이슬점온도, 평균 풍속으로 각각 상관계수는 0.73, 0.50, -0.37입니다. 만약 위의 나온 입력 변수 하나씩만 써서 선형회귀모델을 만든다면 각각 모델의 상관계수는 위의 상관계수와 같겠죠.
다중선형호귀 모델의 상관계수는 0.78이었으니까 하나의 입력 자료를 쓰는 것보단 성능이 잘나오네요.
- 평균기온, 평균 이슬점온도, 평균 풍속만 써서 모델 만들기
그럼 마지막으로 상관계수가 가장 높게 나온 세가지 변수만 입력 변수로 써서 다중회귀모델을 만들면 어떨까요?
df_raw = read_ASOS108()
use_cols = ['일시', '평균기온(°C)', '평균 풍속(m/s)',
'평균 이슬점온도(°C)']
df_raw1 = process_cols(df_raw, use_cols)
df_raw1 = remove_seasonal_cycle(df_raw1, use_cols)
target = '평균기온(°C)_detrended'
df_raw1['Y'] = df_raw1[target].shift(-1)
df_raw1 = df_raw1.iloc[:-1]
use_cols_detrend = df_raw1.columns
use_cols_detrend = [ col for col in use_cols_detrend if col not in use_cols]
df_raw1 = df_raw1[use_cols_detrend]
train_X, train_y, test_X, test_y, datetime = split_data(df_raw1, '2022-01-01')
predictions, rmse, corr = do_prediction(train_X, train_y, test_X, test_y)
print(corr, rmse)
코드를 수정하여 확인해보니 상관계수는 0.77 RMSE는 2.10이 나옵니다.
저번 모델의 상관계수는 0.78, RMSE는 2.01으로 3가지 입력 변수만 쓴 모델의 성능이 아주 조금 떨어집니다.
선형회귀모델이 아닌 인공지능 알고리즘 기반의 예측 모델을 만들 때는 선형상관계수가 높은 입력 변수만 따로 추출해서 쓰기도 합니다.
- 결론 및 다음 방향
선형회귀모델 말고 기계학습을 사용해서 모델을 만들어보자.
'프로젝트 > 기계학습 기반 서울 기온 예측' 카테고리의 다른 글
[서울기온예측][XGboost 2] 서울 ASOS 자료 기반 기온 예측 (0) | 2025.02.25 |
---|---|
[서울기온예측][XGboost 1] 의사결정나무, XGboost란? (0) | 2025.02.20 |
[서울기온예측][다중선형회귀모델 2] 코드 함수화, 서울 ASOS 자료의 계절성 제거 (0) | 2025.02.11 |
[서울기온예측][다중선형회귀모델 1] 서울 ASOS 자료만 사용한 기온 예측 (0) | 2025.02.10 |
[서울기온예측] 프롤로그 (1) | 2025.02.06 |