Feature engineering

juyeon·2022년 8월 9일
0

데이터 다루기

목록 보기
1/35
post-custom-banner

Why Feature engineering?

: 도메인 지식을 이용해 원자료를 가공하여 특징을 추출하는 작업
: 분석을 위해서는 먼저 데이터를 전처리 해야한다.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

NaN 처리

  • NaN(Not a number) 혹은 NA(Not available)

Where?

  • df.isnull().sum() 혹은 df.isna().sum(): 각 열마다 NaN이 몇개인가?

1. 아예 제거하기

  • df.dropna(axis = 1): NaN이 있는 행 또는 열 제거
    • axis = 1: 열 제거, axis = 0: 행 제거.
    • 분석단위 하나하나 제거가 열 하나를 통채로 삭제하는 것보다 덜 극단적이므로, 이왕이면 axis = 0으로 하자
    • 제거된 행에 대해서는 그 index가 사라진 채로 나머지는 그대로.

2. 대체하기

  • df.fillna()
    • 단일 값으로 대체하기: values = {'Score': 3, 'Price': 10}, df.fillna(value=values)
    • 앞/뒤 값으로 대체하기: df.fillna(method=ffill)
      • method = ffill: 이전 데이터로, bfill 이후 데이터로 대체하기
  • df.interpolate(method = 'linear'): 이전&이후 값의 중간값으로 대체하기

3. 분리하기

Dummy Variable화(가변수화)

: 범주형 변수를 더미변수로 만들기

원-핫 인코딩

: 만약, 범주형을 단순히 숫자로 변환한다면 머신러닝은 이를 사칙연산의 의미를 가진 것으로 해석할 수 있음. 그러므로 이진 변환 해야함

  • 예:
    : 삼성, 엘지, 레노버

    • 단순히 1, 2, 3 으로 변환하면, 만약 레노버가 3일때 삼성이 1이라면, 레노버가 삼성의 3배 만큼의 의미를 지니는가 하면? 아님.
    • 자기자신은 1, 다른건 0으로 인코딩.
      삼성엘지레노버
      100
      010
      001
  • pd.get_dummies(변수명, prefix = 'A', drop_first=True): 가변수화

    • prefix: 변수 이름에 접두어를 뭘로 할래?
    • drop_first = True: 자유도 개념을 생각해보자. n-1개가 선택되면, 1개는 자연스럽게 결정된다. 여튼 다중공선성 문제로, 우리는 가변수화 하고 난 뒤 변수를 덧붙일때 하나를 빼줄 것이다.
    • 가변수화한걸 따로 변수로 저장한 다음에, 이를 concat으로 원본에 덧붙이자
  • data = pd.get_dummies(data, columns=['변수명'], drop_first=True)
    : 변수로 저장한 다음 concat으로 합친 후 기존 column은 삭제할 필요 없이, 바로 원본 데이터에 column이 추가되고, 가변수화에 쓰인 column은 삭제됨

Data Split

  • 사이킷런
  • trian set과 test set의 분리
from sklearn.model_selection import train_test_split

Scailing

MinMaxScaler

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()

train_x = scaler.fit_transform(train_x)
test_x = scaler.transform(test_x)

# 학습시키면 다 넘파이 배열로 바뀌기 때문에, 이를 df화 해서 봐야함
pd.DataFrame(train_x).describe() 

StandardScaler

그 외

  • pd.to_datetime(): 앞서 이야기함.
profile
내 인생의 주연
post-custom-banner

0개의 댓글