데이터 전처리
1. 수치형 데이터
- 결측 데이터 처리
- 이상치 제거(대체)
- 스케일링
2. 문자열 데이터
- 결측 데이터 처리
- 라벨 인코딩 / 원핫 인코딩
문자열 데이터 인코딩
머신러닝 알고리즘은 문자열을 처리하지 못하기 때문에 문자열을 수치형으로 변환해줄 필요가 있다.
기본적으로 데이터의 분할 전에 문자열 인코딩이 이루어진다.
1. 라벨 인코딩
- 특정 문자열 데이터를 정수와 매칭하여 단순 변환하는 방식
- ex) 남성/여성 → 0/1
- 라벨 인코딩은 일반적으로 정답 데이터(y)가 문자열로 구성되어 있는 경우 사용
- 대소관계에 영향을 주기 때문에 설명변수(X)에는 잘 사용하지 않음.
2. 원핫 인코딩
- 유일한 문자열의 개수만큼 컬럼을 생성하여 그중 하나의 위치에만 1을 대입하는 방식
- ex) 남성/여성 → 1 0 / 0 1
- 일반적으로 설명변수(X)에 포함된 문자열 데이터의 전처리에 활용함.
- 메모리의 낭비가 심하다.
문자열 데이터와 수치형 데이터의 전처리 과정은 독립적이기 때문에 데이터를 분할하는 것이 좋다.
즉, 데이터를 분할하고 각각 전처리 한 뒤 다시 합치는 과정이 필요한데 오늘 다룰 ColumnTransformer를 사용하면 이 과정을 편리하게 작업할 수 있다.
ColumnTransformer 예제
import pandas as pd
X = pd.DataFrame() # 빈 데이터 프레임 생성
X['gender'] = ['F','M','F','F','M'] # 문자형 데이터 컬럼
X['age'] = [15, 35, 25, 37, 55] # 수치형 데이터 컬럼
print(X)
# gender age
# 0 F 15
# 1 M 35
# 2 F 25
# 3 F 37
# 4 M 55
문자형 데이터 컬럼과 수치형 데이터 컬럼을 가지는 DataFrame X를 만들어준다.
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import MinMaxScaler
encoder = OneHotEncoder(sparse=False,
handle_unknown='ignore')
scaler = MinMaxScaler()
문자형 데이터를 처리할 OneHotEncoder와 수치형 데이터를 처리할 MinMaxScaler를 불러와 객체를 생성해준다.
from sklearn.compose import ColumnTransformer
obj_columns=['gender']
num_columns=['age']
ct = ColumnTransformer(
[('scaler',scaler,num_columns),
('encoder',encoder,obj_columns)])
ct.fit(X)
print(X)
print(ct.transform(X))
데이터를 문자형 데이터 컬럼과 수치형 데이터 컬럼을 분할한 후 ColumnTransformer의 인자로 각각 넣어준다.
즉, 수치형 데이터는 scaler에 들어가고 문자형 데이터는 encoder에 들어가 전처리되도록 설정된다.
ct.fit(X)를 통해 학습하고 ct.transform(X)를 통해 변환된 결과를 출력하면 다음과 같은 결과가 나온다.
첫번째 컬럼은 MinMaxScaler를 통해 age가 0 ~ 1 사이의 값으로 스케일링된 결과이다.
두 번째, 세 번째 컬럼은 OneHotEncoder를 통해 gender가 변환된 결과이다. 원핫인코딩은 문자열의 종류에 따라 컬럼 개수가 생성되므로 2개의 컬럼이 생성된 것이 특징이다.
(ColumnTransformer에 scaler, encoder 순으로 넣어줘서 age 컬럼이 먼저 출력된 것)
'머신러닝' 카테고리의 다른 글
[머신러닝] GridSearchCV (0) | 2022.06.08 |
---|---|
[머신러닝] 교차검증(Cross-Validation) - KFold (0) | 2022.06.08 |
[머신러닝] 데이터 전처리 - 결측 데이터 처리 (0) | 2022.06.07 |
[머신러닝] 선형 모델의 성능 향상을 위한 방법 (0) | 2022.04.22 |
[머신러닝] Ridge, Lasso 클래스 (0) | 2022.04.22 |