Snowpark ML Modeling: ML 모델 개발

참고

Snowpark ML Modeling API는 패키지 버전 1.1.1부터 일반 공급으로 제공됩니다. 아직 개발 중인 일부 기능은 미리 보기 기능으로 표시됩니다.

Snowpark ML Modeling은 데이터 전처리와 모델 학습을 위한 Python API 모음입니다. Snowflake 내에서 Snowpark ML Modeling을 사용하여 이러한 작업을 수행하면 다음을 수행할 수 있습니다.

  • 데이터를 Snowflake 외부로 이동하지 않고도 데이터를 변환하고 모델을 학습할 수 있습니다.

  • scikit-learn과 같이 이미 익숙한 API와 유사한 API로 작업할 수 있습니다.

  • Snowflake의 보안 및 거버넌스 프레임워크 내에서 ML 파이프라인을 계속 실행할 수 있습니다.

  • Snowflake 가상 웨어하우스의 성능과 확장성을 활용할 수 있습니다.

이 항목에서 설명하는 Snowpark ML Modeling 패키지는 scikit-learn, xgboost 및 lightgbm 라이브러리에 있는 것과 유사한 API를 가진 추정기와 변환기를 제공합니다. 이러한 API를 사용하여 Snowflake 내에서 머신 러닝 모델을 만들어 학습시킬 수 있습니다.

Snowpark ML Modeling에 대한 간략한 소개는 빠른 시작 을 참조하십시오.

참고

이 항목에서는 Snowpark ML 모듈과 해당 모델링 종속성이 이미 설치되어 있다고 가정합니다. Snowpark ML 설치하기 섹션을 참조하십시오.

다음 예제를 검토하여 Snowpark ML Modeling API와 이미 능숙하게 활용하실 수도 있는 머신 러닝 라이브러리의 유사점을 파악해 보십시오.

전처리

이 예제에서는 Snowpark ML Modeling 데이터 전처리 및 변환 함수를 사용하는 방법을 보여줍니다. 예제에서 사용하는 두 전처리 함수(MixMaxScalerOrdinalEncoder)는 Snowflake의 분산 처리 엔진을 사용하여 클라이언트 측 또는 저장 프로시저 구현에 비해 상당한 성능 향상 효과를 제공합니다. 자세한 내용은 분산 전처리 섹션을 참조하십시오.

import numpy as np
import pandas as pd
import random
import string

from sklearn.datasets import make_regression
from snowflake.ml.modeling.preprocessing import MinMaxScaler, OrdinalEncoder
from snowflake.ml.modeling.pipeline import Pipeline
from snowflake.snowpark import Session

# Create a session with your preferred method
# session =

NUMERICAL_COLS = ["X1", "X2", "X3"]
CATEGORICAL_COLS = ["C1", "C2", "C3"]
FEATURE_COLS = NUMERICAL_COLS + CATEGORICAL_COLS
CATEGORICAL_OUTPUT_COLS = ["C1_OUT", "C2_OUT", "C3_OUT"]
FEATURE_OUTPUT_COLS = ["X1_FEAT_OUT", "X2_FEAT_OUT", "X3_FEAT_OUT", "C1_FEAT_OUT", "C2_FEAT_OUT", "C3_FEAT_OUT"]

# Create a dataset with numerical and categorical features
X, _ = make_regression(
    n_samples=1000,
    n_features=3,
    noise=0.1,
    random_state=0,
)

def generate_random_string(length):
    return "".join(random.choices(string.ascii_uppercase, k=length))

num_categorical_cols, categorical_feature_length = 3, 2
categorical_features = []
for _ in range(num_categorical_cols):
    categorical_column = [generate_random_string(categorical_feature_length) for _ in range(X.shape[0])]
    categorical_features.append(categorical_column)
X = np.column_stack((X, *categorical_features))
X = pd.DataFrame(X, columns=FEATURE_COLS)

features_df = session.create_dataframe(X)

# Fit a pipeline with OrdinalEncoder and MinMaxScaler on Snowflake
pipeline = Pipeline(
    steps=[
        (
            "OE",
            OrdinalEncoder(
                input_cols=CATEGORICAL_COLS,
                output_cols=CATEGORICAL_OUTPUT_COLS,
            )
        ),
        (
            "MMS",
            MinMaxScaler(
                input_cols=NUMERICAL_COLS + CATEGORICAL_OUTPUT_COLS,
                output_cols=FEATURE_OUTPUT_COLS,
            )
        ),
    ]
)

pipeline.fit(features_df)

# Use the pipeline to transform a dataset.
result = pipeline.transform(features_df)
Copy

학습

이 예제에서는 Snowpark ML Modeling을 사용하여 간단한 xgboost 분류기 모델을 학습시킨 다음 예측을 실행하는 방법을 보여줍니다. 여기서 Snowpark ML API는 xgboost와 유사하며 열 지정 방법이 약간 다를 뿐입니다. 이러한 차이점에 대한 자세한 내용은 일반적인 API 차이점 섹션을 참조하십시오.

import pandas as pd
from sklearn.datasets import make_classification

from snowflake.ml.modeling.xgboost import XGBClassifier
from snowflake.ml.utils.connection_params import SnowflakeLoginOptions
from snowflake.snowpark import Session

# Create a session with your preferred method
# session =

FEATURE_COLS = ["X1", "X2", "X3", "X4", "X5", "X6"]
LABEL_COLS = ["Y"]
OUTPUT_COLS = ["PREDICTIONS"]

# Set up data.
X, y = make_classification(
    n_samples=40000,
    n_features=6,
    n_informative=4,
    n_redundant=1,
    random_state=0,
    shuffle=True,
)

X = pd.DataFrame(X, columns=FEATURE_COLS)
y = pd.DataFrame(y, columns=LABEL_COLS)

