ML - 3. label_encoder , Scaler : min-max , Standard , Robust

솔비·2024년 2월 21일
0

🤖 ML / DL

목록 보기
3/6

1. label_encoder


데이터준비

import pandas as pd

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

df


from sklearn.preprocessing import LabelEncoder

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()

- 학습

le.fit(df['A'])

- 학습 클래스 확인

le.classes_

➡️ array(['a', 'b', 'c'], dtype=object)

- 변환

le.transform(df['A'])

➡️ array([0, 1, 2, 0, 1])
: a,b,c,a,b -> 0,1,2,0,1로 변환됨

df['le_A'] = le.transform(df['A'])
df

- 학습+변환

le.fit_transform(df['A'])

➡️ array([0, 1, 2, 0, 1])

- 역변환

le.inverse_transform(le.fit_transform(df['A']))

➡️ array(['a', 'b', 'c', 'a', 'b'], dtype=object)




정규화 표준화




2. Min-Max Scaler (정규화)

(min)은 0으로, (max)는 1로 만들어 줌


데이터준비

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

df

from sklearn.preprocessing import MinMaxScaler

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.]))
📌 각각 컬럼별 최대 최소 범위를 반환

- 변환

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을 기준으로 나타냄

- 역변환

mms.inverse_transform(df_mms)

⬇️

array([[ 10.,   1.],
       [ 20.,   2.],
       [-10.,   3.],
       [  0.,   1.],
       [ 25.,   0.]])

- 학습 + 변환

mms.fit_transform(df)

⬇️

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




3.Standard Scaler (표준화)


표준정규분포 (표준을 빼고 편차로 나눠줌)


데이터준비

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

df

from sklearn.preprocessing import StandardScaler

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]])

- 역변환

ss.inverse_transform(df_ss)

⬇️

array([[ 10.,   1.],
       [ 20.,   2.],
       [-10.,   3.],
       [  0.,   1.],
       [ 25.,   0.]])

- 학습 + 변환

ss.fit_transform(df)

⬇️

array([[ 0.07808688, -0.39223227],
       [ 0.85895569,  0.58834841],
       [-1.48365074,  1.56892908],
       [-0.70278193, -0.39223227],
       [ 1.2493901 , -1.37281295]])




4. Robust Scaler


데이터준비

df = pd.DataFrame(
    {
        'A' : [-0.1,0.,0.1,0.2,0.3,0.4,1.0,1.1,5]
    }
)
df

from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler

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

df_scalar = df.copy()

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

df_scalar

- boxplot

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme(style='whitegrid')
plt.figure(figsize=(16,6))
sns.boxplot(data=df_scalar, orient='h')

  • A 안에는 0.1 기준으로 증감하는 데이터들 사이에 5라는 아웃라이어가 있음

  • 5라는 아웃라이어 때문에 MinMaxScaler 결과 한쪽으로 치우치게 됨

  • MinMaxScaler는 아웃라이어의 영향을 받으면 데이터가 이상해질 수 있음

  • 평균과 중앙값을 쓸때, 평균 이상치를 반영하고, 중앙값은 이상치 영향을 덜 받게 됨

  • StandardSCaler를 확인했을 때, 평균이 반영되어 대다수의 데이터가 왼쪽으로 치우침

  • RobustSCaler는 median이 0이 되고, 아웃라이어는 그대로 유지되며 데이터에 영향을 크게 주지 않음






Zero Base 데이터분석 스쿨
Daily Study Note
profile
Study Log

0개의 댓글

관련 채용 정보