[ML] scikit-learn: FunctionTransformer

2024. 10. 3. 23:33·Programming/ML
728x90
728x90

 

사용자가 정의한 함수를 pipeline에서 변환기(transformer)로 사용할 수 있게 해주는 유용한 Class.

  • 전처리나 특정 데이터 변환 작업이 필요할 때,
  • 이를 FunctionTransformer로 간편하게 적용할 수 있습니다.

이를 통해, fit() 가 필요하지 않은 사용자 정의 변환을 손쉽게 Scikit-learn의 Pipeline에 포함시켜 다양한 데이터를 처리할 수 있음


1. Signature

class sklearn.preprocessing.FunctionTransformer(
    func=None,
    inverse_func=None,
    *,
    validate=False,
    accept_sparse=False,
    check_inverse=True,
    feature_names_out=None,
    kw_args=None,
    inv_kw_args=None
)
  • func: ***
    • 변환 함수를 지정.
    • X 데이터를 입력받아 변환된 데이터를 반환하는 함수.
    • 이 파라미터는 기본적으로 None이며, 이 경우 입력 데이터는 그대로 반환.
  • inverse_func:**
    • func의 역변환을 정의하는 함수.
    • 데이터의 역변환이 필요한 경우 지정.
  • validate:
    • 입력 데이터가 유효한지 확인할지 여부를 결정:
      • 내부에서 check_array()를 호출하여 다음을 검사
      • 과거 scikit-learn의 영향으로 아직까지도 2D의 float numeric array인지를 확인함.
      • False로 두는 것을 권함 (참고로 성능저하 방지를 위해서도 False를 추천).
    • True로 설정하면 입력 데이터를 검증하는데, 다차원 배열 등의 검증을 할 수 있음.
  • accept_sparse:
    • 희소 행렬(sparse matrix)을 허용할지 여부를 결정.
    • 희소 행렬을 다룰 경우 True로 설정.
  • check_inverse:
    • func와 inverse_func가 서로 역관계를 가지는지 확인.
    • 기본값은 True.
  • feature_names_out: ***
    • 변환된 features의 이름들을 정의할 때 사용하는 함수 또는 list 객체(one-to-one 지정).
    • 이 함수는 입력 features 이름을 받아 출력 features의 이름을 반환.
    • scikit-learn 1.2+ 에서 pandas 지원이 이루어지므로 warning을 피하려면 지정하는 것이 좋음.
  • kw_args:***
    • func에 추가로 전달할 인자들.
  • inv_kw_args:**
    • inverse_func에 추가로 전달할 인자들.

2. FunctionTransformer 사용 예제

간단한 예제로,

  • 데이터를 변환하여 각 값을 2배로 만드는 함수를
  • FunctionTransformer를 통해 transformer로 변환

https://gist.github.com/dsaint31x/6faca7cbe3f063db88d7549977fc7ef0

 

ml_function_transform.ipynb

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

gist.github.com


2-1. 기본적인 사용

  • 2배로 값을 변환하는 함수를 정의한 후,
  • 이를 FunctionTransformer로 변환.
import numpy as np
from sklearn.preprocessing import FunctionTransformer

# 데이터 값을 2배로 만드는 함수 정의
def double_values(X):
    return X * 2

# FunctionTransformer로 변환
transformer = FunctionTransformer(func=double_values)

# 샘플 데이터
X = np.array([[1, 2, 3], [4, 5, 6]])

# 변환 수행
X_transformed = transformer.transform(X)
print(X_transformed)

출력:

[[ 2  4  6]
 [ 8 10 12]]
  • double_values 함수는 입력 데이터를 받아 각 값을 2배로 만드는 함수.
  • 이를 FunctionTransformer에 전달한 후, transform 메서드를 사용하여 데이터를 변환.

2-2. 역변환(inverse_transform) 사용

FunctionTransformer는 역변환 함수(inverse_func)도 지정 가능.