features_pandas = pd.concat([X, y], axis=1)
features_df = session.create_dataframe(features_pandas)

# Train an XGBoost model on snowflake.
xgboost_model = XGBClassifier(
    input_cols=FEATURE_COLS,
    label_cols=LABEL_COLS,
    output_cols=OUTPUT_COLS
)

xgboost_model.fit(features_df)

# Use the model to make predictions.
predictions = xgboost_model.predict(features_df)
predictions[OUTPUT_COLS].show()
Copy

비합성 데이터에 대한 특성 전처리 및 학습

이 예제에서는 지상 기반 대기 관측 체렌코프 망원경의 고에너지 감마 입자 데이터를 사용합니다. 이 망원경으로는 감마선으로 시작된 전자기 샤워에서 생성되는 하전 입자가 방출하는 방사선을 이용하여 고에너지 감마 입자를 관찰할 수 있습니다. 검출기가 대기를 통해 누출되는 (가시광선부터 자외선 파장까지의) 체렌코프 방사선을 기록하여 감마 샤워 매개 변수를 재구성할 수 있습니다. 또한 이 망원경으로 우주선 샤워에 풍부한 하드론 광선을 감지하고 감마선을 모방하는 신호를 생성할 수도 있습니다.

목표는 감마선과 하드론 광선을 구별하는 분류 모델을 개발하는 것입니다. 과학자들은 이 모델을 사용해 배경 잡음을 걸러내고 순수한 감마선 신호에 집중할 수 있습니다. 그래서 감마선을 통해 별의 탄생과 죽음, 우주 폭발, 극한 조건에서의 물질 거동과 같은 우주적 사건을 관찰할 수 있습니다.

입자 데이터는 MAGIC Gamma Telescope 에서 다운로드할 수 있습니다. 데이터를 다운로드하여 압축을 풀고 DATA_FILE_PATH 변수가 데이터 파일을 가리키도록 설정한 후 아래 코드를 실행하여 Snowflake에 로드합니다.

DATA_FILE_PATH = "~/Downloads/magic+gamma+telescope/magic04.data"

# Setup
from snowflake.ml.utils.connection_params import SnowflakeLoginOptions
from snowflake.snowpark import Session
import posixpath
import os

##
# Note: Create session https://docs.snowflake.com/en/developer-guide/snowpark/reference/python/latest/api/snowflake.snowpark.Session
##
session = Session.builder.configs(SnowflakeLoginOptions()).create()

session.sql("""
CREATE OR REPLACE TABLE Gamma_Telescope_Data(
    F_LENGTH FLOAT,
    F_WIDTH FLOAT,
    F_SIZE FLOAT,
    F_CONC FLOAT,
    F_CONC1 FLOAT,
    F_ASYM FLOAT,
    F_M3_LONG FLOAT,
    F_M3_TRANS FLOAT,
    F_ALPHA FLOAT,
    F_DIST FLOAT,
    CLASS VARCHAR(10))
""").collect()
session.sql("CREATE OR REPLACE STAGE SNOWPARK_ML_TEST_DATA_STAGE").collect()
session.file.put(
    DATA_FILE_PATH,
    "SNOWPARK_ML_TEST_DATA_STAGE/magic04.data",
    auto_compress=False,
    overwrite=True,
)

session.sql("""
COPY INTO Gamma_Telescope_Data FROM @SNOWPARK_ML_TEST_DATA_STAGE/magic04.data
FILE_FORMAT = (TYPE = 'CSV' field_optionally_enclosed_by='"',SKIP_HEADER = 0);
""").collect()

session.sql("select * from Gamma_Telescope_Data limit 5").collect()
Copy

데이터를 로드한 후 아래의 단계에 따라 다음 코드를 사용하여 학습하고 예측합니다.

  • 데이터 전처리:

    • 누락된 값을 평균으로 바꿉니다.

    • 표준 스케일러를 사용하여 데이터를 중앙에 배치합니다.

  • 이벤트 유형을 결정하도록 xgboost 분류기를 학습시킵니다.

  • 학습 데이터 세트와 테스트 데이터 세트에서 모두 모델의 정확성을 테스트합니다.

from snowflake.ml.utils.connection_params import SnowflakeLoginOptions
from snowflake.snowpark import Session, DataFrame

from snowflake.ml.modeling.preprocessing import StandardScaler
from snowflake.ml.modeling.impute import SimpleImputer
from snowflake.ml.modeling.pipeline import Pipeline
from snowflake.ml.modeling.xgboost import XGBClassifier

from snowflake.ml.modeling.metrics import accuracy_score

##
# Note: Create session https://docs.snowflake.com/en/developer-guide/snowpark/reference/python/latest/api/snowflake.snowpark.Session
##
session = Session.builder.configs(SnowflakeLoginOptions()).create()

# Step 1: Create train and test dataframes
all_data = session.sql("select *, IFF(CLASS = 'g', 1.0, 0.0) as LABEL from Gamma_Telescope_Data").drop("CLASS")
train_data, test_data = all_data.random_split(weights=[0.9, 0.1], seed=0)

# Step 2: Construct training pipeline with preprocessing and modeling steps
FEATURE_COLS = [c for c in train_data.columns if c != "LABEL"]
LABEL_COLS = ["LABEL"]

pipeline = Pipeline(steps = [
    ("impute", SimpleImputer(input_cols=FEATURE_COLS, output_cols=FEATURE_COLS)),
    ("scaler", StandardScaler(input_cols=FEATURE_COLS, output_cols=FEATURE_COLS)),
    ("model", XGBClassifier(input_cols=FEATURE_COLS, label_cols=LABEL_COLS))
])

# Step 3: Train
pipeline.fit(train_data)

