Snoopy [TIL] 20221109 (수)
복습 및 회고/TIL

[TIL] 20221109 (수)

Sooyoon Jeong 2022. 11. 9.

나는 오늘 무엇을 배웠는가?

1. AIS 7기 오늘코드 박조은 강사님 수업

[👇수업 내용을 바탕으로 정리한 내용입니다. 😊👇]

-----------------------------------------------------------------------------------------------------------------------------

# feature scaling

1. 변수스케일링이란?
feature의 범위를 조정하여 정규화하는 것


트리기반 모델은 데이터의 절대적인 크기보다는 상대적인 크기에 영향을 받기 때문에 
따로 스케일링을 해줄 필요는 없지만, 
다른 모델을 사용할 때는 변수 스케일링을 해주어야 올바른 분석을 할 수 있다.

2. 스케일링이 왜 중요할까?
1️⃣ feature의 범위가 다르면 비교가 어렵다.
2️⃣ 일부 머신러닝 모델(회귀 등에서 다항식 연산을 할 때 등)에서는 제대로 작동하지 않는다.
3️⃣ 스케일링이 잘 되어 있으면 서로 다른 변수끼리 비교하는 것이 편리하고, 성능이 상승한다.
4️⃣ feature scaling 없이 작동하는 알고리즘(경사하강법, KNN, clustering 같은 거리 기반 알고리즘 등)에서 더 빠르게 작동한다. 
  (단, 트리 기반 알고리즘은 Feature Scaling의 영향을 잘 받지 않는다.)
5️⃣ 일부 Feature Scaling은 이상치에 강하다는 장점이 있다.
(뒤에서 학습하겠지만, Robust scaling의 경우 사분위수를 기준으로 값을 스케일링하기 때문에, 
이상치가 매우 큰 값이나 매우 작은 값을 갖는 경우에 이런 부분을 완화시켜주는 효과가 있습니다.)

3. 스케일링 방법
1️⃣ Normalization - Standardization (Z-score scaling)
정의: 평균을 제거하고 데이터를 단위 분산으로 스케일링
공식: z = (X - X.mean) / std
장점: 표준 편차가 1이고 평균을 0으로 하는 표준 정규 분포를 갖도록 조정
단점: 변수가 치우쳐 있거나 특이치가 있는 경우 좁은 범위의 관측치를 압축하여 예측력을 손상시킴

2️⃣ Min-Max scaling
정의: 각 feature의 크기를 지정된 범위로 확장하여 변환 (기본값은 [0,1])
공식: X_scaled = (X - X.min) / (X.max - X.min)
단점:변수가 치우쳐 있거나 특이치가 있는 경우 좁은 범위의 관측치를 압축하여 예측력을 손상시킴

3️⃣ Robust scaling
정의: 중앙값을 제거하고 분위수 범위(기본값은 IQR)에 따라 데이터 크기를 조정
공식: X_scaled = (X - X.median) / IQR
장점: 편향된 변수에 대한 변환 후 변수의 분산을 더 잘 보존하기 때문에 이상치 제거에 효과적

1. StandardScaler
- 평균 0, 표준편차 1의 특징을 가지고 있음
- 평균을 이용하여 계산해주기 때문에 이상치에 영향을 받는다. (평균: 이상치의 값에 크게 영향을 받기 때문)

2. MinMaxScaler
- 변수 범위를 0과 1사이로 압축해주는 개념
- 이상치를 포함하고 있으면 범위설정에 영향이 가기 때문에 이상치에 의해 영향을 많이 받는다.

3. RobustScaler
- 중앙값과 사분위 수를 이용한 스케일링 기법
- StandardScaler와 다르게 중앙값(median)을 이용하기 때문에 StandardScaler, MinMaxScaler에 비해서 이상치의 영향을 덜 받는다.

💡 사이킷런에서 사용하기

from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import RobustScaler

Q. 셋 중 가장 민감하지 않은 스케일링 방법은? 🤔

A. Robust

- 표준화(Z-score) : 평균을 빼준 다음 표준편차로 나누기
- Min-Max : 0~1 사이값으로 만들기
- Robust : 중간값을 빼준 다음 IQR값으로 나누기. 이상치에 덜 민감

Q. 스케일링 후 분포는 어떠한가? 🤔
스케일링을 했을 때 분포는 변하지 않는다.
X축의 범위를 보면, 
min-max의 경우 0~1의 범위를 갖고 있고 
표준화와 robust는 비슷해보이지만 차이가 존재한다.
(표준화는 평균을 빼준 다음 표준편차로 나누고, robust는 중간값을 빼준 다음 IQR로 나눈다.)

