본문 바로가기

머신러닝

머신러닝 심화과정(데이터분석 프로세스) - 데이터 전처리(인코딩, 스케일링)

인코딩

어떤 정보를 정해진 규칙에 따라 변환하는 것(↔ 디코딩)

- 범주형 자료에 대한 전처리

 

1. 레이블 인코딩(Label Encoding)

▶ 문자열 범주형 값을 고유한 숫자로 할당(1등급 → 0      2등급 → 1      3등급 → 2)

▶ 장점 : 모델이 처리하기 쉬운 수치형으로 데이터 변환

    단점 : 실제로는 그렇지 않은데, 순서 간 크기에 의미가 부여되어 모델이 잘못 해석 할 수 있음

# 사용 함수
sklearn.preprocessing.LabelEncoder
fit: 데이터 학습
transform: 정수형 데이터로 변환
fit_transform: fit과 transform을 연결하여 한번에 실행
inverse_transform : 인코딩된 데이터를 원래 문자열로 변환

# 속성
classes_: 인코더가 학습한 클래스(범주)

 

2. 원-핫 인코딩(One-Hot Encoding)

각 범주를 이진 형식으로 변환하는 기법(빨강 → [1,0,0]      파랑 → [0,1,0]      초록 → [0,0,1])

장점 : 각 범주가 독립적으로 표현되어, 순서가 중요도를 잘못 학습하는 것을 방지, 명목형 데이터에 권장

    단점 : 범주 개수가 많을 경우 차원이 크게 증가(차원의 저주) , 모델의 복잡도를 증가, 과적합 유발

# 사용 함수
pd.get_dummies
sklearn.preprocessing.OneHotEncoder

메소드(LabelEncoder와 동일)(fit ~ inverse_transform)
categories_: 인코더가 학습한 클래스(범주)
get_feature_names_out(): 학습한 클래스 이름(리스트)

# CSR 데이터 데이터프레임으로 만들기
csr_df = pd.DataFrame(csr_data.toarray(), columns = oe.get_feature_names_out())
# 기존 데이터프레임에 붙이기(옆으로)
pd.DataFrame([titaninc_df,csr_df], axis = 1)

 

# 실습해보기

- 성별(sex)은 LabelEncoder
- 항구(Embarked) OneHotEncoder

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
le = LabelEncoder()
oe = OneHotEncoder()
# 학습
le.fit(titanic_df[['Sex']])
le.classes_ # array(['female', 'male'], dtype=object)
titanic_df['Sex_le'] = le.transform(titanic_df[['Sex']]) # 인코딩 후 컬럼 추가(head 확인)

# 학습
oe.fit(titanic_df[['Embarked']])
oe.categories_ # [array(['C', 'Q', 'S', nan], dtype=object)]

# 인코딩
embarked_csr = oe.transform(titanic_df[['Embarked']])
# 데이터프레임화
embarked_csr_df = pd.DataFrame(embarked_csr.toarray(), columns = oe.get_feature_names_out())
pd.concat([titanic_df, embarked_csr_df], axis = 1) # 기존 데이터와 합치기

 

스케일링

- 수치형 자료에 대한 전처리

 

1. 표준화(Standardization)

▶ 각 데이터에 평균을 빼고 표준편차를 나누어 평균을 0 표준편차를 1로 조정하는 방법

▶ 장점 : 이상치가 있거나 분포가 치우쳐져 있을 때 유용

              모든 특성의 스케일을 동일하게 맞춤. 많은 알고리즘에서 좋은 성능

▶ 단점 : 데이터의 최소 - 최대 값이 정해지지 않음

# 사용 함수
sklearn.preprocessing.StandardScaler
fit : 데이터 학습(평균과 표준편차를 계산)
transform : 데이터 스케일링 진행

# 속성
mean_ : 데이터의 평균 값
scale_, var_ : 데이터의 표준 편차,분산 값
n_features_in_ : fit 할 때 들어간 변수 개수
feature_names_in_ : fit 할 때 들어간 변수 이름
n_samples_seen_ : fit 할 때 들어간 데이터의 개수

 

2. 정규화(Normalization)

▶ 데이터를 0과 1사이 값으로 조정(최소값 0, 최대값 1)

▶ 장점 : 모든 특성의 스케일을 동일하게 맞춤

              최대-최소 범위가 명확

▶ 단점 : 이상치에 영향을 많이 받을 수 있음(반대로 말하면 이상치가 없을 때 유용)

# 사용 함수
sklearn.preprocessing.MinMaxScaler
fit
transform

# 속성
data_min_: 원 데이터의 최소 값
data_max_: 원 데이터의 최대 값
data_range_ : 원 데이터의 최대-최소 범위

 

3. 로버스트 스케일링(Robust Scaling)

▶ 중앙값과 IQR을 사용하여 스케일링

▶ 장점 : 이상치의 영향에 덜 민감

    단점: 표준화와 정규화에 비해 덜 사용됨

# 사용 함수
sklearn.preprocessing.RobustScaler

# 속성
center_: 훈련 데이터의 중앙값

 

 

 

# 스케일링 표준화, 정규화를 titanic 데이터로 실습하기

# 시각화해서 특정 컬럼에 어떤 스케일링 방식을 사용할지 정하기
sns.pairplot(titanic_df[['Age', 'Fare']])
titanic_df[['Age', 'Fare']].describe()

# Age는 MinMaxScaler # 이상치 없음
# Fare는 StandardScaler # 이상치 존재

from sklearn.preprocessing import MinMaxScaler, StandardScaler
mm_sc = MinMaxScaler()
sd_sc = StandardScaler()

# 훈련 및 처리 동시에
titanic_df['Age_mean_mm_sc'] = mm_sc.fit_transform(titanic_df[['Age_mean']])
titanic_df['Fare_sd_sc'] = sd_sc.fit_transform(titanic_df[['Fare']])

# 시각화 및 정보파악
sns.histplot(titanic_df['Age_mean_mm_sc'], bins = 100)
sns.histplot(titanic_df['Fare_sd_sc'])
titanic_df.head(3)