# Step 4: Eval
predict_on_training_data = pipeline.predict(train_data)
training_accuracy = accuracy_score(df=predict_on_training_data, y_true_col_names=["LABEL"], y_pred_col_names=["OUTPUT_LABEL"])

predict_on_test_data = pipeline.predict(test_data)
eval_accuracy = accuracy_score(df=predict_on_test_data, y_true_col_names=["LABEL"], y_pred_col_names=["OUTPUT_LABEL"])

print(f"Training accuracy: {training_accuracy} \nEval accuracy: {eval_accuracy}")
Copy

분산 하이퍼 매개 변수 최적화

이 예제에서는 Snowpark ML의 scikit-learn GridSearchCV 구현을 사용하여 분산 하이퍼 매개 변수 최적화를 실행하는 방법을 보여줍니다. 개별 실행은 분산된 웨어하우스 컴퓨팅 리소스를 사용하여 병렬로 실행됩니다. 분산 하이퍼 매개 변수 최적화에 대한 자세한 내용은 분산 하이퍼 매개 변수 최적화 섹션을 참조하십시오.

from snowflake.snowpark import Session, DataFrame
from snowflake.ml.utils.connection_params import SnowflakeLoginOptions

from sklearn.datasets import make_classification
from snowflake.snowpark import Session, DataFrame
from snowflake.ml.modeling.xgboost import XGBClassifier
from snowflake.ml.modeling.model_selection.grid_search_cv import GridSearchCV

FEATURE_COLS = ["X1", "X2", "X3", "X4", "X5", "X6"]
LABEL_COLS = ["Y"]
OUTPUT_COLS = ["PREDICTIONS"]

# Create a session using your favorite login option.
# In this example we use a session builder with `SnowflakeLoginOptions`.
session = Session.builder.configs(SnowflakeLoginOptions()).create()

# Set up data.
def set_up_data(session: Session, n_samples: int) -> DataFrame:
    X, y = make_classification(
        n_samples=n_samples,
        n_features=6,
        n_informative=2,
        n_redundant=0,
        random_state=0,
        shuffle=True,
    )

    X = pd.DataFrame(X, columns=FEATURE_COLS)
    y = pd.DataFrame(y, columns=LABEL_COLS)

    features_pandas = pd.concat([X, y], axis=1)
    features_pandas.head()

    features_df = session.create_dataframe(features_pandas)
    return features_df

features_df = set_up_data(session, 10**4)

# Create a warehouse to use for the tuning job.
session.sql(
    """
CREATE or replace warehouse HYPERPARAM_WH
    WITH WAREHOUSE_SIZE = 'X-SMALL'
    WAREHOUSE_TYPE = 'Standard'
    AUTO_SUSPEND = 60
    AUTO_RESUME = TRUE
    INITIALLY_SUSPENDED = FALSE;"""
).collect()
session.use_warehouse("HYPERPARAM_WH")

# Tune an XGB Classifier model using sklearn GridSearchCV.
DISTRIBUTIONS = dict(
    n_estimators=[10, 50],
    learning_rate=[0.01, 0.1, 0.2],
)
estimator = XGBClassifier()
grid_search_cv = GridSearchCV(estimator=estimator, param_grid=DISTRIBUTIONS, input_cols=FEATURE_COLS, label_cols=LABEL_COLS, output_cols=OUTPUT_COLS)

grid_search_cv.fit(features_df)

# Use the best model to make predictions.
predictions = grid_search_cv.predict(features_df)
predictions[OUTPUT_COLS].show()

# Retrieve sklearn model, and print the best score
sklearn_grid_search_cv = grid_search_cv.to_sklearn()
print(sklearn_grid_search_cv.best_score_)
Copy

분산 최적화의 힘을 실제로 확인하려면 백만 행의 데이터를 학습하십시오.

large_features_df = set_up_data(session, 10**6)

# Scale up the warehouse for a faster fit. This takes 2m15s to run on an L warehouse versus 4m5s on a XS warehouse.
session.sql(f"ALTER WAREHOUSE {session.get_current_warehouse()} SET WAREHOUSE_SIZE='LARGE'").collect()

grid_search_cv.fit(large_features_df)
print(grid_search_cv.to_sklearn().best_score_)
Copy

Snowpark ML Modeling 클래스

모든 Snowpark ML Modeling 및 전처리 클래스는 snowflake.ml.modeling 네임스페이스에 있습니다. Snowpark ML 모듈은 sklearn 네임스페이스의 해당 모듈과 이름이 같습니다. 예를 들어 sklearn.calibration 에 해당하는 Snowpark ML 모듈은 snowflake.ml.modeling.calibration 입니다. xgboostlightgbm 모듈은 각각 snowflake.ml.modeling.xgboostsnowflake.ml.modeling.lightgbm 에 해당합니다.

Snowpark ML Modeling API는 기본 scikit-learn, xgboost 및 lightgbm 클래스의 래퍼를 제공하며, 그 대부분은 가상 웨어하우스에서 (단일 웨어하우스 노드에서 작동하는) 저장 프로시저로 실행됩니다. scikit-learn의 모든 클래스가 Snowpark ML에서 지원되는 것은 아닙니다. 현재 사용 가능한 클래스의 목록은 Snowpark ML API 참조 를 확인하십시오.

일부 클래스(전처리 및 메트릭 클래스 포함)는 분산 실행을 지원하며 동일한 작업을 로컬에서 실행하는 것에 비해 상당한 성능 이점을 제공할 수 있습니다. 자세한 내용은 분산 전처리분산 하이퍼 매개 변수 최적화 섹션을 참조하십시오. 아래 표에는 분산 실행을 지원하는 특정 클래스가 나열되어 있습니다.

Snowpark ML 모듈 이름

분산 클래스

snowflake.ml.modeling.impute

  • SimpleImputer

