시계열데이터 결측값 보간

이카루스·2024년 5월 16일
0

Alone_Study

목록 보기
5/5

https://dacon.io/competitions/official/236263/overview/description
해당 대회를 심심풀이로 나가보았는데, 월간대회인데도 사람들의 열정이 넘치는 모습이 학습 욕구에 불을 지핀다.

각설하고, 초반에 17등을 했는데, 그 해당 코드에 대해서 설명해보고자 한다.

결측치 보간 및 앙상블 모델을 이용한 예측
데이터 분석 과정에서 결측치는 항상 중요한 문제로 다뤄집니다. 특히, 시계열 데이터에서는 결측치 보간(interpolation)이 매우 중요한 작업입니다. 이번 글에서는 Support Vector Regression (SVR), ARIMA, Holt-Winters 모델을 이용해 결측치를 보간하고, 다양한 머신러닝 모델을 통해 앙상블 예측을 수행하는 과정을 자세히 설명하겠습니다.

데이터 준비 및 SVR을 이용한 보간
먼저, 데이터셋을 불러오고 결측치를 보간하기 위해 Support Vector Regression (SVR)을 사용합니다. SVR은 회귀 분석을 위한 서포트 벡터 머신(SVM)의 한 형태로, 고차원 공간에서 데이터를 분석해 비선형 관계를 찾는 데 유리합니다.


import pandas as pd
from sklearn.svm import SVR

# 데이터 로드
data = pd.read_csv('your_dataset.csv')

# SVR 모델 정의
먼저, 데이터셋을 불러오고 결측치를 보간하기 위해 Support Vector Regression (SVR)을 사용합니다. SVR은 회귀 분석을 위한 서포트 벡터 머신(SVM)의 한 형태로, 고차원 공간에서 데이터를 분석해 비선형 관계를 찾는 데 유리합니다.
svr_model = SVR(kernel='rbf', C=100, gamma=0.0001)

# 결측치가 없는 데이터로 모델 학습
train_ids = data['call'][~data['Value'].isna()]
train_values = data['Value'][~data['Value'].isna()]
svr_model.fit(train_ids.values.reshape(-1, 1), train_values.values)

# 전체 데이터에 대해 예측
predicted_values = svr_model.predict(data['call'].values.reshape(-1, 1))

# 예측값을 데이터프레임에 추가
data['SVR_Interpolated'] = predicted_values
ARIMA 및 Holt-Winters 모델을 이용한 보간
SVR 외에도 시계열 분석에 많이 사용되는 ARIMA와 Holt-Winters 모델을 이용해 보간을 수행합니다.

ARIMA (AutoRegressive Integrated Moving Average): 자기회귀, 차분, 이동평균의 조합으로 시계열 데이터를 예측하는 모델입니다.
Holt-Winters 모델: 계절성이 있는 시계열 데이터를 예측하는 데 사용됩니다.

from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.holtwinters import ExponentialSmoothing

# ARIMA 모델
arima_model = SARIMAX(data['Value'].fillna(method='pad'), order=(1, 0, 1))
fitted_arima = arima_model.fit(disp=False)

# Holt-Winters 모델
hw_model = ExponentialSmoothing(data['Value'].fillna(method='pad'), trend='add')
fitted_hw = hw_model.fit()

# 예측 결과를 데이터프레임에 추가
data['ARIMA_Predicted'] = fitted_arima.predict(start=data.index[0], end=data.index[-1])
data['HW_Predicted'] = fitted_hw.fittedvalues
모델 성능 평가
모델 성능을 평가하기 위해 Root Mean Squared Error (RMSE)를 사용합니다. RMSE는 예측값과 실제값 간의 차이를 제곱하여 평균을 구하고, 다시 제곱근을 취해 오차의 크기를 나타냅니다.

from sklearn.metrics import mean_squared_error
import numpy as np

# RMSE 계산 함수
def calculate_rmse(actual, predicted):
    return np.sqrt(mean_squared_error(actual, predicted))

# 각 모델에 대한 RMSE 계산
rmse_svr = calculate_rmse(data_nonan['Value'], data_nonan['SVR_Interpolated'])
rmse_arima = calculate_rmse(data_nonan['Value'], data_nonan['ARIMA_Predicted'])
rmse_hw = calculate_rmse(data_nonan['Value'], data_nonan['HW_Predicted'])

print("SVR RMSE:", rmse_svr)
print("ARIMA RMSE:", rmse_arima)
print("Holt-Winters RMSE:", rmse_hw)
앙상블 모델을 이용한 최종 예측
여러 모델의 예측 결과를 종합하여 더 나은 예측을 수행하기 위해 앙상블 기법을 사용합니다. 각 모델의 RMSE를 기반으로 가중치를 계산하고, 가중 평균을 통해 최종 예측을 수행합니다.

