파이썬(Python)/머신러닝(Machine Learning)

[Python] sklearn 파이프라인(Pipeline) + ColumnTransformers

끄적끄적아무거나 2023. 2. 14. 09:12
반응형

 

목차

     

     

     

     

    파이썬 sklearn 파이프라인(Pipeline) 이란?

    ColumnTransformers는 강력한 기능이지만 Column(열)을 단계별 스텝(Multiple step)으로 처리해야하는 경우 충분하지 않습니다. 

     

    파이프라인(Pipeline) 기능은 여러개의 transformer를 체인 형식으로 연결해서 복잡한 프로세스를 단계별로 처리하게 도와 줍니다. 앞서 배운 ConlumnTransformer 함수도 파이프 라인의 체인에 넣을 수 있습니다. 

     

     

    이번 포스트에서 사용할 예제는 아래와 같은 구조로 사용합니다.

    그림과 같이 3x5의 행렬에 Non 값을 랜덤하게 넣습니다. 

     

    해당 데이터를 원하는 형식으로 가공하는데 ColumnTransformer를 사용해서 가공 합니다. 

     

    이때 사용자가 원하는 열부분만을 선택해서 파이프라인에 넣습니다. 여기서는 Random_2 열의 값을 파이프라인에 넣고 나머지(remainder)는 단순 입력 값을 넣습니다. random_2 열은 파이프라인에 열거된 SimpleImputer, FunctionTransformer, StandardScaler 함수를 하나씩 차례대로 적용하게 됩니다. 

     

    아래 실제 예제를 통해 쉽게 이해해보도록 하겠습니다.

     

     

     

     

     

     

     

    파이썬 sklearn 파이프라인(Pipeline) 예제 실습

    예제 코드는 글 하단에 다운로드 받을 수 있습니다.

     

    전체 예제 코드>>

    from sklearn.compose import ColumnTransformer
    from sklearn.impute import SimpleImputer
    from sklearn.pipeline import Pipeline
    from sklearn.preprocessing import FunctionTransformer
    from sklearn.preprocessing import StandardScaler
    import pandas as pd
    import numpy as np
    
    
    data_df = pd.DataFrame({
        "random_1":np.where(np.random.uniform(0,1,5)<0.3, np.nan, np.random.randint(0,10,5) ),
        "random_2":np.where(np.random.uniform(0,1,5)<0.3, np.nan, np.random.randint(0,10,5) ),
        "random_3":np.where(np.random.uniform(0,1,5)<0.3, np.nan, np.random.randint(0,10,5) ),
    })
    
    col_transformer = ColumnTransformer(
        [
           (
              "random2_Pipeline",
              Pipeline([
                ("MeanImputer"      , SimpleImputer(strategy="mean")),
                ("LogTransformation", FunctionTransformer(lambda value: np.log1p(value)) ),
                ("StdScaler",         StandardScaler() ),
              ]),
              ["random_2"]
            ),
        ],
        remainder=SimpleImputer(strategy="constant", fill_value=7)
      )
    
    print(data_df)
    col_data_df = col_transformer.fit_transform(data_df)
    print(col_data_df)
    print(type(col_data_df))

     

     

     

    결과>>

       random_1  random_2  random_3
    0       6.0       7.0       NaN
    1       4.0       9.0       5.0
    2       6.0       2.0       9.0
    3       2.0       NaN       NaN
    4       NaN       NaN       8.0
    [[ 0.50078424  6.          7.        ]
     [ 1.04602424  4.          5.        ]
     [-1.89582252  6.          9.        ]
     [ 0.17450702  2.          7.        ]
     [ 0.17450702  7.          8.        ]]
    <class 'numpy.ndarray'>

     

     

     

     

     

    주석>>

    data_df = pd.DataFrame({
        "random_1":np.where(np.random.uniform(0,1,5)<0.3, np.nan, np.random.randint(0,10,5) ),
        "random_2":np.where(np.random.uniform(0,1,5)<0.3, np.nan, np.random.randint(0,10,5) ),
        "random_3":np.where(np.random.uniform(0,1,5)<0.3, np.nan, np.random.randint(0,10,5) ),
    })

    판다스(Pandas) DataFrame 셋을 정수 랜덤 값으로 만들어 줍니다.

    where 함수를 사용해서 0~1사이의 실수를 5개 만들고 해당 값 중에 0.3 이하의 값은 None 값을 넣어주고 나머지는 0~10사이 정수로 5개 채워 줍니다. 해당 결과가 아래와 같이 만들어 진것입니다.

     

       random_1  random_2  random_3
    0       6.0       7.0       NaN
    1       4.0       9.0       5.0
    2       6.0       2.0       9.0
    3       2.0       NaN       NaN
    4       NaN       NaN       8.0

     

     

     

    col_transformer = ColumnTransformer(
        [
           (
              "random2_Pipeline",
              Pipeline([
                ("MeanImputer"      , SimpleImputer(strategy="mean")),
                ("LogTransformation", FunctionTransformer(lambda value: np.log1p(value)) ),
                ("StdScaler",         StandardScaler() ),
              ]),
              ["random_2"]
            ),
        ],
        remainder=SimpleImputer(strategy="constant", fill_value=7)
      )

    전체 코드는 ColumnTransformer로 동작합니다. 그 아래에 Pipeline과 remainder를 놓습니다.

    Pipeline은 [random_2] 열만을 적용합니다. 적용 내용은 SimpleImputer, FunctionTransformer, StandardScaler 입니다. remainder에는 SimpleImputer을 사용해서 Non 값에 7로 채워 넣습니다.

     

     

     

    print(data_df)
    col_data_df = col_transformer.fit_transform(data_df)
    print(col_data_df)
    print(type(col_data_df))

    결과를 출력합니다. ColumnTransformer 으로 출력된 값은 numpy ndarray 어레이 형태로 변경이 되고 앞서 파이프 라인을 적용한 열이 첫번째 열로 바뀌니 이를 주의해서 사용해야 합니다. 

     

     

     

    코드 다운로드>>

    pipeline.py
    0.00MB

    반응형