snowflake.ml.modeling.metrics

correlation:

  • correlation

covariance:

  • covariance

classification:

  • accuracy_score

  • confusion_matrix

  • f1_score

  • fbeta_score

  • log_loss

  • precision_recall_fscore_support

  • precision_score

  • recall_score

regression:

  • mean_absolute_error

  • mean_absolute_percentage_error

  • mean_squared_error

snowflake.ml.modeling.model_selection

  • GridSearchCV

  • RandomizedSearchCV

snowflake.ml.modeling.preprocessing

  • Binarizer

  • KBinsDiscretizer

  • LabelEncoder

  • MaxAbsScaler

  • MinMaxScaler

  • Normalizer

  • OneHotEncoder

  • OrdinalEncoder

  • RobustScaler

  • StandardScaler

일반적인 API 차이점

모델링 API에 대한 전체 세부 정보는 Snowpark ML API 참조 를 확인하십시오.

Snowpark ML Modeling에는 scikit-learn, xgboost, lightgbm을 기반으로 하는 데이터 전처리, 변환 및 예측 알고리즘이 포함됩니다. Snowpark Python 클래스는 서명이 유사한 원래 패키지의 해당 클래스를 대체합니다. 하지만 이러한 API는 NumPy 배열 대신 Snowpark DataFrames와 함께 작동하도록 설계되었습니다.

Snowpark ML Modeling API는 scikit-learn과 유사하지만 몇 가지 주요 차이점이 있습니다. 이 섹션에서는 Snowpark ML에서 제공하는 추정기 및 변환기 클래스에 대한 __init__ (생성자), fitpredict 메서드를 호출하는 방법을 설명합니다.

  • 모든 Snowpark ML Python 클래스의 생성자 는 scikit-learn, xgboost 또는 lightgbm의 동등한 클래스에서 허용되는 매개 변수 외에 input_cols, output_cols, sample_weight_col, label_cols, drop_input_cols 의 5개 추가 매개 변수를 허용합니다. 이들은 Snowpark 또는 Pandas DataFrame에서 입력 열, 출력 열, 샘플 가중치 열, 레이블 열의 이름을 지정하는 문자열 또는 문자열 시퀀스입니다.

  • Snowpark ML의 fitpredict 메서드는 입력 데이터, 레이블, 가중치를 나타내는 별도의 배열 대신 단일 DataFrame을 허용합니다. Snowpark ML 사용 시, 클래스를 인스턴스화할 때 이러한 목적으로 사용할 열의 이름을 지정하며, 이러한 이름은 DataFrame에서 fit 또는 predict 로 전달하는 필수적인 열을 찾는 데 사용됩니다. fitpredict 섹션을 참조하십시오.

  • Snowpark ML의 transformpredict 메서드는 추가 열에 저장된 예측의 출력과 함께 메서드에 전달된 DataFrame의 모든 열을 포함하는 DataFrame을 반환합니다. (출력 열 이름과 일치하는 입력 열 이름을 지정하여 제자리에서 변환하거나 drop_input_cols = True 를 전달하여 입력 열을 삭제할 수 있습니다.) scikit-learn, xgboost 및 lightgbm와 동등한 라이브러리는 결과만 포함하는 배열을 반환합니다.

  • Snowpark Python 변환기에는 fit_transform 메서드가 없습니다. 하지만 scikit-learn과 마찬가지로, 매개 변수 유효성 검사는 fit 메서드에서만 수행되므로, 변환기가 피팅을 수행하지 않을 때도 transform 전의 어느 시점에서 fit 을 호출해야 합니다. fit 은 변환기를 반환하므로 메서드 호출이 연결될 수 있습니다(예: Binarizer(threshold=0.5).fit(df).transform(df)).

  • Snowpark ML 변환기에는 inverse_transform 메서드가 없습니다. 입력 및 출력 열에 대해 모두 같은 이름을 지정하여 원래 위치에서의 변환을 명시적으로 수행하지 않는 한 유지되는 입력 DataFrame의 입력 열에서 원래 표현을 계속 사용할 수 있으므로 Snowpark ML에서는 이 메서드가 필요하지 않습니다.

Snowpark ML Modeling 오브젝트를 해당 scikit-learn, xgboost 또는 lightgbm 오브젝트로 변환하여 기본 유형의 모든 메서드와 속성을 사용할 수 있습니다. 기본 모델 검색하기 섹션을 참조하십시오.

모델 생성하기

개별 scikit-learn 모델 클래스에서 허용하는 매개 변수 외에도, 모든 Snowpark ML Modeling 클래스는 인스턴스화할 때 다음의 추가 매개 변수를 허용합니다.

이러한 매개 변수는 모두 기술적으로는 선택 사항이지만, 종종 input_colsoutput_cols 또는 둘 다 지정하려고 합니다. label_colssample_weight_col 은 표에 명시된 특정 상황에서 필요하지만 다른 경우에는 생략할 수 있습니다.

모든 열 이름은 Snowflake 식별자 요구 사항 을 따라야 합니다. 테이블 생성 시 대/소문자를 유지하거나 (달러 기호 및 밑줄 이외의) 특수 문자를 사용하려면 열 이름을 큰따옴표로 묶어야 합니다. 대/소문자를 구분하는 Pandas DataFrames와의 호환성을 유지하려면 가능하다면 항상 모두 대문자로 된 열 이름을 사용하십시오.

from snowflake.ml.modeling.preprocessing import MinMaxScaler
from snowflake.snowpark import Session