# 가중치 계산 (RMSE의 역수)
weight_svr = 1 / rmse_svr
weight_arima = 1 / rmse_arima
weight_hw = 1 / rmse_hw

# 가중치 정규화
total_weight = weight_svr + weight_arima + weight_hw
normalized_weight_svr = weight_svr / total_weight
normalized_weight_arima = weight_arima / total_weight
normalized_weight_hw = weight_hw / total_weight

# 가중 평균으로 앙상블 예측 계산
weighted_predictions = (data['SVR_Interpolated'] * normalized_weight_svr +
                        data['ARIMA_Predicted'] * normalized_weight_arima +
                        data['HW_Predicted'] * normalized_weight_hw)

data['Ensemble_Predicted'] = weighted_predictions
메타 모델을 이용한 최종 앙상블 예측
마지막으로, 여러 모델의 예측 결과를 메타 모델에 입력하여 최종 예측을 수행합니다. 여기서는 릿지 회귀를 사용해 메타 모델을 구성합니다.

메타 모델을 사용하면 무엇이 좋아질까?
1. 예측 정확도의 향상
메타 모델을 사용하면 각 모델의 예측 결과를 종합하여 더 정확한 예측을 할 수 있습니다. 각 모델이 가진 장점을 최대한 활용하여 단일 모델보다 높은 예측 성능을 기대할 수 있습니다. 예를 들어, SVR, ARIMA, Holt-Winters 모델 각각의 예측값을 메타 모델이 결합함으로써, 각각의 모델이 놓친 부분을 보완하고, 전체적인 예측 정확도를 높일 수 있습니다.

2. 모델의 강건성 증대
단일 모델은 특정 패턴이나 특성에 민감할 수 있어 데이터의 변동이나 이상치에 취약할 수 있습니다. 그러나 메타 모델은 여러 모델의 예측을 종합함으로써 이러한 변동성에 더 강건하게 대처할 수 있습니다. 다양한 모델의 결합은 예측 결과의 안정성을 높여줍니다.

3. 다양한 정보의 통합
각 모델은 데이터의 다른 측면을 반영할 수 있습니다. 예를 들어, ARIMA 모델은 데이터의 시계열적 패턴을 잘 포착하는 반면, SVR 모델은 비선형적인 관계를 잘 포착할 수 있습니다. 메타 모델은 이러한 다양한 정보를 통합하여 종합적인 예측을 가능하게 합니다.

4. 성능 평가 및 해석의 용이성
메타 모델을 사용하면 각 개별 모델의 성능을 비교하고, 종합적인 예측 결과를 평가하기가 용이합니다. 이를 통해 어느 모델이 더 나은 성능을 보이는지, 어떤 조합이 더 효과적인지를 쉽게 파악할 수 있습니다. 또한, 다양한 모델의 조합을 통해 보다 신뢰할 수 있는 예측 결과를 제공할 수 있습니다.

5. 새로운 데이터에 대한 적응력 향상
메타 모델은 다양한 모델의 조합으로 구성되기 때문에 새로운 데이터가 들어오더라도 유연하게 적응할 수 있습니다. 단일 모델에 의존하지 않기 때문에 데이터의 특성이 변하더라도 더 안정적인 예측을 유지할 수 있습니다.


from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split

# 메타 모델을 위한 피처와 타겟 분리
X = data[['SVR_Interpolated', 'ARIMA_Predicted', 'HW_Predicted']]
y = data['Value']

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 릿지 회귀 모델
final_model = Ridge(alpha=1.0)
final_model.fit(X_train, y_train)

# 최종 예측 수행
final_predictions = final_model.predict(X_test)
print('Final Model RMSE:', np.sqrt(mean_squared_error(y_test, final_predictions)))
결론
이번 글에서는 SVR, ARIMA, Holt-Winters 모델을 이용해 결측치를 보간하고, 앙상블 기법과 메타 모델을 통해 최종 예측을 수행하는 방법을 설명했습니다. 각 모델의 특성과 장점을 활용해 보다 정확한 예측을 할 수 있도록 구성한 과정을 통해 데이터 분석의 중요성을 다시 한번 확인할 수 있었습니다. 이와 같은 방법론을 통해 다양한 시계열 데이터 분석에서 효과적으로 결측치를 보간하고 예측할 수 있을 것입니다.
profile
Der Schmerz, der mich nicht töten kann, macht mich nur stärker (나를 죽이지 못하는 고통은 나를 더 강하게 만든다)

0개의 댓글