본문 바로가기
AI/Machine-Learning

[sklearn] make_pipeline() & make_column_transformer()

by Wikinist 2023. 8. 29.

make_pipeline

sklearn.pipeline 모듈의 make_pipeline 함수는 Scikit-learn 라이브러리에서 파이프라인을 생성하는 데 사용되는 편리한 함수입니다. 파이프라인은 일련의 데이터 변환 및 모델링 단계를 순차적으로 연결하여 데이터 전처리와 머신러닝 모델 학습을 간편하게 수행할 수 있도록 도와줍니다.

파이프라인은 보통 데이터의 전처리 단계와 모델 학습 단계로 구성됩니다. make_pipeline 함수는 이러한 단계들을 순서대로 연결하여 파이프라인을 생성하는 역할을 합니다. 이 함수는 생성된 파이프라인에 자동으로 고유한 이름을 할당하므로 단계마다 구분할 필요가 없습니다.

파이프라인을 생성할 때 각 단계는 Scikit-learn의 변환기(transformer)나 추정기(estimator) 객체로 제공됩니다. 변환기는 데이터를 변환하거나 전처리하는 데 사용되며, 추정기는 모델을 학습하거나 예측하는 데 사용됩니다.

파이프라인의 동작 과정

데이터 준비: 입력 데이터가 주어집니다.
첫 번째 단계 적용: 첫 번째 변환기가 입력 데이터에 적용됩니다.
두 번째 단계 적용: 두 번째 변환기가 첫 번째 단계의 결과에 적용됩니다.
나머지 단계 적용: 이어지는 모든 변환기와 추정기가 이전 단계의 결과에 순차적으로 적용됩니다.
최종 결과 반환: 파이프라인의 마지막 단계의 결과가 반환됩니다.
파이프라인을 사용하면 데이터 전처리와 모델 학습 단계를 각각 따로 다루지 않아도 되므로 코드를 더 간결하게 작성할 수 있고, 예측 단계에서도 동일한 전처리가 적용되어 일관된 결과를 얻을 수 있습니다.

예를 들어, 데이터의 특성을 스케일링한 후 로지스틱 회귀 모델을 학습하는 파이프라인을 생성하고 사용하는 코드는 다음과 같습니다:

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

# 파이프라인 생성: 스케일링 -> 로지스틱 회귀
pipeline = make_pipeline(StandardScaler(), LogisticRegression())

# 파이프라인 학습
pipeline.fit(X_train, y_train)

# 파이프라인 예측
y_pred = pipeline.predict(X_test)


이 예제에서 StandardScaler는 데이터 스케일링을 수행하는 변환기이고, LogisticRegression은 로지스틱 회귀 모델을 나타내는 추정기입니다. 이 두 단계가 make_pipeline을 사용하여 하나의 파이프라인으로 연결되었습니다.

y_pred = pipeline.predict(X_test)는 생성한 파이프라인을 사용하여 입력 데이터 X_test에 대한 예측값을 계산하는 과정을 나타냅니다. 이 과정은 다음과 같은 단계로 이루어집니다:

입력 데이터 전달: 예측하려는 샘플 데이터인 X_test가 입력됩니다.

변환 단계 적용: 입력 데이터 X_test는 파이프라인의 첫 번째 단계인 StandardScaler 변환기에 전달됩니다. 이 단계에서는 입력 데이터의 각 특성을 평균과 표준 편차를 사용하여 스케일링합니다. 이로써 각 특성의 분포가 평균이 0이고 표준 편차가 1이 되도록 조정됩니다.

모델 예측: 스케일링된 데이터가 다음 단계인 LogisticRegression 모델에 입력됩니다. 이 모델은 입력 데이터의 특성을 기반으로 클래스 레이블을 예측합니다. 즉, 입력 데이터가 어떤 클래스에 속하는지를 예측하는 결과를 반환합니다.

예측 결과 반환: 모델의 예측 결과인 클래스 레이블 또는 확률 값이 y_pred에 저장됩니다. 이 값은 입력 데이터 X_test에 대한 예측값을 나타냅니다.