# Snowflake identifiers are not case sensitive by default.
# These column names will be automatically updated to ["COLUMN_1", "COLUMN_2", "COLUMN_3"] by the Snowpark DataFrame.
schema = ["column_1", "column_2", "column_3"]
df = session.create_dataframe([[1, 2, 3]], schema = schema)
df.show()
Copy
--------------------------------------
|"COLUMN_1"  |"COLUMN_2"  |"COLUMN_3"|
--------------------------------------
|1           |2          |3          |
--------------------------------------
Copy
# Identify the column names using the Snowflake identifier.
input_cols = ["COLUMN_1", "COLUMN_2", "COLUMN_3"]
mms = MinMaxScaler(input_cols=input_cols)
mms.fit(df)

# To maintain lower case column names, include a double quote within the string.
schema = ['"column_1"', '"column_2"', '"column_3"']
df = session.create_dataframe([[1, 2, 3]], schema = schema)
df.show()
Copy
----------------------------------------
|'"column_1"'|'"column_2"'|'"column_3"'|
----------------------------------------
|1           |2           |3           |
----------------------------------------
Copy
# Since no conversion took place, the schema labels can be used as the column identifiers.
mms = MinMaxScaler(input_cols=schema)
mms.fit(df)
Copy

매개 변수

설명

input_cols

기능을 포함하는 열 이름을 나타내는 문자열 또는 문자열 목록입니다.

이 매개 변수를 생략하면 label_cols, sample_weight_colpassthrough_cols 매개 변수로 지정된 열을 제외한 입력 DataFrame의 모든 열이 입력 열로 간주됩니다.

label_cols

레이블이 포함된 열의 이름을 나타내는 문자열 또는 문자열 목록입니다.

이러한 열을 유추하는 것은 불가능하므로 감독되는 추정기에 대한 레이블 열을 지정해야 합니다. 이러한 레이블 열은 모델 예측의 대상으로 사용되며 input_cols 와 명확하게 구별되어야 합니다.

output_cols

predicttransform 작업의 출력을 저장할 열 이름을 나타내는 문자열 또는 문자열 목록입니다. output_cols 의 길이는 사용된 특정 예측기 또는 변환기 클래스의 예상 출력 열 개수와 일치해야 합니다.

이 매개 변수를 생략하면 출력 열 이름은 감독되는 추정기의 경우 레이블 열 이름에 OUTPUT_ 접두사를 추가하고 감독되지 않는 추정기의 경우 레이블 열 이름에 OUTPUT_IDX 접두사를 추가하여 파생됩니다. 이렇게 유추된 출력 열 이름은 예측기에는 효과적이지만, 변환기에는 output_cols 를 명시적으로 설정해야 합니다. 대체로, 특히 입력 열 이름을 지정하지 않을 경우 출력 열 이름을 명시적으로 지정하는 것이 더 명확합니다.

제자리에서 변환하려면 input_colsoutput_cols 에 대해 같은 이름을 전달하십시오.

passthrough_cols

학습, 변환, 추론에서 제외할 열의 이름을 나타내는 문자열 또는 문자열 목록입니다. 통과 열은 입력 및 출력 DataFrames 사이에 그대로 유지됩니다.

이 옵션은 학습 또는 추론 중에 인덱스 열과 같은 특정 열을 사용하지 않으려 하지만 input_cols 를 전달하지 않는 경우에 유용합니다. input_cols 를 전달하지 않으면 해당 열은 일반적으로 입력으로 간주됩니다.

sample_weight_col

예제의 가중치를 포함하는 열 이름을 나타내는 문자열입니다.

이 인자는 가중 데이터 세트에 필요합니다.

drop_input_cols

입력 열이 결과 DataFrame에서 제거되었는지 여부를 나타내는 부울 값입니다. 기본값은 False 입니다.

DecisionTreeClassifier 생성자는 scikit-learn에 필요한 인자가 없습니다. 모든 인자에는 기본값이 있습니다. 따라서 scikit-learn에서 다음과 같이 작성할 수 있습니다.

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier()
Copy

Snowpark ML에서 열 이름을 지정해야 합니다. 아니면 열 이름을 지정하지 않고 기본값을 수락해야 합니다. 이 예에서는 열 이름이 명시적으로 지정됩니다.

인자를 생성자에 직접 전달하거나 인스턴스화 후 인자를 모델의 특성으로 설정하여 Snowpark ML DecisionTreeClassifier 를 초기화할 수 있습니다. (특성은 언제든지 변경될 수 있습니다.)

  • 생성자 인자로 전달:

    from snowflake.ml.modeling.tree import DecisionTreeClassifier
    
    model = DecisionTreeClassifier(
        input_cols=feature_column_names, label_cols=label_column_names, sample_weight_col=weight_column_name,
        output_cols=expected_output_column_names
    )
    
    Copy
  • 모델 특성 설정:

    from snowflake.ml.modeling.tree import DecisionTreeClassifier
    
    model = DecisionTreeClassifier()
    model.set_input_cols(feature_column_names)
    model.set_label_cols(label_column_names)
    model.set_sample_weight_col(weight_column_name)
    model.set_output_cols(output_column_names)
    
    Copy

fit

Snowpark ML 분류자의 fit 메서드는 특징, 레이블, 가중치를 비롯한 모든 열이 포함된 단일 Snowpark 또는 Pandas DataFrame을 받습니다. 이는 특징, 레이블, 가중치에 대해 별도의 입력을 받는 scikit-learn의 fit 메서드와 다른 점입니다.

scikit-learn에서는 DecisionTreeClassifier.fit 메서드 호출이 다음과 같은 형태입니다.

model.fit(
    X=df[feature_column_names], y=df[label_column_names], sample_weight=df[weight_column_name]
)
Copy

Snowpark ML에서는 DataFrame만 전달하면 됩니다. 모델 생성하기 에 표시된 것처럼, 초기화 시 또는 setter 메서드를 사용하여 입력, 레이블 및 가중치 열 이름을 이미 설정했습니다.

model.fit(df)
Copy