# 데이터를 원래 값으로 복원하는 역변환 함수 정의
def half_values(X):
    return X / 2

# FunctionTransformer에 역변환 함수 추가
transformer_with_inverse = FunctionTransformer(func=double_values, inverse_func=half_values)

# 변환 수행
X_transformed = transformer_with_inverse.transform(X)
print("Transformed data:", X_transformed)

# 역변환 수행
X_inverse_transformed = transformer_with_inverse.inverse_transform(X_transformed)
print("Inverse Transformed data:", X_inverse_transformed)

출력:

Transformed data: [[ 2  4  6]
                   [ 8 10 12]]
Inverse Transformed data: [[1. 2. 3.]
                           [4. 5. 6.]]

이 예제에서

  • double_values 함수로 값을 2배로 만든 후,
  • half_values 함수로 다시 원래 값으로 복원

inverse_transform 메서드를 사용하면 inverse_func에 지정된 함수를 적용하여 데이터를 역변환.


3. Pipeline에서 사용

FunctionTransformer는 Pipeline에서 전처리 단계로 사용하기 적합.

예를 들어, feature 간의 비율을 계산하는 함수를 FunctionTransformer로 변환하고, 이를 Pipeline에 포함.

from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler

# 피처의 비율을 계산하는 함수 정의 (첫 번째/두 번째 피처)
def column_ratio(X):
    return X[:, [0]] / X[:, [1]]

# 파이프라인 구성
pipeline = make_pipeline(
    SimpleImputer(strategy="median"),  # 결측값 처리
    FunctionTransformer(column_ratio),  # 피처 비율 계산
    StandardScaler()                    # 표준화
)

# 샘플 데이터
X = np.array([[10, 2], [20, 5], [30, np.nan]])

# 파이프라인 실행
X_transformed = pipeline.fit_transform(X)
print(X_transformed)

출력:

[[-1.22474487]
 [ 0.        ]
 [ 1.22474487]]

 

make_pipeline은 Pipeline 객체를 간단히 생성하는 방법이며, 일반적으로는 Pipeline의 생성자를 이용하여 만드는 것이 보다 더 낫다.

2024.10.03 - [Programming/ML] - [ML] scikit-learn: Pipeline 사용법

 

[ML] scikit-learn: Pipeline 사용법

Scikit-learn의 Pipeline은 여러 데이터 처리 과정을 하나로 묶어 효율적으로 실행할 수 있게 해주는 Class.(일반적인) Pipeline 이란?Pipeline은 일반적으로 (데이터) 처리 과정 또는 기계학습 등에서 “여러

dsaint31.tistory.com


4. feature_names_out 에 할당 가능한 함수 만들기.

feature_names_out:

  • 변환된 features의 이름(=label)을 가진 list를 반환하는 함수
  • 지정하지 않을 경우, 만들어진 transformer객체에서 get_feature_names_out 함수가 구현되지 않음

구현 방식:

feature_names_out은

  • 문자열들의 list 객체로 직접 features의 이름들을 지정하거나,
  • 함수(callable 객체)로 지정되며 해당 함수는 두 개의 parameters를 받아 출력 features의 이름을 반환하도록 구현됨:

함수의 두 개의 parameter는 다음과 같음:

  1. function_transformer: 실제 변환을 수행하는 FunctionTransformer 객체.
  2. feature_names_in: 변환 이전의 입력 피처 이름들이 List 형태로 전달됨.

이 함수는

  • 변환 결과로 생성되는 피처들의 이름을 반환해야함.
  • 반환되는 이름의 개수는 변환된 피처 수와 일치하도록 구현해야 함.

Transformer로 변환 후, get_feature_names_out() 메서드를 통해 새로운 이름을 확인할 수 있음.

# 피처 이름 변경 함수 정의
def double_feature_names(function_transformer, feature_names_in):
    return [f"double_{name}" for name in feature_names_in]