전체적으로, pipeline.predict(X_test)는 파이프라인을 따라 입력 데이터를 전달하고 변환 및 모델 예측 단계를 거쳐 최종 예측 결과를 반환하는 것입니다. 이렇게 함으로써 데이터의 전처리와 모델 예측이 일관되게 수행되며, 별도로 각 단계를 관리하거나 적용할 필요가 없어집니다.

make_column_transformer

make_column_transformer 함수는 Scikit-learn 라이브러리에서 제공하는 유틸리티 함수 중 하나로, 다양한 열(특성)에 대해 서로 다른 전처리 변환을 적용할 수 있는 Column Transformer를 생성하기 위해 사용됩니다. 데이터의 특성을 선택적으로 변환하거나 조작하고자 할 때 유용합니다.

데이터셋에는 수치형, 범주형 등 다양한 유형의 특성이 있을 수 있습니다. make_column_transformer 함수는 이러한 특성들에 대해 각각 다른 전처리 기능을 적용하기 위한 구조를 만들어줍니다.

함수의 주요 매개변수와 사용법

from sklearn.compose import make_column_transformer

# make_column_transformer 생성
# (transformer, columns) 형태로 각 특성의 전처리 변환과 해당 열을 지정합니다.
# 여러 개의 (transformer, columns) 튜플을 넘길 수 있습니다.
column_transformer = make_column_transformer(
    (transformer_1, columns_1),
    (transformer_2, columns_2),
    ...
)

transformer: 특성에 적용할 변환기(전처리 함수 또는 변환 클래스)입니다. 예를 들어, StandardScaler, OneHotEncoder 등이 될 수 있습니다.
columns: 변환을 적용할 특성(열)의 인덱스나 이름을 지정합니다. 리스트 형태로 여러 열을 지정할 수 있습니다.
make_column_transformer 함수는 이렇게 생성된 전처리 단계들을 하나의 변환기로 사용할 수 있는데, 이 변환기를 Scikit-learn의 파이프라인(Pipeline)과 함께 사용하면 각 열에 대해 지정한 전처리를 적용하고, 다른 변환들과 함께 파이프라인에 넣을 수 있습니다.

make_column_transformer를 파이프라인에 통합

make_pipeline 함수를 사용하여 make_column_transformer를 파이프라인에 통합하는 예시를 보여드리겠습니다. 
예를 들어, 수치형 데이터와 범주형 데이터가 혼합된 데이터셋에서 수치형 특성은 스케일링을 하고, 범주형 특성은 원-핫 인코딩을 수행하도록 하는 경우를 가정해보겠습니다.

from sklearn.compose import make_column_transformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline

# 수치형 특성의 스케일링
numeric_features = [0, 1, 2]  # 예시 데이터에서 수치형 특성의 인덱스
numeric_transformer = StandardScaler()

# 범주형 특성의 원-핫 인코딩
categorical_features = [3, 4]  # 예시 데이터에서 범주형 특성의 인덱스
categorical_transformer = OneHotEncoder()

# 각각의 전처리 단계를 적용하기 위한 ColumnTransformer 생성
preprocessor = make_column_transformer(
    (numeric_transformer, numeric_features),
    (categorical_transformer, categorical_features)
)

# 전처리된 데이터를 사용하여 로지스틱 회귀 모델 학습하는 파이프라인 생성
pipeline = make_pipeline(preprocessor, LogisticRegression())

# 데이터 학습 및 예측
pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)

위 코드에서 make_column_transformer를 사용하여 수치형 특성에는 StandardScaler를, 범주형 특성에는 OneHotEncoder를 적용하는 전처리 단계를 생성하였습니다. 이렇게 생성된 전처리 단계를 make_pipeline을 통해 LogisticRegression 모델과 함께 하나의 파이프라인으로 묶어서 학습하고 예측하는 것을 볼 수 있습니다.

해당 게시글은 ChatGPT의 도움을 받아 작성되었습니다.

'AI > Machine-Learning' 카테고리의 다른 글

[sklearn] LogisticRegression  (0) 2023.08.29
Logit과 Sigmoid함수와 로지스틱회귀  (0) 2023.08.29
데이터 인코더(Label, OneHot)  (0) 2023.08.29
[NumPy] ravel() - 데이터 1차원 변환  (0) 2023.08.29
[sklearn] inverse_transform  (0) 2023.08.29