본문 바로가기
AI/AI 부트캠프

[AI 부트캠프] DAY 77 - 딥러닝 프로젝트 2

by HOHHOH 2023. 11. 9.

[오늘의 일지]

딥러닝 프로젝트 - EDA와 Feature Engineering

[상세 내용]

EDA

데이터 파악

- 일단 데이터에 존재하는 주식의 종목의 수를 알아보았습니다. 그리고 하나의 주식에 대한 정보를 파악해 보았습니다. 주식의 종목의 수는 stock_id라는 피처를 중복을 제외시킨 뒤에 개수를 파악해 보니 총 200개의 종목이 있었습니다. 그리고 선택한 하나의 종목에서 시간을 반복해서 나타내는 피처인 seconds_in_bucket의 0초일 때를 파악해서 총 481일의 데이터 자료라는 것도 파악을 했습니다. 그리고 seconds_in_bucket이 주식시장의 마감 10분 전의 10초 단위의 데이터라는 것을 통해서 총 9분을 540초로 바꾸고 10초 단위씩 55단계의 상황을 보여주는 자료라는 것도 파악이 되었습니다. 정리해 보자면 주식의 종목의 수는 총 200개이고 각 주식은 481일간의 데이터를 가지고 있으며 하루의 기록되는 데이터는 0초부터 540초까지의 55단계를 분리해서 거친 데이터를 가지고 있었습니다. 그렇게 총데이터를 파악해 보면 200*55*481인데 계산을 해보면 5291000이라는 값이 나옵니다. 이 값과 총데이터의 값인 5237980을 비교해 보면 대충 누락된 값을 제외하면 어느 정도 맞는 수치라는 것을 파악했습니다.

train.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5237980 entries, 0 to 5237979
Data columns (total 17 columns):
 #   Column                   Dtype  
---  ------                   -----  
 0   stock_id                 int64  
 1   date_id                  int64  
 2   seconds_in_bucket        int64  
 3   imbalance_size           float64
 4   imbalance_buy_sell_flag  int64  
 5   reference_price          float64
 6   matched_size             float64
 7   far_price                float64
 8   near_price               float64
 9   bid_price                float64
 10  bid_size                 float64
 11  ask_price                float64
 12  ask_size                 float64
 13  wap                      float64
 14  target                   float64
 15  time_id                  int64  
 16  row_id                   object 
dtypes: float64(11), int64(5), object(1)
memory usage: 679.4+ MB

# stock_id로 주식종목수 알아내기
len(set(train['stock_id']))

# 하나의 종목 선정해서 기간 알아내기
train[(train['stock_id'] == 0) & (train['seconds_in_bucket'] == 540)]

 

시계열 가능성

- 위에서 나온 정보를 이용해 보면 하루동안 나와있는 9분간의 기록은 당연히 시계열 데이터라고 할 수 있습니다. 하지만 target의 값이 10초마다 계속 산정되는 것과 다음날이 되면 다시 초기화가 돼서 시작하는 것 때문에 저렇게 수많은 자료들을 시계열로 분리해서 보기에는 비효율적이라는 판단을 내렸습니다. 그래서 캐글의 코드 공유 링크를 보면 대부분이 머신러닝을 기반으로 학습을 시키고 있는 것을 알게 되었습니다.

 

Feature Engineering

target을 위한 피처 만들기- 일단 target의 계산식에 대한 정보를 파악하는 것이 중요한데 주어진 데이터의 피처에서는 target을 구하는 값이 WAP 피처가 유일했습니다. 따지고 보면 WAP를 구하는 식도 중요하다는 정보를 알 수 있었습니다. 그리고 결과적으로 학습은 모델이 스스로 피처의 값을 보고 하는 것이기 때문에 관련 피처들을 만들어 주는 것이 중요하다고 판단을 내렸습니다. 그래서 shift 함수를 이용해서 시점 t가 존재할 때 target을 구하는 식에 존재하는 t+60의 피처를 같은 행에 만들어 주었습니다.

def add_historic_features(df, cols, shifts=6, add_first=True):
    for col in cols:
        grouped_vals = df[["stock_id", "date_id", col]].groupby(["stock_id","date_id"])
        fill_value = df[col].mean()

        for shift in np.arange(shifts):
#             print(type(grouped_vals.shift(shift+1)), grouped_vals.shift(shift+1))
            df[col+"_shift"+str(shift+1)] = grouped_vals.shift(shift+1).fillna(fill_value)

        if add_first:
            df = df.merge(grouped_vals.first().reset_index(), on=["date_id","stock_id"], suffixes=["","_first"])
    return df

 

[마무리]

 어제 처음 시작했을 때는 너무 생소한 피처들이 나와서 파악하는데 어려움이 있었지만 자세하게 데이터를 살펴보니 여러 가지 파악할 수 있는 부분이 많았습니다. 참고로 Feature Engineering과 관련된 함수들은 캐글에 올라와 있는 코드들을 참고했습니다. 그리고 딥러닝 모델의 특성상  Feature Engineering이 머신러닝 모델에 비해서 단순한 경향은 있기 때문에 리더보드에서 좋은 점수를 받고 있는 머신러닝 모델의 방법도 따로 공부해 보는 것도 좋을 거 같다고 생각했습니다.

반응형

댓글