2021. 2. 26. 23:41ㆍData Science/04_Competition(Kaggle, Dacon)
태양광 발전량 예측 AI 경진대회_Dacon(2/3부)
: 지난 포스팅에서는 태양광 발전량 예측 AI 경진대회 문제와 데이터에 대해 소개를 함
: 이번 포스팅에서는 모델의 설명력과 성능을 가장 향상시켜 줬던 변수(처리방법 포함)와 모델을 공유하고자 함
태양광 발전량 예측 AI 경진대회_Dacon(1/3부)_ 대회 및 데이터 소개
태양광 발전량 예측 AI 경진대회_Dacon(1/3부)
태양광 발전량 예측 AI 경진대회_Dacon(1/3부) : 시계열 데이터 분석을 공부하면서 배운 내용을 실제로 활용해 보기 위해 해당 competition에 참가하게 됨 : 분석 주제는 지역의 기상 데이터와 과거 발
today-1.tistory.com
대회 소개(링크)
dacon.io/competitions/official/235680/overview/
태양광 발전량 예측 AI 경진대회
출처 : DACON - Data Science Competition
dacon.io
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
Auto ML PyCaret을 활용한 Kaggle 문제 풀기
Auto ML PyCaret 평소 Auto ML에 관심만 있었지 실제로 사용해보지 못했는데 연휴 동안 살펴보면서 Auto ML 패키지 중 접근성이 좋은 PyCaret을 소개해보고자 한다. pycaret.org/ Home - PyCaret Data Preparation..
today-1.tistory.com
: 이런 다양한 모델들로 부터 가장 성능이 좋은 모델을 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
sklearn.multioutput.MultiOutputRegressor — scikit-learn 0.24.1 documentation
scikit-learn.org
: 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 |