실무에서는 전처리 시간이 80%를 차지한다고 한다. 그만큼 모델의 성능을 좌우하는 중요 작업으로 꼽힌다.
1. 모델 유형별 전처리 요구사항
A. Regression (Linear, Polimial, Rogistic, etc..)
- 값 자체가 실제 대수적 연산에 사용
이는 값들의 대소관계, 분포, 크기, 범위가 모델 성능에 직접적 영향을 미친다는 뜻이다. 그러므로 표준화, scaling 등 여러 변환 방법으로 모델의 성능을 높여야 한다. - 결측치 해결
결측치가 존재할 시에 연산과 학습이 어렵기 때문이다. 따라서 모든 값을 수치형으로 변환하고 결측치를 해결해야한다. - 특성-타겟 간 선형적 관계를 위한 전처리
선형회귀는 선형적 관계를 가정하는 알고리즘이다. 그래서 최대한 선형적 관계가 잘 보이도록 전처리를 해주는 것이 필요하다. 예를 들어 어떤 특성에 log를 씌워야 타겟-특성 간에 선형 관계가 형성된다고 판단할 경우, 그렇게 전처리를 해준다. - 특성-특성 간 독립성
특성 간에는 독립성이 유지되어야 정확한 모델링이 가능하다. 특성 간에 관계가 있을 시 하나의 특성을 삭제하는 등의 전처리가 필요하다
B. Tree Based (Decision Tree, RandomForest, GBDT 등)
- 값 자체가 연산에 사용되지는 않음
매 단계에 cutline을 정하여 데이터를 분할하기 때문에 값의 '크기'보다는 '대소 관계'에 영향을 받는다. 따라서 scaling 등의 전처리가 필수적이지 않다. - 결측치 해결도 필수적이지 않다
라이브러리의 구현에 따라 다르지만 결측치를 포함하는 방식으로 데이터를 분할할 수 있다. 예를 들면 '특성이 0.5 이상이거나 결측치인가요?'라고 물은 후 yes or no로 분기할 수 있다는 것이다.
물론 결측치를 처리했을 때 결과가 더 좋을수도 있고, 해결하지 않았을 때에 더 좋을 수도 있다. 이는 상황따라 다르다.
xgboost는 자동으로 결측치를 해결해준다. 하지만 우리가 주로 사용하는 sklearn에서는 결측치를 자체적으로 처리해주지는 않는다. 이럴 때는 결측치 값을 기존값 범위에 비해 굉장히 크거나 작은 값으로 채워넣어 결측치를 유지하면서도 모델을 학습시킬 수 있다. - 특성-특성 간 상호작용 반영
회귀에서는 특성 간 독립성을 확인하고 모델을 만들어야 하지만 트리 모델에서는 이런 상호작용이 자동으로 반영되기 때문에 신경쓰지 않아도 된다.
2. 결측치 처리하기
결측치를 꼭 처리하는 것만이 답은 아니다. 어떤 결측치는 그 자체로 의미를 가지고 있기 때문이다.
또, 시계열 데이터 또는 데이터 간에 모종의 관계가 있는 경우에는 앞뒤 데이터로 결측치를 채울 때도 있다.
df['col'].fillna(method = 'ffill')
# 앞의 값으로 채우기
# 앞의 값이 누락되어 있으면 계속 결측치로 남아있는다
df['col'].fillna(method = 'bfill')
# backward fill. 뒤의 값으로 채우기
df['col'].interpolate(method = 'linear')
# 어떤 데이터가 [32, nan, nan, nan, 23]일 때, 32와 23에 선을 긋고 그 선 위에 같은 간격으로 점을 세개 찍어 값을 반환한다
df['col'].interpolate(method = 'nearest')
# 어떤 데이터가 [32, nan, nan, nan, 23]일 때, 각각에서 가까운 값으로 채우고 양쪽에 값이 있으면 앞의 값을 사용해 채운다.
3. 수치형 변수 전처리
A. 값 분포의 스케일만 변화시키는 경우
① Min-Max Scaling
최솟값 최댓값을 사용해 0부터 1까지의 값으로 반환. 최솟값일 때는 0이고 최댓값일 때는 1이다. 이때 너무 크거나 작은 이상치의 영향을 받을 수가 있다.
② Stadardization
z-score 정규화. 평균이 0이고 표준편차가 1로 변환한다. 주로 쓰이는 스케일링 기법으로 이상치에 덜 민감하므로 이상치 분포를 정확히 파악할 수 없을 때 사용한다.
B. 값 분포의 스케일와 형태를 변화시키는 경우
분포의 형태를 변화시킨다는 것은 값들 간의 상대적 거리까지 변화시킨다는 의미.
① Clipping
일정 범위 내 값은 그대로 유지하고, 범위 밖의 값은 범위 경곗값으로 변환. 예를 들어 일정 범위가 100~150이라면 150 초과하는 데이터는 모두 150으로 반환한다.
② Log Transformation
다수의 값들이 제한된 범위 내에서만 존재하고 특정값들이 굉장히 큰 형태의 분포에서 쓰인다. 예를 들어 인터넷 기사의 댓글 수 분포를 보면, 대다수의 기사들의 댓글 수가 0이거나 5개 미만이다. 소수의 기사들만 댓글수가 굉장히 많다. 이럴 때 이용한다. 이 변환은 모든 값들이 음이 아닐 때만 적용할 수 있다.
③ Bucketing
수치형 변수를 범주형으로 다루는 방법. 예를들어 가구당 연간 소득을 구간을 나누어 1분위, 2분위, 3분위 등으로 나눌 수 있는 것이다.
- uniform : 값의 크기 기준. 어린이 키가 100-150이면 125로 두는 등 구간을 정하여 값을 변환한다
- quatile : 값의 갯수 기준. 각 범위 내에 동일한 수의 데이터가 들어가도록 비율을 나누어 값을 변환한다
④Rank
해당 값들을 전체 데이터에서의 순위(혹은 percentile)로 변환한다. 이상치에 민감하지 않고 어던 분포든 균등 분포로 변환시켜준다는 장점이 있다.
4. 범주형 변수 전처리
A. One-Hot Encoding
각 범주형 변수에 대해 '해당한다''해당하지 않는다'의 0,1 값으로 변환한다. 회귀모델에서 명목형 변수를 변환한다. 하지만 특성의 카디널리티가 너무 크면 차원이 과도하게 증가한다. 트리 기반 모델에서는 비효율적인 모델이 될 수 있어 쓰이지 않는다.
B. Ordinal Encoding
각 범주형 변수에 대해 서로 다른 정수값으로 변환한다. 회귀모델에서 순서형 변수를 변환한다. 명목형 변수에 쓰는 것은 대소관계가 될 수 있기에 적절하지 않다. 트리 모델에서는 순서형 변수, 명목형 변수 모두 쓰일 수 있다.
C. Count Encoding
범주의 등장 빈도의 비율로 값을 변환한다. 즉 해당 카테고리가 차지하는 비율이 전체의 반이라면 0.5로 변환하는 것이다. 골동품과 같이 카테고리의 희소성이 중요한 경우 등에 사용한다.
D. Target Encoding (Mean Encoding)
각 범주형 변수에 대해 해당 특성을 갖는 데이터의 타겟값의 평균으로 인코딩한다. 사용시 과적합이 될 가능성이 농후하므로 주의하자.
'Codestates AI 부트캠프 > 2. Machine Learning' 카테고리의 다른 글
[머신러닝] 3-1 모델 해석 (특성 기준) (0) | 2023.04.16 |
---|---|
[머신러닝] 2-4 Model Tuning (0) | 2023.04.16 |
[머신러닝] 2-2 Boosting (1) | 2023.04.16 |
[머신러닝] 2-1 Tree Based Model (0) | 2023.04.16 |
[머신러닝] 1-4 로지스틱 회귀 (Logistic Regression) (0) | 2023.04.16 |