사용자가 정의한 함수를 파이프라인에서 변환기(transformer)로 사용할 수 있게 해주는 유용한 Class.
- 전처리나 특정 데이터 변환 작업이 필요할 때,
- 이를 FunctionTransformer로 간편하게 적용할 수 있습니다.
이를 통해, fit가 필요하지 않은 사용자 정의 변환을 손쉽게 Scikit-learn의 Pipeline에 포함시켜 다양한 데이터를 처리할 수 있음
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
:- 입력 데이터가 유효한지 확인할지 여부를 결정.
True
로 설정하면 입력 데이터를 검증하는데, 다차원 배열 등의 검증을 할 수 있음.
accept_sparse
:- 희소 행렬(sparse matrix)을 허용할지 여부를 결정.
- 희소 행렬을 다룰 경우
True
로 설정.
check_inverse
:func
와inverse_func
가 서로 역관계를 가지는지 확인.- 기본값은
True
.
feature_names_out
:- 변환된 features의 이름을 정의할 때 사용하는 함수.
- 이 함수는 features 이름을 받아 출력 features의 이름을 반환.
kw_args
:func
에 추가로 전달할 인자들.
inv_kw_args
:inverse_func
에 추가로 전달할 인자들.
FunctionTransformer 사용 예제
간단한 예제로,
- 데이터를 변환하여 각 값을 2배로 만드는 함수를
FunctionTransformer
를 통해 transformer로 변환
https://gist.github.com/dsaint31x/6faca7cbe3f063db88d7549977fc7ef0
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. 역변환(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]]
feature_names_out 에 할당 가능한 함수
feature_names_out
:
변환된 features의 이름들을 지정. : 지정하지 않을 경우, get_feature_names_out
함수가 구현되지 않음
구현 방식:
feature_names_out
은
- 문자열의 List 로 직접 이름이 지정되거나,
- 함수로 지정되며 해당 함수는 두 개의 parameters를 받아 출력 features의 이름을 반환하도록 구현됨:
함수의 두 개의 parameter는 다음과 같음:
function_transformer
: 실제 변환을 수행하는FunctionTransformer
객체.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로 바꿔줌.- 데이터 변환 로직을 encapsulation.
- Pipeline에서 일관되게 사용할 수 있음.
func
는 데이터를 변환하는 함수inverse_func
는 변환된 데이터를 다시 복원하는 역변환 함수.
Pipeline
에서 FunctionTransformer
를 사용하여 전처리 과정에서 fit가 필요없는 특수한 변환을 손쉽게 구현할 수 있음.
같이 살펴보면 좋은 자료
2024.10.01 - [Programming/ML] - [ML] scikit-learn: Custom Transformer
'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 |