[TIL] 22.11.09

문종현·2022년 11월 9일
0

TIL

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

👉 오늘 한 일

  • house price 이어서

house price

feature scaling

💡변수 스케일링

  • 피처의 범위를 조정해 정규화하는 것
  • 일반적으로 분산과 표준편차를 조정해 정규분포 형태를 띄게 하는 것이 목표
  • 피처의 범위가 다르면 서로 비교하기 힘들고 일부 모델에서는 제대로 작동하지 않음
  • 트리 알고리즘에서는 절대적인 값보다 상대적인 값에 영향을 받기 때문에 스케일링에 영향을 크게 받지 않습니다. 하지만 다른 알고리즘에서는 스케일링 값을 조정해 주면 모델의 성능이 좋아짐
  1. Standardization(z-score scaling)
  • StandardScaler()

  • 평균을 제거하고(빼주고) 데이터를 단위분산에 맞게 조정

    • (XX.mean)std\frac{(X - X.mean)}{std}
  • 표준편차가 1이고 0을 중심으로 하는 표준정규분포를 가지게 됨

  • 변수가 왜곡되거나 이상치가 있으면 좁은 범위의 관측치를 압축해 예측력을 손상시킴(평균으로 계산하기 때문에 이상치에 크게 영향 받음)

  1. Normalization(Min-Max scaling)
  • 피처를 지정된 범위로 확장해 변환. 기본값은 [0,1]임

    • (XX.min)(X.maxX.min)\frac{(X - X.min)}{(X.max - X.min)}
  • 마찬가지로, 변수가 왜곡되거나 이상치가 있으면 좁은 범위의 관측치를 압축해 예측력을 손상시킴(이상치가 있으면 범위 선정에 크게 영향받음)

  1. Robust scaling
  • 중앙값을 제거하고(빼주고) 분위수 범위(기본값은 IQR임)에 따라 데이터 크기 조정

    • (XX.median)IQR\frac{(X - X.median)}{IQR}
  • 편향된 변수에 대한 변환 후 변수의 분산을 더 잘 보존함. 이상치 제거에 효과적(앞의 두 스케일러에 비해 이상치 영향을 덜 받음)

💡그 외 sklearn 스케일러

1) MaxAbsScaler()

  • 각 특성의 절대값이 0 과 1 사이가 되도록 스케일링.
  • 즉, 모든 값은 -1 과 1 사이로 표현되며, 데이터가 양수일 경우 MinMaxScaler 와 같음.
  • 이상치에 매우 민감함.

2) Normalizer()

  • 앞의 4가지 스케일러는 각 피처(열)의 통계치를 이용하여 진행됨
  • 그러나 Normalizer 의 경우 각 샘플(행)마다 적용되는 방식임.
  • 이는 한 행의 모든 특성들 사이의 유클리드 거리(L2 norm)가 1이 되도록 스케일링함.
  • 일반적인 데이터 전처리의 상황에서 사용되는 것이 아니라 모델(특히나 딥러닝) 내 학습 벡터에 적용함
  • 특히나 피쳐들이 다른 단위(키, 나이, 소득 등)라면 더더욱 사용하지 않음.

💡파이썬 권장 convention은 import할 때 하나씩 불러오는 것

# 이렇게 하면 편하지만
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler

# 이게 권장 방법
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import RobustScaler

💡스케일러 적용

  • 스케일러의 fit에는 matrix를 넣어주어야 하기 때문에 Series가 아닌 DataFrame 으로 넣어줌

    • 반환값도 matrix 형태이기 때문에 새로운 파생변수를 만들고자 한다면 데이터프레임 형태로 파생변수를 만들어줌
  • 사이킷런의 다른 기능에서는 fit => predict 를 했었지만 전처리에서는 fit => transform을 사용

    • e.g.
ss = StandardScaler()
train[["SalePrice_ss"]] = ss.fit(train[["SalePrice"]]).transform(train[["SalePrice"]])

# 같은 컬럼을 fit하고 변환한다면 이런 방법도 가능
train[["SalePrice_ss"]] = ss.fit_transfrom(train[["SalePrice"]])
  • 기준을 train으로 정하기 위해 fit() 은 test 에 사용하지 않음. test에는 transform()만 사용

    • 마찬가지로 fit_transform()은 train에만 사용. test에는 transform() 사용
  • normal_scaler.inverse_transform() 사용해서 원래 값으로 복원도 가능

  • 스케일링할 때, 모든 특성의 범위를 유사하게 만드는 것은 중요하지만, 그렇다고 모두 같은 분포로 만들 필요는 없음.

    • 특성에 따라 각기 다른 스케일링을 적용하는게 유리할 수도 있기 때문에

