Scikit-learn에서는 다음의 class와 functions 를 통해, feature별로 다른 전처리를 쉽게 적용할 수 있음:
ColumnTransformer
,make_column_transformer()
,make_column_selector()
사용법
https://gist.github.com/dsaint31x/9c7984cd29b0fc3f7abcf7f82844cb73
1. ColumnTransformer
ColumnTransformer
는
- 여러 pre-processors를 column별로 적용하고
- 그 결과를 하나의 데이터로 결합.
각 column에 맞는 preprocessor (=transformer)를 설정하여 데이터를 처리하는 방식.
Signature:
class sklearn.compose.ColumnTransformer(
transformers,
*, # end of positional arg.
remainder = 'drop', # 'passthrough'
sparse_threshold = 0.3,
n_jobs = None,
transformer_weights = None, # {'num': 1.5, 'cat': 1.0}, 변환 결과에 곱해짐.
verbose = False,
verbose_feature_names_out=True,
)
transformers
:- 전처리를 수행할 column과 적용할 transformer의 List
- 각 항목은
(이름, 변환기, 적용할_컬럼)
: 적용할 column은 List로 지정.
remainder
:- 지정하지 않은 column을 어떻게 처리할지에 대한 정의.
- 기본값은 ‘drop’으로 제거를 수행.
passthrough
의 경우 남김.- transformer를 지정할 수도 있음.
sparse_threshold
:- sparse matrix(희소 행렬) 로 변환할지에 대한 임계값 설정.
n_jobs
:- 병렬 처리할 작업의 개수 지정.
verbose_feature_names_out
:True
인 경우,변환 후 피처 이름이 각 transformer와 연관된 상세한 이름으로 지정됨.- 예를 들어,
StandardScaler
로 변환된age
와income
이 - 각각 변환기 이름과 함께
scaler__age
,scaler__income
등으로 나타남. - 이를 통해 어떤 변환기가 어떤 컬럼에 적용되었는지 명확하게 알 수 있음.
호출 예시:
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
# ColumnTransformer 호출
column_transformer = ColumnTransformer(
transformers=[
# 첫 번째 전처리: 숫자형 컬럼에 StandardScaler 적용
('num', StandardScaler(), ['age', 'income']), #'num'이름 /숫자형 'age'와'income'컬럼
# 두 번째 전처리: 범주형 컬럼에 OneHotEncoder 적용
('cat', OneHotEncoder(), ['gender']) #'cat'이름 /범주형 'gender' 컬럼
],
remainder='drop' # 처리되지 않은 컬럼은 제거
)
2. make_column_transformer()
make_column_transformer()
는 ColumnTransformer
를 더 간편하게 설정할 수 있는 함수.
Signature:
sklearn.compose.make_column_transformer(
*transformers, # variable-length arguments
remainder = 'drop',
sparse_threshold = 0.3,
n_jobs = None,
verbose = False,
verbose_feature_names_out = True
)
transformers
:- 적용할 transformer와 컬럼의 tuple을 가변길이 인자로 지정.
- 각 항목은
(변환기, 적용할_컬럼)
. - ColumnTransformer 에서는 List로 묶지만, 여기선 그냥 여러 tuples로 입력함.
remainder
,sparse_threshold
,n_jobs
,transformer_weights
,verbose
,verbose_feature_names_out
:- ColumnTransformer와 동일.
호출 예시:
from sklearn.compose import make_column_transformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
# make_column_transformer 호출
column_transformer = make_column_transformer(
# 첫 번째 전처리: 숫자형 컬럼에 StandardScaler 적용
(StandardScaler(), ['age', 'income']), # StandardScaler를 'age'와 'income' 컬럼에 적용
# 두 번째 전처리: 범주형 컬럼에 OneHotEncoder 적용
(OneHotEncoder(), ['gender']) # OneHotEncoder를 'gender' 컬럼에 적용
)
3. make_column_selector()
make_column_selector()
는
- columns를 직접 지정하지 않고,
- 데이터 타입에 따라 자동으로 컬럼을 선택해주는 기능 제공.
주로 데이터 유형(숫자형, 범주형)에 따라 컬럼을 자동으로 선택하는 데 유용함.
Signature:
sklearn.compose.make_column_selector(
pattern = None,
*, # end of positional arguments
dtype_include = None,
dtype_exclude = None,
)
pattern
: 선택할 column 이름의 패턴 지정.type_include
: 포함할 dtype (데이터 타입) 지정.type_exclude
: 제외할 dtype (데이터 타입) 지정.
호출 예시:
from sklearn.compose import make_column_selector
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import make_column_transformer
# make_column_selector를 사용해 숫자형과 범주형 컬럼을 자동으로 선택
column_transformer = make_column_transformer(
# 숫자형 컬럼을 자동으로 선택해 StandardScaler 적용
(StandardScaler(), make_column_selector(dtype_include='number')),
# 범주형 컬럼을 자동으로 선택해 OneHotEncoder 적용
(OneHotEncoder() , make_column_selector(dtype_include='object')),
)
4. Pipeline 결합
전처리와 모델 학습을 하나의 estimator로 처리하려면 Pipeline
class 를 사용.
ColumnTransformer
를 포함한 전처리 과정을- 모델링 과정에 결합하여,
- 학습과 예측을 쉽게 수행하는 방식.
Signature:
class sklearn.pipeline.Pipeline(
steps,
*, # end of positional arg.
memory = None,
verbose = False,
)
steps
: 각 단계에서 수행할 작업의 List. 각 항목은(이름, 단계)
형식.memory
: 캐싱을 사용하여 중간 변환 결과 저장. 기본값은None
.verbose
: 파이프라인의 작업 진행 상황 출력 option.
호출 예시:
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
# 파이프라인으로 전체 프로세스 결합
pipeline = Pipeline([
('preprocessor', column_transformer), # 전처리 과정
('classifier', LogisticRegression()) # 분류 모델
])
# 파이프라인으로 학습 및 예측
pipeline.fit(df, [0, 1, 0, 1]) # 예시 레이블로 모델 학습
예제
import pandas as pd
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
# 예제 데이터 생성
data = {
'age': [25, 32, 47, 51],
'income': [50000, 64000, 120000, 85000],
'gender': ['male', 'female', 'female', 'male']
}
df = pd.DataFrame(data)
# 숫자형 데이터에 StandardScaler, 범주형 데이터에 OneHotEncoder 적용
column_transformer = ColumnTransformer(
transformers=[
('num', StandardScaler(), ['age', 'income']),
('cat', OneHotEncoder(), ['gender'])
]
)
# 데이터 변환
transformed_data = column_transformer.fit_transform(df)
print(transformed_data)
결론
ColumnTransformer
: 여러 전처리기를 컬럼별로 적용하여 데이터를 변환하는 Class.make_column_transformer()
: 간단한 방식으로 여러 전처리기를 컬럼에 적용할 수 있는 function.make_column_selector()
: 특정 데이터 유형에 맞는 컬럼을 자동으로 선택하여 function.Pipeline
: 전처리와 모델 학습을 결합하여 전체 과정을 하나의 흐름으로 처리하는 Class.
'Programming > ML' 카테고리의 다른 글
[ML] scikit-learn: FunctionTransformer (0) | 2024.10.03 |
---|---|
[ML] scikit-learn: Pipeline 사용법 (0) | 2024.10.03 |
[ML] Minkowski Distance (L-p Norm) (0) | 2024.10.02 |
[ML] scikit-learn: Custom Transformer (2) | 2024.10.01 |
[ML] Embedding (0) | 2024.09.28 |