Q. 기술통계로 봤을 때 각 스케일링의 특징 🤔
StandardScaling: 평균이 0, 분산이 1
Min-Max: 최솟값이 0 최댓값이 1
Robust Scaling: 중간값(중앙값, 50%, 2사분위수)가 0
--------------------------------------------------------------------------------
4. 스케일링 해보기

ss = StandardScaler()
train["파생변수"] = ss.fit(train["변수"]).transform(train["변수"])
==> 오류메세지 발생

왜 오류가 날까?🤔
StandardScaler의 fit 에는 matrix를 넣어주어야 하기 때문에
시리즈가 아닌 데이터프레임 형태로 넣어주기 위해 [[ ]]를 사용해야 한다.
반환값도 matrix 형태이기 때문에 새로운 파생변수를 생성하고자 한다면 데이터프레임 형태로 파생변수를 만들어주어야 한다.

※ ss 뿐만 아니라 다른 스케일링도 동일하다.

ss = StandardScaler()
train[["파생변수"]] = ss.fit(train[["변수"]]).transform(train[["변수"]])

💡 trainform? 🤔
사이킷런의 다른 기능에서는 fit => predict 를 했었지만 전처리에서는 fit => transform을 사용한다.
transform은 SalePrice의 분포를 토대로 StandardScaler에 맞게 값을 변환시켜주는 역할을 한다.

스케일링을 예시로 fit 은 계산하기 위한 평균, 중앙값, 표준편차가 필요하다면 해당 데이터를 기준으로 기술통계값을 구하고 그 값을 기준으로 transform 에서 계산을 적용해서 값을 변환해 줍니다

💡주의사항
피처에 fit_transform은 train에만 사용하고 transform은 train, test에 사용한다.
fit은 test에 사용하지 않는데,  test에도 fit을 하게되면 train과 test의 기준이 달라지기 때문이고,
스케일링의 기준을 train에 맞춰주어야 한다.
(전처리할 때 train을 기준으로 전처리해주듯이 Scaling의 기준도 마찬가지이다.)

따라서 test 에는 train을 기준으로 학습한 것을 바탕으로 transform 만 해야한다.
(학습할 때도 fit은  train 에만 해주는 것과 동일한 느낌이다)

--------------------------------------------------------------------------------

# 정규분포와 tranformation

1. feature scaling의 취약점
robust scaling의 경우 비교적 이상치에 강점이 있기는 하지만, 일반적으로 스케일링은 편향된 분포나 이상치에 취약하다.
feature scaling을 하면 스케일링은 잘 되었지만, 아직 표준정규분포 형태가 아니기 때문이다.

따라서 처음부터 정규분포 형태가 아닌 경우에는 feature scaling은 그다지 좋은 선택이 아니다.

표준정규분포를 만들기 위해서는 log transformation이 필요하다.

2. 정규분포의 중요성
절대평가를 기준으로(pd.cut) 4개의 구간으로 나누어 비교할 때 
1,4구간보다 2,3구간이 상대적으로 중요하다.
(예측하려는 값이 일반적으로 극단값 보다는 중간값에 가까운 값일 확률이 높기 때문에
중간값을 잘 예측하는 모델이 일반적으로 성능이 높은 모델이다.)

정규분포는 2,3구간에 값이 많이 몰려있어서 일반적인 예측 성능이 올라가게 된다.

💡[참고] 구간 나누는 방법
절대평가: 간격기준으로 나누기
상대평가: 개수로 나누기

Q. 마이너스 값에 로그를 취하려면?
최소값을 더해주고 로그를 취하면 된다.

Q. 정규분포와 표준정규분포
트리계열 모델을 사용한다면 일반 정규분포를 사용해도 무관합니다. 
그런데 스케일값이 영향을 미치는 모델에서는 표준정규분포로 만들어 주면 더 나은 성능을 낼 수도 있습니다. 
표준정규분포로 만들 때 값이 왜곡될 수도 있기 때문에 주의가 필요합니다. 
꼭 이런 변환작업을 많이 해준다고 해서 모델의 성능이 좋아진다고 보장할 수 없습니다. 
상황에 맞는 변환방법을 사용하는 것을 추천합니다.

--------------------------------------------------------------------------------

# 이산화
numerical feature를 일정 기준으로 나누어 그룹화 하는 것

1. 이산화가 필요한 이유
2️⃣ 특징을 잘 나타내는 속성으로 그룹화하면 경향이 뚜렷해지고 이해하기 쉬워져서 모델 성능에 도움이 된다.
3️⃣ 과대적합 방지 가능

2. 이산화 종류
1️⃣ Equal width binning 
범위를 기준으로 나누는 것
ex) 절대평가

단점: 편향된 분포에 민감하다.