predict

Snowpark ML 클래스의 predict 메서드는 모든 특징 열을 포함하는 단일 Snowpark 또는 Pandas DataFrame도 받습니다. 결과는 변경되지 않은 입력 DataFrame의 모든 열과 추가된 출력 열을 포함하는 DataFrame입니다. 이 DataFrame에서 출력 열을 추출해야 합니다. 이는 결과만 반환하는 scikit-learn의 predict 메서드와 다릅니다.

scikit-learn에서 predict 는 예측 결과만 반환합니다.

prediction_results = model.predict(X=df[feature_column_names])
Copy

Snowpark ML에서 예측 결과만 얻으려면 반환된 DataFrame에서 출력 열을 추출합니다. 여기서 output_column_names 는 출력 열의 이름을 포함하는 목록입니다.

prediction_results = model.predict(df)[output_column_names]
Copy

분산 전처리

Snowpark ML의 많은 데이터 전처리 및 변환 함수는 Snowflake의 분산 실행 엔진을 사용하여 구현되는데, 이는 단일 노드 실행(즉, 저장 프로시저)에 비해 상당한 성능 이점을 제공합니다. 분산 실행을 지원하는 함수를 알아보려면 Snowpark ML Modeling 클래스 섹션을 참조하십시오.

아래 차트는 Snowpark ML의 분산 구현과 저장 프로시저에서 실행되는 scikit-learn을 비교하여 Snowpark에 최적화된 중간 규모의 웨어하우스에서 실행되는 대규모 공개 데이터 세트의 성능 수치를 보여줍니다. Snowpark ML Modeling을 사용할 때 코드를 25~50배 더 빠르게 실행할 수 있는 상황이 많이 있습니다.

Illustration of performance improvements possible by distributed preprocessing

피팅 배포 방식

Snowpark ML 전처리 변환기의 fit 메서드는 Snowpark 또는 Pandas DataFrame을 받아들이고 데이터 세트를 피팅하고 피팅된 변환기를 반환합니다.

  • Snowpark DataFrames의 경우 분산 피팅은 SQL 엔진을 사용합니다. 변환기는 필요한 상태(예: 평균, 최대값 또는 개수)를 계산하는 SQL 쿼리를 생성합니다. 그런 다음 이러한 쿼리는 Snowflake에서 실행되고 결과는 로컬에서 구체화됩니다. SQL에서 계산할 수 없는 복잡한 상태의 경우 변환기는 Snowflake에서 중간 결과를 가져오고 메타데이터에 대해 로컬 계산을 수행합니다.

    변환 중에 임시 상태 테이블이 필요한 복잡한 변환기(예: OneHotEncoder, OrdinalEncoder)의 경우 이러한 테이블은 Pandas DataFrames를 사용하여 로컬에서 표시됩니다.

  • Pandas DataFrames는 scikit-learn과의 피팅과 유사하게 로컬에서 피팅됩니다. 변환기는 제공된 매개 변수를 사용하여 해당 scikit-learn 변환기를 생성합니다. 그런 다음 scikit-learn 변환기가 피팅되고 Snowpark ML 변환기가 scikit-learn 오브젝트에서 필요한 상태를 파생합니다.

변환 분산 방식

Snowpark ML 전처리 변환기의 transform 메서드는 Snowpark 또는 Pandas DataFrame을 받아들이고 데이터 세트를 변환하고 변환된 데이터 세트를 반환합니다.

  • Snowpark DataFrames의 경우 SQL 엔진을 사용하여 분산 변환이 수행됩니다. 피팅된 변환기는 변환된 데이터 세트를 나타내는 기본 SQL 쿼리를 사용하여 Snowpark DataFrame을 생성합니다. transform 메서드는 간단한 변환(예: StandardScaler 또는 MinMaxScaler)에 대해 지연 평가를 수행하므로, transform 메서드 실행 중에는 실제로 변환이 수행되지 않습니다.

    그러나 복잡한 특정 변환에는 실행이 포함됩니다. 여기에는 변환 중에 임시 상태 테이블(예: OneHotEncoderOrdinalEncoder)이 필요한 변환기가 포함됩니다. 이러한 변환기는 조인 및 기타 작업을 위해 (오브젝트 상태를 저장하는) Pandas DataFrame에서 임시 테이블을 생성합니다. 또 다른 경우는 특정 매개 변수가 설정된 경우입니다. 예를 들어, 오류를 발생시켜 변환 중에 발견된 알 수 없는 값을 처리하도록 변환기를 설정하면 변환기가 열, 알 수 없는 값 등의 데이터를 구체화합니다.

  • Pandas DataFrames는 scikit-learn을 사용한 변환과 유사하게 로컬에서 변환됩니다. 변환기는 to_sklearn API를 사용하여 해당 scikit-learn 변환기를 생성하고 메모리에서 변환을 수행합니다.

분산 하이퍼 매개 변수 최적화

하이퍼 매개 변수 조정은 데이터 과학 워크플로의 필수적인 부분입니다. Snowpark ML 라이브러리는 scikit-learn GridSearchCVRandomizedSearchCV API의 분산 구현을 제공하여 단일 노드 및 다중 노드 웨어하우스에서 모두 효율적인 하이퍼 매개 변수 조정을 지원합니다.

Snowpark ML은 기본적으로 분산 하이퍼 매개 변수 최적화를 활성화합니다. 이를 비활성화하려면 다음 Python 가져오기를 사용하십시오.

import snowflake.ml.modeling.parameters.disable_distributed_hpo
Copy

참고

가장 작은 Snowflake 가상 웨어하우스(XS) 또는 Snowpark 최적화 웨어하우스(M)에는 노드가 1개 있습니다. 연속적으로 크기가 커질 때마다 노드 수가 두 배로 늘어납니다.

