240510 TIL #395 AI Tech #10 피처 엔지니어링 - 2

김춘복·2024년 5월 10일
0

TIL : Today I Learned

목록 보기
395/543
post-custom-banner

Today I Learned

피처엔지니어링 이어서 수강!


Feature Engineering(cont'd)

1. Pandas GroupBy cumsum

원본 데이터에서 주어진 Feature에 고객ID, 상품ID, 주문ID 기반으로 Pandas GroupBy 누적합(cumsum) 함수를 이용해 새로운 feature 생성

  • 누적합 cumsum() 을 이용하면 시계열 데이터나 누적 집계가 필요한 경우 유용하게 사용할 수 있다.

  • 고객ID 기반으로 cumsum()을 이용하면 해당 고객이 주문한 금액이 계속 누적되는 방식으로 새로운 feature를 생성하는 방식이다.

  • 모델에서는 상품id기준 구매 개수 누적합의 max(cumsum_quantity_by_prod_id-max)가 명확하게 분포가 다르다. quantity대신 total을 써도 잘 나온다.

예시

  • 고객 구매 데이터
customer_id  order_date  price
0            1   2022-01-01   10
1            1   2022-01-15   20
2            2   2022-02-01   15
3            1   2022-03-01   25
4            2   2022-03-15   30
  • 코드
import pandas as pd

data = data.sort_values(by=['customer_id', 'order_date'])
data['cumulative_purchase'] = data.groupby('customer_id')['price'].cumsum()
  • 결과
customer_id  order_date  price  cumulative_purchase
0            1   2022-01-01   10                  10
1            1   2022-01-15   20                  30  
3            1   2022-03-01   25                  55
2            2   2022-02-01   15                  15
4            2   2022-03-15   30                  45

2. 주문, 상품 데이터를 활용

  • nunique()
    pandas의 함수로 고유 값(unique value)의 개수를 계산하는 데 사용된다.
    df['열 이름'].nunique()으로 사용 시 해당 컬럼의 고유값을 알려준다.
    df.nunique()으로 지정하지 않으면 컬럼별로 고유값을 알려준다.
    groupby와 함께 사용하면 그룹별 고유값 개수를 구할 수도 있다.

  • 모델에서는 order_id-nunique, product_id-nunique 정도를 사용할 수 있다.

    예시

import pandas as pd

data = {'Name': ['Alice', 'Bob', 'Charlie', 'Alice', 'Bob'], 
        'Age': [25, 30, 35, 25, 40]}

df = pd.DataFrame(data)
print(df['Name'].nunique()) # 결과 : 3
print(df.nunique())
'''
Name    3
Age     4
dtype: int64
'''

3. Time Series 특성을 활용

  • 고객ID를 기준으로 고객이 가장 많은 구매를 한 month나 year_month를 구하는 방법
    이 값들은 범주형 데이터가 된다.
df = data.copy()

df['month'] = df['order_date'].dt.month
df['year_month'] = df['order_date'].dt.strftime('%Y-&m')

# train label로 사용할 연월
year_month = '2011-11'
# 2011-11 label 데이터 생성
df_label = generate_label(df, year_month)[['customer_id','year_month','label'] ]
# 2011-10까지의 데이터를 feature로 사용
df = df[df['order_date'] < year_month]

cols = ['month', 'year_month']

# customer id 기준으로 pandas group by 후 aggregation feature 생성
# pandas group by에서 mode 함수를 지원하지 않으므로 람다 사용
df_agg = df.groupby(['customer_id']) [cols].agg([lambda x:x.value_counts().index[0]])

# 사용하기 편하도록 group by aggregation feature 명 변경
df_agg.columns = ['month-mode', 'year_month-mode']

# label 데이터와 feature merge
df_all =df_label.merge(df_agg, on=['customer_id'], how='left')
df_all.head(10)
  • diff()
    pandas의 함수로 시계열 데이터나 정렬된 데이터에서 연속된 값들 사이의 차이를 계산하는 함수
    연속 데이터 간의 변화량을 파악하는 데 유용하다.

  • 고객 ID별로 그룹화 후 order_ts, quantity, price 컬럼에 diff()를 적용하면 동일 고객의 주문 시간 사이의 간격, 동일 고객의 연속 주문 간 수량 변화, 가격변화를 볼 수 있다.
    시간에 따른 고객 거래 패턴의 변화를 나타내는 중요한 피처가 될 수 있다.


본 포스트의 학습 내용은 부스트클래스 <AI 엔지니어 기초 다지기 : 부스트캠프 AI Tech 준비과정> 강의 내용을 바탕으로 작성되었습니다.

profile
Backend Dev / Data Engineer
post-custom-banner

0개의 댓글