💡log transformation

  • feature scaling이 잘 됐어도, 아직 표준정규분포 형태가 아님(피처의 범위를 조정하지만, 분포는 그대로이기 때문)
  • 표준정규분포 형태로 만들기 위해 log transformation이 필요함
    • log 함수가 x값에 대해 상대적으로 작은 스케일에서는 키우고, 큰 스케일에서는 줄여주는 효과가 있기 때문
  • feature scaling 이전에 log transformation 진행

log1p()를 취했을 때 여전히 0보다 작다면 함수에서 알아서 결측치로 처리하고 진행함(warning message 출력)

💡이산화(discretisation)

  • 수치형 변수를 일정 기준으로 나누어 그룹화
  • 머신러닝 알고리즘에 힌트를 줄 수 있고, 너무 세분화된 조건으로 오버피팅 되지 않도록 도와줌
  1. equal width binning
  • pd.cut()
  • 범위를 기준으로 나눔 : 히스토그램에서 bins를 N개 설정한 것과 같음
  • e.g. 고객을 구매 금액 구간에 따라 나눌 때, 절대평가, 히스토그램
  • 가능한 값의 범위를 동일한 너비의 N개의 bins로 나눔
  • 편향된 분포에 민감
  1. eqal frequency binning
  • pd.qcut()
  • 빈도를 기준으로 나눔 : 데이터를 비슷한 비율로 나눠줌
  • e.g. 고객의 수를 기준으로 등급을 나눌 때, 상대평가
  • 변수의 가능한 값 범위를 N개의 bins로 나눔. 여기서 각 bins은 동일한 양의 관측값 전달
  • 알고리즘 성능을 높이는 데 도움이 될 수 있음

💡인코딩

  • 범주형 데이터를 수치형 데이터로 변환하는 과정
  • 데이터 시각화에 유리함
  • 머신러닝 모델에 유리함
  1. Ordinal Encoding
  • pd.cat.codes
  • 해당 컬럼에 해당하는 값을 숫자 하나씩 맵핑시켜줘서 숫자로 바꿔주는 인코딩 방식
  • 숫자가 맵핑이 되기 때문에 이에 따른 순서나 연산이 가능하다는 특성도 생기게됨. 이를 원치 않는다면 원핫인코딩을 많이 사용하는 편
  1. One-Hot-Encoding
  • get_dummies
  • 해당 컬럼에 해당하는 값을 여러가지 파생변수로 만들어줘서 없으면 0 , 있으면 1로 one-hot형태로 인코딩 해주는 방식

❗ 판다스로 인코딩했을 때 문제점

  • test dataset에 대한 인코딩에서 발생함.
  • pandas.get_dummies()는 train, test 따로 인코딩함
    • 이 과정에서 생성되는 피처의 수, 종류가 다를 수 있음
    • 학습, 예측을 할 때는 피처의 수와 종류가 같아야 함
    • 판다스를 쓸 때 간단한 방법은 concat을 사용하는 것. 없는 값은 nan으로 처리
  • sklearn.preprocessing.OneHotEncoder() 는 train 데이터로만 학습해서 진행하기에 test에만 존재하는 데이터를 인코딩하지 않음.

그 외 인코딩 방식은 여기 참조
https://techblog-history-younghunjo1.tistory.com/99

💡파생 변수

  • 이미 존재하는 변수로부터 여러 방법을 이용해 새로운 변수를 만드는 것
  • 파생변수 생성으로 데이터 해석이 편리해지고 모델 성능이 올라갈 수는 있으나 역효과도 생길 수 있음

다항식 전개에 기반한 파생 변수 생성(Polynomial Expansion)

  • 주어진 다항식의 차수 값에 기반하여 파생변수를 생성

  • 머신러닝 모델은 label에 대해서 설명력이 높은 한 두가지 Feature에 의지할 때보다 여러가지 Feature에 기반할 때 성능이 더 뛰어남. 소수의 Feature에 기반하게 되면 과대적합이 일어날 확률이 높기 때문에 사용함.

  • 다항식 전개에 기반해서 파생변수를 만들게 되면 잘 구분되지 않는 피처가 좀 더 구분되게 되고, 머신러닝 모델이 여러 Feature에 기반하게 되어 안정성이 높아짐

SOTA(State-of-the-art) : 현재 최고 수준의 결과

📌오늘의 회고

  • 사실(Fact) : house price 실습을 통해 피처 엔지니어링의 다양한 기법들을 배웠다.
  • 느낌(Feeling) : 실습 시간에 소개해준 기법들 외에 피처 엔지니어링 기법의 양이 굉장히 방대해서 공부할 게 많을 것 같다.
  • 교훈(Finding) : 나중에 경진대회를 참여하게 된다면 다양한 기법들을 적용해 봐야겠다.
profile
자라나라 새싹새싹🌱
post-custom-banner

0개의 댓글