단일 노드(XS) 웨어하우스의 경우 기본적으로 scikit-learn의 joblib 다중 처리 프레임워크를 사용하여 노드의 전체 용량을 활용합니다.

단일 노드 웨어하우스(XS 표준 웨어하우스 또는 M Snowpark 최적화 웨어하우스)에서 메모리 부족 오류가 발생하는 경우 n_jobs 매개 변수를 지정하여 병렬 처리를 줄여보십시오. 기본 n_jobs 값인 -1로 설정 시 모든 코어를 사용합니다.

다중 노드 웨어하우스의 경우 교차 검증 조정 작업 내의 fit 작업이 노드 전체에 분산됩니다. 확장하는 데 따로 코드를 변경할 필요는 없습니다. 추정기 피팅은 웨어하우스의 모든 노드에서 사용 가능한 모든 코어에 걸쳐 병렬로 실행됩니다.

Estimator fits are executed in parallel on all available CPUs on all machines in the warehouse

예를 들어 scikit-learn 라이브러리와 함께 제공되는 캘리포니아 주택 데이터 세트 를 생각해 보십시오. 데이터에는 다음 정보를 비롯한 20,640행의 데이터가 포함됩니다.

  • MedInc: 블록 그룹의 중위 소득

  • HouseAge: 블록 그룹의 평균 주택 연식

  • AveRooms: 가구당 평균 방 수

  • AveBedrms: 가구당 평균 침실 수

  • Population: 블록 그룹 인구

  • AveOccup: 평균 가구 구성원 수

  • LatitudeLongitude

데이터 세트의 대상은 십만 달러 단위로 표현되는 중위 소득입니다.

이 예제에서는 중위 소득 예측에 가장 적합한 하이퍼 매개 변수 조합을 찾기 위해 랜덤 포레스트 회귀 분석기에서 그리드 검색 교차 검증을 수행합니다.

from snowflake.ml.modeling.ensemble.random_forest_regressor import RandomForestRegressor
from snowflake.ml.modeling.model_selection.grid_search_cv import GridSearchCV
from sklearn import datasets

def load_housing_data() -> DataFrame:
    input_df_pandas = datasets.fetch_california_housing(as_frame=True).frame
    # Set the columns to be upper case for consistency with Snowflake identifiers.
    input_df_pandas.columns = [c.upper() for c in input_df_pandas.columns]
    input_df = session.create_dataframe(input_df_pandas)

    return input_df

input_df = load_housing_data()

# Use all the columns besides the median value as the features
input_cols = [c for c in input_df.columns if not c.startswith("MEDHOUSEVAL")]
# Set the target median value as the only label columns
label_cols = [c for c in input_df.columns if c.startswith("MEDHOUSEVAL")]


DISTRIBUTIONS = dict(
            max_depth=[80, 90, 100, 110],
            min_samples_leaf=[1,3,10],
            min_samples_split=[1.0, 3,10],
            n_estimators=[100,200,400]
        )
estimator = RandomForestRegressor()
n_folds = 5

clf = GridSearchCV(estimator=estimator, param_grid=DISTRIBUTIONS, cv=n_folds, input_cols=input_cols, label_cols=label_col)
clf.fit(input_df)
Copy

이 예는 Medium(단일 노드) Snowpark 최적화 웨어하우스에서 단 7분여 만에 실행되며 X-Large 웨어하우스에서는 실행 시간이 3분밖에 걸리지 않습니다.

Illustration of performance improvements possible by distributed hyperparameter optimization

모델 배포 및 실행하기

모델 학습 결과는 Python Snowpark ML 모델 오브젝트입니다. 학습된 모델을 사용하여 모델의 predict 메서드를 호출함으로써 예측을 수행할 수 있습니다. 이렇게 하면 Snowflake 가상 웨어하우스에서 모델을 실행하기 위한 임시 사용자 정의 함수가 생성됩니다. 이 함수는 Snowpark ML 세션 종료 시(예: 스크립트가 종료되거나 Jupyter 노트북을 닫을 때) 자동으로 삭제됩니다.

세션이 종료된 후에도 사용자 정의 함수를 유지하려면 함수를 수동으로 생성할 수 있습니다. 자세한 내용은 이 항목의 빠른 시작 을 참조하십시오.

곧 출시될 기능인 Snowpark ML 모델 레지스트리도 영구 모델을 지원하고 모델을 더 쉽게 찾고 배포할 수 있게 해줍니다. 다른 Snowpark ML 기능과 함께 모델 레지스트리에 대한 소개는 빠른 시작 을 참조하십시오.

다중 변환을 위한 파이프라인

scikit-learn에서는 파이프라인을 사용하여 일련의 변환을 실행하는 것이 일반적입니다. scikit-learn 파이프라인은 Snowpark ML 클래스와 작동하지 않으므로 Snowpark ML은 일련의 변환을 실행하기 위해 sklearn.pipeline.Pipeline 의 Snowpark Python 버전을 제공합니다. 이 클래스는 snowflake.ml.modeling.pipeline 패키지에 있으며 scikit-learn 버전과 동일하게 작동합니다.

기본 모델 검색하기

Snowpark ML 모델은 다음 메서드(라이브러리에 따라 다름)를 사용하여 〈래핑 해제〉(즉, 기본 서드 파티 모델로 변환)할 수 있습니다.

  • to_sklearn

  • to_xgboost

  • to_lightgbm

그러면 기본 모델의 모든 속성과 메서드에 액세스하고 추정기에 대해 로컬에서 이들을 실행할 수 있습니다. 예를 들어, GridSearchCV 예제 에서는 최고 점수를 검색하기 위해 그리드 검색 추정기를 scikit-learn 오브젝트로 변환합니다.

best_score = grid_search_cv.to_sklearn().best_score_
Copy

