(Python) sklearn 파이프라인 + ColumnTransformers

색인


    Python sklearn 파이프라인이란 무엇입니까?

    ColumnTransformers는 강력한 기능이지만 열을 여러 단계로 처리해야 하는 경우 충분하지 않습니다.

    파이프라인 기능은 복잡한 프로세스를 단계별로 처리할 수 있도록 여러 트랜스포머를 체인으로 연결합니다. 앞에서 배운 ConlumnTransformer 함수도 파이프라인의 체인에 넣을 수 있습니다.

    이 문서에 사용된 예제에서는 다음 구조를 사용합니다.


    그림에서와 같이 Non 값은 3×5 행렬에 무작위로 삽입됩니다.

    ColumnTransformer를 사용하여 데이터를 원하는 형식으로 처리합니다.

    이 시점에서 사용자는 필요한 열만 선택하여 파이프라인에 넣습니다. 여기에서 Random_2 열의 값과 나머지 단순 입력 값을 파이프라인에 넣습니다. random_2 열은 파이프라인에 열거된 SimpleImputer, FunctionTransformer 및 StandardScaler 함수를 순서대로 적용합니다.

    실제 사례를 통해 쉽게 이해해 보자.

    Python sklearn 파이프라인 예제 실습

    샘플 코드는 기사 하단에서 다운로드할 수 있습니다.

    전체 샘플 코드>>

    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개를 만들고, None에 0.3보다 작은 값을 삽입하고, 나머지는 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와 함께 작동합니다. 파이프라인과 나머지는 그 아래에 놓습니다.

    파이프라인은 (random_2) 열에서만 작동합니다. 애플리케이션 콘텐츠는 SimpleImputer, FunctionTransformer, StandardScaler입니다. 나머지는 SimpleImputer를 사용하여 값이 아닌 것을 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 배열 형태로 변경되며 이전에 파이프라인이 적용된 컬럼이 첫 번째 컬럼이 되므로 주의하여 사용하시기 바랍니다.