2️⃣ Equal frequency bining
빈도를 기준으로 나누는 것
ex) 상대평가

장점: 알고리즘 성능 개선에 도움이 된다.
단점: 임의의 비닝은 대상과의 관계를 방해할 수 있다.

--------------------------------------------------------------------------------
# 인코딩
최근 부스팅3대장 알고리즘 중에는 범주형 데이터를 알아서 처리해 주는 알고리즘도 있지만 사이킷런에서는 범주형 데이터를 피처로 사용하기 위해서는 별도의 변환작업이 필요합니다.
부스팅3대장 => Xgboost, LightGBM, catBoost

1. 오디널 인코딩
catergoy 데이터 타입으로 변경하는 인코딩 기법

a <- 1
b <- 2

이런 식으로 들어가는 순서형 인코딩
순서가 있는 명목형 데이터에 사용하기 적합하다.
(하나의 컬럼에 1부터 순차적으로 값이 채워진다.)

※ label 인코딩과 오디널 인코딩은 거의 똑같은 인코딩 기법이다.

2. 원 핫 인코딩
한 개의 1과 수 많은 0의 값으로 데이터를 구별하는 인코딩기법

순서가 없는 명목형 데이터에 사용하기 적합하다.
(여러개의 컬럼이 생성되고 부합하는 값에만 1이, 아닌 값에는 0이 채워진다.)

💡판다스로 원 핫 인코딩을 할 경우 train과 test 각각 인코딩을 하게 된다.
train과 test의 컬럼명, 컬럼수가 일치하는지 확인해야 한다.
set을 이용하여 확인하고 가장 간단한 것은 concat을 사용하는 것이다.
concat을 사용하여 결측치는 nan 값으로 채워주고 다시 train, test로 나눠주면 된다.
=> 처음부터 concat을 사용하고 나중에 나눠주면 이런 문제를 해결할 수 있지만
=> 그런데 test 에만 등장하는 데이터를 피처로 사용하지 말라는 정책이 있을 때 이 방법은 규칙위반일수 있다.
--------------------------------------------------------------------------------

# 파생변수
이미 존재하는 변수를 활용하여 새로운 변수를 생성하는 것

왜 만들까?
1️⃣ 적절히 생성된 파생변수는 데이터의 특성을 더 잘 설명하기에 데이터 해석이 편리해지고 머신러닝 성능이 개선된다.
2️⃣ 데이터 분석의 목적은 feature들의 숨겨진 관계는 feature들의 연관관계를 통해 파악할 수 있다.
     이때, 연관관계를 잘 설명해주는 적절한 feature가 없다면 직접 만들어서 사용할 수 있다.


파생변수 만드는 방법
1️⃣ 사칙연산, 최대, 최소, 산술평균 등 다양한 산술적인 방법으로 만들기
2️⃣ 시간, 지역별로 구분하거나 비율을 구하여 만들기

그 외에도 다양한 방법을 사용하여 파생변수를 생성할 수 있고
필요에 따라 자유롭게 생성하면 된다.

그러나, 파생변수 생성으로 인해 역효과가 생길 수도 있다.
1️⃣ 오히려 성능이 떨어질 수 있다.
2️⃣ feature가 늘어날 수록 학습시간이 늘어난다.
3️⃣ 파생변수 생성자는 해당 변수에 대해 잘 알지만, 다른 사람들은 잘 모를 수 있다.
 => feature명을 직관적으로 사용하고 파생변수에 타당성이 있어야 한다.

-----------------------------------------------------------------------------------------------------------------------------

 

2. 천리길 스터디

 

나는 오늘 무엇을 느꼈는가?

전처리, 피쳐엔지리어닝에 굉장히 여러가지 방법이 있는데, 어떤 것을 골라야 좋을지 고민이 많이 될 것 같다.

일단 모든 방법을 잘 다룰 수 있도록 연습을 많이 하고

피쳐엔지니어링을 하면 오히려 성능이 떨어지는 경우가 더 많다는 것을 잊지 말자.

성능이 안나온다고 해서 실망하지 말고 이것을 통해서 뭘 배웠는지, 어떻게 하면 개선할 수 있는지 고민해보자.

 

총 공부시간

13시간 47분 21초

- AIS: 8시간(09~18)

- 그 외: 5시간 47분 21초

'복습 및 회고 > TIL' 카테고리의 다른 글

[TIL] 20221111(금)  (1) 2022.11.11
[TIL] 20221110(목)  (0) 2022.11.10
[TIL] 20221108(화)  (0) 2022.11.08
[TIL] 20221107(월)  (0) 2022.11.07
[TIL] 20221106(일)  (0) 2022.11.06

댓글