[오늘의 일지]
딥러닝 프로젝트 - 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이 머신러닝 모델에 비해서 단순한 경향은 있기 때문에 리더보드에서 좋은 점수를 받고 있는 머신러닝 모델의 방법도 따로 공부해 보는 것도 좋을 거 같다고 생각했습니다.
'AI > AI 부트캠프' 카테고리의 다른 글
[AI 부트캠프] DAY 79 - 딥러닝 프로젝트 4 (0) | 2023.11.11 |
---|---|
[AI 부트캠프] DAY 78 - 딥러닝 프로젝트 3 (0) | 2023.11.10 |
[AI 부트캠프] DAY 76 - 딥러닝 프로젝트 1 (0) | 2023.11.08 |
[AI 부트캠프] DAY 64 - 머신러닝 프로젝트 8 (0) | 2023.10.21 |
[AI 부트캠프] DAY 63 - 머신러닝 프로젝트 7 (0) | 2023.10.20 |
댓글