알려진 제한 사항

  • Snowpark ML 추정기와 변환기는 현재 희소 입력값이나 희소 응답을 지원하지 않습니다. 희소 데이터가 있는 경우 Snowpark ML의 추정기 또는 변환기에 전달하기 전에 조밀한 형식으로 변환하십시오.

  • Snowpark ML 패키지는 현재 행렬 데이터 타입을 지원하지 않습니다. 결과적으로 행렬을 생성하는 추정기 및 변환기에 대한 모든 작업은 실패합니다.

  • 결과 데이터의 행 순서가 입력 데이터의 행 순서와 일치하리라는 보장은 없습니다.

문제 해결

로깅에 세부 정보 추가하기

Snowpark ML은 Snowpark Python의 로깅을 사용합니다. 기본적으로 Snowpark ML은 INFO 수준 메시지를 표준 출력에 로그로 기록합니다. Snowpark ML 관련 문제를 해결하는 데 도움이 될 수 있는 더 자세한 로그를 얻으려면 수준을 지원되는 수준 중 하나로 변경할 수 있습니다.

DEBUG는 가장 세부적인 로그를 생성합니다. 로깅 수준을 DEBUG로 설정하려면 다음을 수행하십시오.

import logging, sys

logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
Copy

일반적인 문제에 대한 해결책

다음 표에서는 Snowflake ML Modeling과 관련하여 발생할 수 있는 문제를 해결하기 위한 몇 가지 제안 사항을 제시합니다.

문제 또는 오류 메시지

가능한 원인

해결책

《이름 x가 정의되지 않음》, ImportError 또는 ModuleNotFoundError와 같은 NameError

모듈 또는 클래스 이름에 오타가 있거나 Snowpark ML이 설치되어 있지 않습니다.

올바른 모듈 및 클래스 이름은 Snowpark ML Modeling 클래스 표를 참조하십시오. Snowpark ML 모듈이 설치되어 있는지 확인하십시오(Snowpark ML 설치하기 참조).

KeyError(《인덱스에 없음》 또는 《[인덱스[..]]가 [열]에 없음》)

열 이름이 잘못되었습니다.

열 이름을 확인하고 수정하십시오.

SnowparkSQLException, 《존재하지 않거나 권한이 없음》

테이블이 없거나 테이블에 대한 충분한 권한이 없습니다.

테이블이 존재하고 사용자의 역할에 권한이 있는지 확인하십시오.

SnowparkSQLException, 《유효하지 않은 식별자 PETALLENGTH》

열 수가 잘못되었습니다(보통은 열 누락).

모델 클래스를 만들 때 지정한 열 수를 확인하고 올바른 수를 전달해야 합니다.

InvalidParameterError

부적절한 유형 또는 값이 매개 변수로 전달되었습니다.

대화식 Python 세션에서 help 함수를 사용하여 클래스 또는 메서드의 도움말을 확인하고 값을 수정하십시오.

TypeError, 《예기치 않은 키워드 인자》

명명된 인자의 인쇄상 오류.

대화식 Python 세션에서 help 함수를 사용하여 클래스 또는 메서드의 도움말을 확인하고 인자 이름을 수정하십시오.

ValueError, 《샘플이 0개인 배열》

전달된 데이터 세트가 비어 있습니다.

데이터 세트가 비어 있지 않도록 하십시오.

SnowparkSQLException, 《인증 토큰이 만료됨》

세션이 만료되었습니다.

Jupyter 노트북을 사용 중인 경우 커널을 다시 시작하여 새 세션을 만드십시오.

《cannot convert string to float》와 같은 ValueError

데이터 타입 불일치.

대화식 Python 세션에서 help 함수를 사용하여 클래스 또는 메서드의 도움말을 확인하고 값을 수정하십시오.

SnowparkSQLException, 《임시 테이블을 생성할 수 없음》

호출자의 권한으로 실행되지 않는 저장 프로시저 내에서 모델 클래스가 사용되고 있습니다.

소유자 권한 대신 호출자 권한으로 저장 프로시저를 만드십시오.

SnowparkSQLException, 《function available memory exceeded》

데이터 세트가 표준 웨어하우스에서 5GB보다 큽니다.

Snowpark에 최적화된 웨어하우스 로 전환하십시오.

OSError, 《디바이스에 남은 공간이 없음》

모델이 표준 웨어하우스에서 약 500MB보다 큽니다.

Snowpark에 최적화된 웨어하우스 로 전환하십시오.

호환되지 않는 xgboost 버전 또는 xgboost를 가져올 때 오류 발생

종속성을 제대로 처리하지 못하는 pip 를 사용하여 설치했습니다.

오류 메시지의 요청에 따라 패키지를 업그레이드하거나 다운그레이드하십시오.

to_sklearn, to_xgboost 또는 to_lightgbm 과 관련된 AttributeError

다른 유형의 모델에서 이러한 방법 중 하나를 사용하려는 시도.

scikit-learn 기반 모델 등에 to_sklearn 을 사용하십시오.

추가 자료

해당 기능에 대한 전체 정보는 원본 라이브러리의 설명서를 참조하십시오.

감사의 말씀

이 문서의 일부는 BSD-3 《신규》 또는 《개정》 라이선스 및 Copyright © 2007-2023 The scikit-learn developers에 따라 라이선스가 부여된 Scikit-learn 설명서에서 파생되었습니다. All rights reserved.

이 문서의 일부는 Apache License 2.0(2004년 1월) 및 Copyright © 2019로 보호되는 XGboost 설명서에서 파생되었습니다. All rights reserved.

이 문서의 일부는 MIT 라이선스가 있고 Copyright © Microsoft Corp.로 보호되는 LightGBM 설명서에서 파생되었습니다. All rights reserved.