태양광 발전량 예측 AI 경진대회_Dacon(2/3부)

2021. 2. 26. 23:41Data Science/04_Competition(Kaggle, Dacon)

반응형

 

태양광 발전량 예측 AI 경진대회_Dacon(2/3부)

 

: 지난 포스팅에서는 태양광 발전량 예측 AI 경진대회 문제데이터에 대해 소개를 함

: 이번 포스팅에서는 모델의 설명력과 성능을 가장 향상시켜 줬던 변수(처리방법 포함)모델공유하고자 함

 

 

태양광 발전량 예측 AI 경진대회_Dacon(1/3부)_ 대회 및 데이터 소개

today-1.tistory.com/40

 

태양광 발전량 예측 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, 기울기 등은 크게 효과가 없음

: 실제 도메인(태양광)을 공부하여 새롭게 만든 변수가 모델 성능에 가장 핵심적인 요인이 됐음

: 가장 큰 도움이 됐던 변수는 GHIDNI와 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 DataShape를 다양하게 변경하여 여러 모델을 만들 수 있음

: 시계열 데이터 예측은 다른 예측 분석에 비해 상대적으로 변동성이 크기 때문에 Robust한 결과를 만들어 내기 위해 앙상블 시도

: 1개 알고리즘에 다양한 Input Shape를 가진 모델들로 앙상블을 진행

: 해당 모델들의 Pinball loss를 각각 측정해 평균값으로 CV 사용

 


Input data reshape modeling


 

 

2. Baseline Model

 

: 시계열 데이터 예측 모델에 가장 많이 사용하는 모델은 기존 머신러닝방법에서는 LGBM딥러닝에서는 LSTM을 주로 활용함

: 하지만 데이터에 따라 혹은 문제에 따라 성능이 좋은 모델이 다를 수 있기 때문에 모든 결과를 비교해서 확인해야 함

: 이런 과정을 수월하게 할 수 있는 방법으로 정형데이터는 Auto ML을 주로 사용함(아래 활용 링크 첨부)

 

Python Auto Ml library PyCaret

today-1.tistory.com/17

 

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 ModelRandom 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점대가 가능

 

 

: (다음편 예고) 다음 포스팅에서는 최종 제출에 사용했던 모델을 설명

 

반응형