[ML] scikit-learn: ColumnTransformer

2024. 10. 3. 21:03·Programming/ML
728x90
728x90

Scikit-learn에서는 다음의 class와 functions 를 통해, feature별로 다른 전처리를 쉽게 적용할 수 있음:

  • ColumnTransformer,
  • make_column_transformer(),
  • make_column_selector() 사용법

https://gist.github.com/dsaint31x/9c7984cd29b0fc3f7abcf7f82844cb73

 

ml_column_transformer.ipynb

ml_column_transformer.ipynb. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 


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.
728x90

'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:  (2) 2024.09.28
'Programming/ML' 카테고리의 다른 글
  • [ML] scikit-learn: FunctionTransformer
  • [ML] scikit-learn: Pipeline 사용법
  • [ML] Minkowski Distance (L-p Norm)
  • [ML] scikit-learn: Custom Transformer
dsaint31x
dsaint31x
    반응형
    250x250
  • dsaint31x
    Dsaint31's blog
    dsaint31x
  • 전체
    오늘
    어제
    • 분류 전체보기 (787)
      • Private Life (15)
      • Programming (55)
        • DIP (116)
        • ML (35)
      • Computer (120)
        • CE (54)
        • ETC (33)
        • CUDA (3)
        • Blog, Markdown, Latex (4)
        • Linux (9)
      • ... (368)
        • Signals and Systems (115)
        • Math (176)
        • Linear Algebra (33)
        • Physics (43)
        • 인성세미나 (1)
      • 정리필요. (61)
        • 의료기기의 이해 (6)
        • PET, MRI and so on. (7)
        • PET Study 2009 (1)
        • 방사선 장해방호 (5)
        • 방사선 생물학 (3)
        • 방사선 계측 (9)
        • 기타 방사능관련 (3)
        • 고시 (9)
        • 정리 (18)
      • RI (0)
      • 원자력,방사능 관련법 (2)
  • 블로그 메뉴

    • Math
    • Programming
    • SS
    • DIP
  • 링크

    • Convex Optimization For All
  • 공지사항

    • Test
    • PET Study 2009
    • 기타 방사능관련.
  • 인기 글

  • 태그

    signal_and_system
    Term
    math
    SS
    ML
    Optimization
    인허가제도
    Vector
    Python
    linear algebra
    function
    fourier transform
    random
    cv2
    numpy
    SIGNAL
    Probability
    opencv
    signals_and_systems
    Programming
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dsaint31x
[ML] scikit-learn: ColumnTransformer
상단으로

티스토리툴바