2021. 2. 26. 23:41ㆍData Science/04_Competition(Kaggle, Dacon)
태양광 발전량 예측 AI 경진대회_Dacon(2/3부)
: 지난 포스팅에서는 태양광 발전량 예측 AI 경진대회 문제와 데이터에 대해 소개를 함
: 이번 포스팅에서는 모델의 설명력과 성능을 가장 향상시켜 줬던 변수(처리방법 포함)와 모델을 공유하고자 함
태양광 발전량 예측 AI 경진대회_Dacon(1/3부)_ 대회 및 데이터 소개
대회 소개(링크)
dacon.io/competitions/official/235680/overview/
1. Data Pre-processing
: Data Pre-processing 단계에서 가장 중요했다고 생각하는 2가지에 대해 소개
1-1) 파생변수 생성
: 대회 초반 어떤 변수를 만들어서 사용해야 할지 CV를 기준으로 다양하게 실험을 진행함
: 평소 시계열 데이터 분석에 사용했언던 전처리 방식으로 Diff, Average, 기울기 등은 크게 효과가 없음
: 실제 도메인(태양광)을 공부하여 새롭게 만든 변수가 모델 성능에 가장 핵심적인 요인이 됐음
: 가장 큰 도움이 됐던 변수는 GHI로 DNI와 DHI를 합한 변수
: 이때 DNI는 태양의 천정각(Θ)을 구해 곱해야 했는데 이는 간소하게 추정하여 산정함
: 자세한 방식은 아래 코드로 설명하고자 함
GHI = DHI +DNI*cos(Θ)
def Altitude(df,train=True):
if train == True:
df = sun_check(df)
all_df = pd.DataFrame()
df.loc[(df["Hour"]==12) & (df["Minute"]==30),"Altitude"] = 69
df.loc[(df["sun_check"]==0),"Altitude"] = 0
for i in df["Day"].unique():
cc_fe = Altitude_check(df[df['Day']==i].reset_index(drop=True))
all_df = pd.concat([all_df,cc_fe],axis=0).reset_index(drop=True)
all_df['Altitude_diff'] = 90 - all_df['Altitude']
all_df.loc[all_df['Altitude_diff']==90,"Altitude_diff"]=0
all_df['GHI'] = all_df['DHI'] + (all_df['DNI'] *[cos(radians(i)) for i in all_df['Altitude_diff'].values])
return all_df
else:
df = sun_check(df)
all_df = pd.DataFrame()
df.loc[(df["Hour"]==12) & (df["Minute"]==30),"Altitude"] = 69
df.loc[(df["sun_check"]==0),"Altitude"] = 0
for i in test_df_fe["TY"].unique():
temp = test_df_fe[test_df_fe["TY"]==i].reset_index(drop=True)
for j in temp["Day"].unique():
cc_fe = Altitude_check(temp[temp['Day'] == j].reset_index(drop=True))
all_df = pd.concat([all_df,cc_fe],axis=0).reset_index(drop=True)
all_df['Altitude_diff'] = 90 - all_df['Altitude']
all_df.loc[all_df['Altitude_diff']==90,"Altitude_diff"]=0
all_df['GHI'] = all_df['DHI'] + (all_df['DNI'] *[cos(radians(i)) for i in all_df['Altitude_diff'].values])
return all_df
1-2) Input Data Reshape
: 평가 받는 Test 데이터는 7일의 실제값을 확인할 수 있음
: 그렇기 때문에 모델에 Input Data의 Shape를 다양하게 변경하여 여러 모델을 만들 수 있음
: 시계열 데이터 예측은 다른 예측 분석에 비해 상대적으로 변동성이 크기 때문에 Robust한 결과를 만들어 내기 위해 앙상블 시도
: 1개 알고리즘에 다양한 Input Shape를 가진 모델들로 앙상블을 진행
: 해당 모델들의 Pinball loss를 각각 측정해 평균값으로 CV 사용
2. Baseline Model
: 시계열 데이터 예측 모델에 가장 많이 사용하는 모델은 기존 머신러닝방법에서는 LGBM을 딥러닝에서는 LSTM을 주로 활용함
: 하지만 데이터에 따라 혹은 문제에 따라 성능이 좋은 모델이 다를 수 있기 때문에 모든 결과를 비교해서 확인해야 함
: 이런 과정을 수월하게 할 수 있는 방법으로 정형데이터는 Auto ML을 주로 사용함(아래 활용 링크 첨부)
Python Auto Ml library PyCaret
: 이런 다양한 모델들로 부터 가장 성능이 좋은 모델을 Champion Model이라 표현하기도 함
: Auto Ml과 직접 모델을 구현해 적용한 결과 내가 찾은 Champion Model은 Random Forest(Multi Output)
: 여기서 가장 핵심적인 부분은 Multi Output 구조이며 이는 성능 향상뿐만 아니라 Robust한 결과를 Inference할 수 있음
: Scikit-learn에 내장된 RF의 경우 Multi Output 학습이 가능하며 Lgbm의 경우 Multioutputregressor를 활용
Scikit-learn Multioutputregressor
scikit-learn.org/stable/modules/generated/sklearn.multioutput.MultiOutputRegressor.html
: Champion Model Random Forest의 코드는 다음과 같음
from sklearn import ensemble
N_ESTIMATORS = 1000
rf = ensemble.RandomForestRegressor(
n_estimators=N_ESTIMATORS,
criterion='mae',
max_features = 10,
random_state=42,
max_depth = 10,
verbose=True,
n_jobs=-1,
)
rf.fit(train_x, tarin_y)
: 모델 자체는 매우 단순하며 학습시간도 매우 짧음
: 모델 학습 후 분위수별 예측을 하기 위해서는 ESTIMATORS별 결과치들을 뽑아 np.percentile별 inference하면 됨
: 매우 간단하지만 실제 Public Score의 경우 단일모델로 1.8점대가 가능
: (다음편 예고) 다음 포스팅에서는 최종 제출에 사용했던 모델을 설명
'Data Science > 04_Competition(Kaggle, Dacon)' 카테고리의 다른 글
태양광 발전량 예측 AI 경진대회_Dacon(3/3부) (0) | 2021.03.06 |
---|---|
태양광 발전량 예측 AI 경진대회_Dacon(1/3부) (0) | 2021.02.24 |
M5 Forecasting_Kaggle(3/3부) (0) | 2020.07.05 |
M5 Forecasting_Kaggle (2/3부) (0) | 2020.06.24 |
M5 Forecasting_Kaggle(1/3부) (0) | 2020.05.30 |