[머신러닝] encoder, scaler

쩡이·2023년 9월 20일

ML

목록 보기
3/14

encoder

간단한 예제

import pandas as pd
df = pd.DataFrame(
    {'A' : ['a', 'b', 'c', 'a', 'b'],
     'B' : [1, 2, 1, 1, 0]
     })
     
df    
    A	B
0	a	1
1	b	2
2	c	1
3	a	1
4	b	0

Label encoder

문자를 숫자로 또는 숫자를 문자로 바꿔주는데 사용

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
le.fit(df['A'])
le.transform(df['A']) #학습한 내용 적용
출력 : array([0, 1, 2, 0, 1])

#fit과 transform을 한번에
le.fit_transform(df['A'])
출력 : array([0, 1, 2, 0, 1])

#변환된 것을 새로운 컬럼에 추가
df['le_A'] = le.transform(df['A'])

#변환된 것을 하나씩 확인
le.fit_transform(['a'])

#encoder에 등록된 클래스 조회
le.classes_

#숫자를 문자로 역변환
le.inverse_transform(df['B'])

scaler

간단한 예제

df = pd.DataFrame({
    'A' : [10, 20, -10, 0, 25],
    'B' : [1, 2, 3, 1, 0]
})
df


     A  B
0	10	1
1	20	2
2  -10	3
3	 0	1
4	25	0

min-max scaling

x=xmin(x)/(max(x)min(x))x'=x-min(x)/(max(x)-min(x))

from sklearn.preprocessing import MinMaxScaler

mms = MinMaxScaler()
mms.fit(df) #아직 적용은 안된 상황

mms.data_max_, mms.data_min_, mms.data_range_
출력: (array([25.,  3.]), array([-10.,   0.]), array([35.,  3.]))

결과를 보면 A,B컬럼에서 각각 max,min,range를 뽑아와서 2개씩 값을 가진다.

이제 적용시켜보자

df_mms = mms.transform(df)
df_mms

출력:
array([[0.57142857, 0.33333333],
       [0.85714286, 0.66666667],
       [0.        , 1.        ],
       [0.28571429, 0.33333333],
       [1.        , 0.        ]])

최댓값 -> 1, 최솟값 -> 0, 나머지는 x'를 계산한 값이 나온다.

#역변환
mms.inverse_transform(df_mms)

#fit, transform 한번에
mms.fit_transform(df)

표준정규분포

z=(Xm)/σz = (X-m)/σ

from sklearn.preprocessing import StandardScaler

ss = StandardScaler()
ss.fit(df)

ss.mean_, ss.scale_ #평균, 표준편차 확인
출력:(array([9. , 1.4]), array([12.80624847,  1.0198039 ]))

df_ss = ss.transform(df) #적용
df_ss
출력:
array([[ 0.07808688, -0.39223227],
       [ 0.85895569,  0.58834841],
       [-1.48365074,  1.56892908],
       [-0.70278193, -0.39223227],
       [ 1.2493901 , -1.37281295]])

#fit, transform 한번에
ss.fit_transform(df)

Robust Scaler

xiQ2/(Q3Q1)x_i-Q_2/(Q_3-Q_1)
median을 0으로, 50% 데이터의 길이를 1로 본다.

다음 예제로 minmax, standard,robust를 한번에 비교해보자

df = pd.DataFrame({
    'A' : [-0.1, 0, 0.1, 0.2, 0.3, 0.4, 1.0, 1.1, 5.0]
})
from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler

mm = MinMaxScaler()
ss = StandardScaler()
rs = RobustScaler()

df_scaler = df.copy()

df_scaler['MinMax'] = mm.fit_transform(df)
df_scaler['Standard'] = ss.fit_transform(df)
df_scaler['Robust'] = rs.fit_transform(df)

df_scaler

차이를 시각화하여 알아보자

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme(style='whitegrid')

plt.figure(figsize=(16,6))
sns.boxplot(data=df_scaler, orient='h')

robust scaler는 A값의 median을 0으로 데이터 50% 길이를 1로 만든다. 그리고 outlier는 robust scaler에 크게 영향을 주지 않고 계속 outlier로 존재한다

0개의 댓글