라벨 인코더: 머신러닝과 데이터 전처리 작업에서 주로 사용된다.
범주형 데이터를 수치형(숫자) 데이터로 변환
- 라벨인코딩: ex) 치킨, 피자, 햄버거가 있는데 치킨는 1
피자는2 햄버거는3과 같이 할당할 수 있다.
1. 데이터프레임 생성
import pandas as pd
df = pd.DataFrame({'A': ['a','b','c','a','b'],
'B': [1,2,3,1,0]})
# A B
#0 a 1
#1 b 2
#2 c 3
#3 a 1
#4 b 0
2. 인코더 모델링(A컬럼 모델링적용)
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit(df['A'])
3. classes_확인
array(['a', 'b', 'c'], dtype=object)
4. a는0 b는1 c는 2
le.transform(df['A']) #A컬럼을 행을 문자를 숫자로 변환
# 출력 array([0, 1, 2, 0, 1])
5. le_A 컬럼 생성
df['le_A'] = le.transform(df['A'])
#A B le_A
#0 a 1 0
#1 b 2 1
#2 c 3 2
#3 a 1 0
#4 b 0 1
6. 5에서 생성한 le_A 컬럼 숫자를 문자(범주형)으로 출력
#le_a 컬럼의 숫자로 된 행을 문자로 출력(컬럼 A와 동일하게 출력)
le.inverse_transform(df['le_A'])
array(['a', 'b', 'c', 'a', 'b'], dtype=object)
Min-max: 데이터를 특정 범위로 변환하는 데이터 스케일링
데이터의 범위를 0,1 혹은 원하는 범위로 조절할 수 있다.
1. 최솟값(min)과 최대값(Max)찾기: 데이터셋에서 각 특징(열)의 최솟값과 최대값을 찾는다.
2. 스케일링: 최솟값을 0, 최대값을 1로 설정하여 데이터를 변환한다.
1. 데이터프레임 생성
df = pd.DataFrame ({
'A': [10, 20, -10, 0, 25],
'B': [1, 2, 3, 1, 0]
})
# A B
#0 10 1
#1 20 2
#2 -10 3
#3 0 1
#4 25 0
2. df에 대한 min-max 스케일링
from sklearn.preprocessing import MinMaxScaler
mms = MinMaxScaler()
mms.fit(df)
3. 최대,최소, 최대값과 최소값의 차이 출력
#a,b컬럼의 최대값, a,b컬럼의 최소값
#data_range_ 는 각컬럼의 최대값과 최소값의 차이를 보여준다.
# 출력은 [35., 3.]인데 --> A컬럼 최대값25 최소값 -10 --> 35차이가 나서 35
# B컬럼은 최대값3 최소값0 --> 3 즉 [35., 3.]출력
mms.data_max_, mms.data_min_, mms.data_range_
# (array([25., 3.]), array([-10., 0.]), array([35., 3.]))
4. 정규화
df_mms = mms.transform(df)
df_mms
# 정규화된 A,B컬럼이 출력된다.
#A컬럼에서 최대값 25는 정규화로 1 최소값 -10은 0으로 출력되고있다. B컬럼도 마찬가지다.
#array([[0.57142857, 0.33333333],
# [0.85714286, 0.66666667],
# [0. , 1. ],
# [0.28571429, 0.33333333],
# [1. , 0. ]])
5. inverse 사용해보기 (정규화된 데이터를 다시 수치형으로 돌려놓는다.)
mms.inverse_transform(df_mms)
#array([[ 10., 1.],
# [ 20., 2.],
# [-10., 3.],
# [ 0., 1.],
# [ 25., 0.]])
Standard Scaler: 데이터의 특성을 평균이 0이고 표준편차가 1인 표준 정규 분포로 변환하는 데 사용한다. 주로 데이터 스케일을 조정하고, 서로 다른 특성 간에 스케일 차이를 제거하기 위해 사용하며 데이터의 각 특성 값들이 평균 0이고 표준편차가 1인 분포를 가지게된다.
1. 데이터 프레임 생성
df = pd.DataFrame ({
'A': [10, 20, -10, 0, 25],
'B': [1, 2, 3, 1, 0]
})
2. 스케일링
from sklearn.preprocessing import StandardScaler
ss= StandardScaler()
ss.fit(df)
3.출력
#scale_은 표준편차를 구한다 mean은 평균
ss.mean_, ss.scale_
# (array([9. , 1.4]), array([12.80624847, 1.0198039 ]))
4.
#평균은0 표준편차는 1로 바꾼 데이터
#평균 0은 원본 데이터의 평균값에서 얼머나 떨어져 있는지 나타낸다.
#표준편차 1은 데이터의 분선 정도를 나타낸다.
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]])
RobustScaler: 머신러닝 모델 학습을 위해 입력 데이터의 스케일을 조정하는 데 사용 RobustScaler는 이상치의 영향을 최소화하고 데이터를 안정적으로 스케일링하는데 좋다.
- RobustScaler의 경우 다른 스케일링 기법을 왜곡시키는데 유용하다.
1. 데이터프레임 생성
import pandas as pd
df = pd.DataFrame({
'A': [-0.1, 0., 0.1, 0.2, 0.3, 0.4, 1.0, 1.1, 5.0]
})
df
# A
#0 -0.1
#1 0.0
#2 0.1
#3 0.2
#4 0.3
#5 0.4
#6 1.0
#7 1.1
#8 5.0
2. 각각의 encoder 사용
from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler
mm = MinMaxScaler()
ss = StandardScaler()
rs = RobustScaler()
3. 스케일링
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)
4. 결과
df_scaler
5. 시각화
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');