221109 12번 강의파일, 0701 실습파일 : 피처스케일링, 표준화(Z-score), Min-Max, Robust, transformation, binning, 이산화(discretisation), 부스팅3대장, 오디널인코딩, 원핫인코딩, polynomial
멋쟁이 사자처럼 AI스쿨 7기, 박조은 강사님 강의
221109
✅12번 강의파일, 0701 실습파일
Feature scaling
트리기반 모델은 정보 균일도 기반으로 되어 있어 피처 스케일링이 필요 없다.
변수 스케일링(feature scaling) : 피처의 범위를 조정하여 정규화 하는 것
분산과 표준편차를 조정한다.
피처 스케일링이 잘 되어 있으면, 변수끼리 비교하는 것이 편리하다.
이상치에 강점이 있다.
Robust scaling : 사분위수 기준으로 스케일링
스케일링 기법
표준화(Z-score) : 표준편차로 조정. 평균을 빼주고 표준편차로 나눠준다.
Min-Max scaling : 기본값은 [0,1]
Robust : 중간값을 빼주고 IQR값으로 나눠준다. IQR을 박스플롯에서 사용했다. 이상치에 덜 민감하다.
Q. 스케일링 방법 중에 표준화, Min-Max, Robust 이상치에 가장 덜 민감한 스케일링 방법은? : Robust
🔥Q. Std, Min-Max, Robust 시각화에서 보이는 특징? 분량이 많아 실습하면서 정리할 것
이 질문의 목적은 실습해보기 전 각 스케일링이 어떤 차이가 있는지 확인해보고 적용하려고 하는 것
일단 스케일링을 했을 때 분포가 변하지 않는다. / x축 값은 min-max의 x값이 0에서 1사이에 있다.
트리 알고리즘은 절대적인 값보다 상대적인 값에 영향을 받기 때문에 스케일링의 영향을 받지 않는다.
std : mean이 0, std가 1 / min-max : min이 0, max가 1 / robust : 50%가 0
ss.fit 할 때 2D array로 만들어줘야 한다.
train[["SalePrice_ss"]] = ss.fit(train[["SalePrice"]]).trainsform(train[["SalePrice"]])
StandardScaler의 fit 에는 matrix를 넣어주어야 하기 때문에 Series가 아닌 DataFrame으로 넣어주기 위해 대괄호를 두번 감싸서 데이터프레임으로 넣어주었다.
반환값도 matrix 형태이기 때문에 새로운 파생변수를 만들고자 한다면 데이터프레임 형태로 파생변수를 만들어준다.
사이킷런의 다른 기능에서는 fit-> predict를 했지만 전처리에서는 fit->trasform을 사용한다.
🔥fit_transform은 train에만 사용하기!!
test에는 transform만
test에도 fit을 하게 되면 train, test의 기준이 달라진다.
Q. StandardScaling의 특징? 평균이 0, 표준편차가 1
Q. Min-Max의 특징 ? 최솟값이 0, 최대값이 1
Q. Robust Scaling의 특징 ? 중간값(중앙값, 50%, 2사분위수)가 0 / 이상치의 영향을 덜 받는다. / Robust == 강건하다
트랜스포메이션
피처 스케일링을 한 후, 표준정규분포 형태로 만들기 위해 log transformation이 필요하다.
Q. 고르게 분포된 값이 왜 예측에 유리할까? 이전에는 1분위에서만 예측 성능이 뛰어난데, 정규분포로 바꾸면 일반적인 예측 성능이 좋아진다.
Equal Width Binning
로그의 진수 조건에 따라 x>0 !!
SalePrice_ss 값에 로그를 취했을 때 경고 메시지가 뜨는 이유는 가장 작은 값이 -1.84로 1을 더해도 1보다 작은 값이 있어서.
SalePrice_ss_log1p 결측치 처리를 해서 다른 데이터에 비해 count 값이 다름을 볼 수 있다.
정규분포는 SalePrice_log1p와 SalePrice_log1p_ss / 표준정규분포는 SalePrice_log1p_ss(중앙이 0)
트리계열 모델을 사용한다면 일반 정규분포를 사용해도 무관하다. 스케일값이 영향을 미치는 모델에서는 표준정규분포로 만들어주면 더 나은 성능을 낼 수 있다.
하지만 표준정규분포로 만들 때 값이 왜곡될 수도 있기 때문에 주의가 필요하다. 변환 작업을 많이 해준다고 모델의 성능이 좋아진다고 보장할 수 없다.
np.arrange(0,10,0.5)
arange([start,] stop[, step,] : start, step은 생략 가능
이산화(Discretisation)
Numerical Feature를 일정 기준으로 나누어 그룹화
ex) 20대, 30대, 40대
적절히 그룹화하면 특정 numerical feature의 영향을 줄인다.(과대적합 예방)
ex) 지하철 적자 규모 예측에 연령정보 : 무료 이용할 수 있는 연령 / 아닌 연령대로 하는 것이 머신러닝 성능에 도움이 된다.
Equal width binning : ex) 절대평가, 히스토그램, pd.cut(), 고객을 구매 금액 구간에 따라 나눌 때 . 한 분할 안에 몇 개가 들어가는지 무관하게 전체 수치 범위에 대해 n분할.
Equal frequency binning : ex) 상대평가, pd.qcut(), 고객을 나눌 때 고객의 수를 기준으로 등급을 나눌 때 .
머신러닝에서 데이터를 분할해서 수치데이터를 이산화해주는 이유는, 머신러닝 알고리즘에 힌트를 줄 수도 있고, 너무 세부화된 조건으로 인해 오버피팅(과대적합) 되지 않도록 도움을 준다.
display(train["SalePrice_qcut"].value_counts())
display(train["SalePrice_qcut"].value_counts(1))
normalize=True해도 되지만 1을 해서 비율을 구할 수도 있다.
pd.cut()
동일한 길이로 나눈다.
hist는 bins로 막대의 개수를 설정할 수 있는데, pd.cut과 같은 개념
아래에서 SalePrice_cut 변수의 빈도를 시각화하면 SalePrice의 히스토그램의 막대를 4개 설정해서 그린 것 과 같다.
pd.qcut()
동일한 갯수로 나눈다.
인코딩
categorical feature를 numerical feature로 변환
최근 부스팅 3대장 알고리즘 중에는 범주형 데이터를 알아서 처리해주는 알고리즘도 있다.
사이킷런에서는 범주형 데이터를 피처로 사용하기 위해서는 별도의 변환 작업이 필요하다.
부스팅 3대장 : Xgboost, LightGBM, catBoost
Ordinal-Encoding
고유값들을 임의의 숫자로 바꾼다. 0부터 1씩 증가하는 정수
원핫인코딩과 연계되어 자주 사용된다.
원핫인코딩
0 또는 1로 대체
boolian 값을 갖는 피처로 만들어준다.
해당 피처의 모든 정보를 유지한다.
너무 많은 고유값이 있는 경우 피처를 너무 많이 생성한다.-> 계산이 오래 걸린다.
MSZoning 일반 구역 분류
.cat.codes : 오디널 인코딩, 결과가 벡터, 1차원 형태. 순서가 있는 명목형 데이터에 사용. ex) 1분기, 2분기, 3분기, 4분기
get_dummies : 원핫인코딩, 결과가 matrix, 2차원 행렬 형태. 순서가 없고 크기를 비교할 수 없는 범주형 데이터, 명목형 데이터에 사용. ex) 좋아하는 음료, 주택의 종류, 수업의 종류
사이킷런 기능으로 인코딩
오디널 인코딩 : train[["MSZoning_enc"]] = oe.fit_transform(train[["MSZoning"]])
원핫인코딩 : ohe_ms = ohe.fit_transform(train[["MSZoning", "Neighborhood"]]).toarray()
판다스 인코딩의 단점
판다스로 인코딩했을 때 문제점은 테스트 데이터에 대한 인코딩에서 발생한다.
사이킷런의 원핫인코딩은 train 데이터로만 학습해서 진행하기에 test에만 존재하는 데이터를 인코딩하지 않는다.
그러나 판다스는 이 기능이 없어서 test셋과 train셋의 고유값을 비교해줘야 하는데,
현실에서 test 데이터는 존재하지 않기 때문에 권장하지 않는다.
판다스의 겟더비스를 사용해서 인코딩하면 train, test를 따로 인코딩하게 된다.
train 학습한 것을 기반으로 test와 동일하게 피처를 생성해야 하는데, 각각 인코딩하면 피처의 수, 종류가 다를 수 있다.
학습, 예측할 때는 동일한 피처를 입력해 주어야 한다. 개수도 동일해야 한다.
판다스로 인코딩하면 set(train.columns) - set(test.columns)로 비교해서 맞춰야 한다.
가장 간단한 것은 concat 을 사용하는 방법이다. 없는 값은 nan으로 들어가게 되고, 다시 train, test 나눠주면 된다.
그런데 test에만 등장하는 데이터를 피처로 사용하지 말라는 정책이 있을 때 이 방법은 규칙위반일 수 있다.
그래서 사이킷런을 사용하면 이런 문제에서 자유로울 수 있다.
다항식 전개(Polynomial Expansion)에 기반한 파생변수 생성
Q. uniform의 의미? : 균등하게 분포가 되어 있다.
히스토그램을 그렸을 때 많고 적음이 드러난다면 특징이 될 수 있는데, 특징이 잘 구분되지 않는다면 power transform을 통해 값을 제곱해주거나 하면 특징이 구분되어 보이기도 한다.
degree 파라미터 == 다항식의 최대 차수
arange == 판다스의 range
reshape(3,2)는 array의 shape 값은 지정해서 shape를 변환해준다. 3x2배열. 행이3, 열이2
SOTA == state of the Art / SOTA 알고리즘 / 현재 최고 수준의 결과
ETL : Extract, Transform, Load
퀴즈
9/10문제
틀린문제
- 4번 문제 : sklearn.preprocessing 에서 scaler를 사용해서 수치데이터의 크기를 변경해주고자 한다. 바르지 않은것
test 데이터도 함께 적용할 수 있게 fit() 해주어야 한다. (x)
댓글