# FunctionTransformer에 feature_names_out 추가
transformer_with_names = FunctionTransformer(
    func=double_values, 
    feature_names_out=double_feature_names
)

# 입력 피처 이름
feature_names_in = ["feature1", "feature2", "feature3"]

# 새로운 피처 이름 확인
new_feature_names = transformer_with_names.get_feature_names_out(feature_names_in)
print(new_feature_names)

 

결과는 다음과 같음:

['double_feature1' 'double_feature2' 'double_feature3']

Summary

  • FunctionTransformer는 사용자가 정의한 함수를 transformer (=fit(), transform()메서드 가짐)로 바꿔줌.
    • 데이터 변환 로직을 encapsulation.
    • Pipeline에서 일관되게 사용할 수 있음.
  • 다음의 파라미터를 생성할 때 꼭 입력할 것:
    • func는 데이터를 변환하는 함수
    • inverse_func는 변환된 데이터를 다시 복원하는 역변환 함수.
    • feature_names_out 에 반환되는 데이터의 features를 구할 수 있는 함수를 지정:
      • def xxx(function_transformer, feature_names_in) : header의 형식은 반드시 지켜야 함.
      • 이를 지정해놓으면 get_feature_names_out(feature_names_in) 메서드가 자동으로 구현됨.

 

Pipeline에서 FunctionTransformer를 사용하여 전처리 과정에서 fit가 필요없는 특수한 변환을 손쉽게 구현할 수 있음.


같이 살펴보면 좋은 자료

2024.10.01 - [Programming/ML] - [ML] scikit-learn: Custom Transformer

 

[ML] scikit-learn: Custom Transformer

scikit-learn에서 Custom Transformer 구현하기 scikit-learn에서는 데이터 전처리를 위한 다양한 transformer를 제공하지만,경우에 따라서는 특정 요구 사항에 맞는 custom transformer를 직접 구현해야 할 때가 있

dsaint31.tistory.com

2024.10.03 - [Programming/ML] - [ML] scikit-learn: Pipeline 사용법

 

[ML] scikit-learn: Pipeline 사용법

Scikit-learn의 Pipeline은 여러 데이터 처리 과정을 하나로 묶어 효율적으로 실행할 수 있게 해주는 Class.(일반적인) Pipeline 이란?Pipeline은 일반적으로 (데이터) 처리 과정 또는 기계학습 등에서 “여러

dsaint31.tistory.com


 

'Programming > ML' 카테고리의 다른 글

[ML] kNN Classifier (k-Nearest Neighbors Classifier)  (0) 2024.10.05
[ML] Imputation  (0) 2024.10.05
[ML] scikit-learn: Pipeline 사용법  (0) 2024.10.03
[ML] scikit-learn: ColumnTransformer  (0) 2024.10.03
[ML] Minkowski Distance (L-p Norm)  (0) 2024.10.02
'Programming/ML' 카테고리의 다른 글
  • [ML] kNN Classifier (k-Nearest Neighbors Classifier)
  • [ML] Imputation
  • [ML] scikit-learn: Pipeline 사용법
  • [ML] scikit-learn: ColumnTransformer
dsaint31x
dsaint31x
    반응형
    250x250
  • dsaint31x
    Dsaint31's blog
    dsaint31x
  • 전체
    오늘
    어제
    • 분류 전체보기 (770)
      • Private Life (13)
      • Programming (200)
        • DIP (116)
        • ML (28)
      • Computer (119)
        • CE (53)
        • ETC (33)
        • CUDA (3)
        • Blog, Markdown, Latex (4)
        • Linux (9)
      • ... (362)
        • Signals and Systems (110)
        • Math (175)
        • Linear Algebra (33)
        • Physics (43)
        • 인성세미나 (1)
      • 정리필요. (59)
        • 의료기기의 이해 (6)
        • PET, MRI and so on. (5)
        • 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
    • 기타 방사능관련.
  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바