Pré-processamento e pós-processamento com modelos¶
Este tópico explica como criar modelos, registrá-los no Snowflake Model Registry e implantá-los, usando vários tipos de modelos e cenários como exemplos. Isso inclui:
Modelos e pipelines do scikit-learn na memória.
Seus próprios modelos personalizados.
Mais de um modelo.
Modelos e pipelines do scikit-learn na memória¶
O Snowflake ML permite a integração perfeita de modelos na memória scikit-learn
no Model Registry usando argumentos de palavra-chave com a classe ModelContext
. Abaixo está um exemplo de como passar um modelo scikit-learn
na memória como um argumento de palavra-chave para o contexto do modelo e chamá-lo em uma classe de modelo personalizado.
from sklearn import datasets, svm
import pandas as pd
from snowflake.ml.model import custom_model
# Step 1: Import the Iris dataset
iris_X, iris_y = datasets.load_iris(return_X_y=True)
# Step 2: Initialize a scikit-learn LinearSVC model and train it
svc = svm.LinearSVC()
svc.fit(iris_X, iris_y)
# Step 3: Initialize ModelContext with keyword arguments
mc = custom_model.ModelContext(
my_model=svc,
)
# Step 4: Define a custom model class to utilize the context
class ExampleSklearnModel(custom_model.CustomModel):
def __init__(self, context: custom_model.ModelContext) -> None:
super().__init__(context)
@custom_model.inference_api
def predict(self, input: pd.DataFrame) -> pd.DataFrame:
# Use the model from the context for predictions
model_output = self.context['my_model'].predict(input)
# Return the predictions in a DataFrame
return pd.DataFrame({'output': model_output})
Uso dos pipelines do scikit-learn
com o Snowflake ML¶
Abaixo está um exemplo que mostra como usar pipelines do scikit-learn no Snowflake ML. Isso envolve etapas de pré-processamento, como dimensionamento ou imputação, seguidas por um modelo preditivo, tudo gerenciado em uma classe de modelo personalizado usando o ModelContext
.
from sklearn import datasets
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer
import pandas as pd
from snowflake.ml.model import custom_model
# Step 1: Load the Iris dataset
iris_X, iris_y = datasets.load_iris(return_X_y=True)
# Step 2: Create a scikit-learn pipeline
# The pipeline includes:
# - A SimpleImputer to handle missing values
# - A StandardScaler to standardize the data
# - A Support Vector Classifier (SVC) for predictions
pipeline = Pipeline([
('imputer', SimpleImputer(strategy='mean')),
('scaler', StandardScaler()),
('classifier', SVC(kernel='linear', probability=True))
])
# Step 3: Fit the pipeline to the dataset
pipeline.fit(iris_X, iris_y)
# Step 4: Initialize ModelContext with the pipeline
mc = custom_model.ModelContext(
pipeline_model=pipeline,
)
# Step 5: Define a custom model class to utilize the pipeline
class ExamplePipelineModel(custom_model.CustomModel):
def __init__(self, context: custom_model.ModelContext) -> None:
super().__init__(context)
@custom_model.inference_api
def predict(self, input: pd.DataFrame) -> pd.DataFrame:
# Use the pipeline from the context to process input and make predictions
predictions = self.context['pipeline_model'].predict(input)
probabilities = self.context['pipeline_model'].predict_proba(input)
# Return predictions and probabilities as a DataFrame
return pd.DataFrame({
'predictions': predictions,
'probability_class_0': probabilities[:, 0],
'probability_class_1': probabilities[:, 1]
})
# Example usage:
# Convert new input data into a DataFrame
new_input = pd.DataFrame(iris_X[:5]) # Using the first 5 samples for demonstration
# Initialize the custom model and run predictions
custom_pipeline_model = ExamplePipelineModel(context=mc)
result = custom_pipeline_model.predict(new_input)
print(result)
Uso de seus próprios modelos¶
O exemplo a seguir usa seu próprio modelo como um modelo personalizado.
mc = custom_model.ModelContext(
my_model=your_own_model,
)
from snowflake.ml.model import custom_model
import pandas as pd
import json
class ExampleYourOwnModel(custom_model.CustomModel):
def __init__(self, context: custom_model.ModelContext) -> None:
super().__init__(context)
@custom_model.inference_api
def predict(self, input: pd.DataFrame) -> pd.DataFrame:
model_output = self.context['my_model'].predict(features)
return pd.DataFrame({'output': model_output})
Uso de mais de um modelo¶
Abaixo, há um modelo personalizado que combina vários modelos e usa um arquivo de configuração para aplicar a tendência ao gerar previsões.
mc = custom_model.ModelContext(
model1=model1,
model2=model2,
feature_preproc=preproc
}
)
Nota
model1
e model2
são objetos de qualquer tipo de modelo suportado nativamente pelo registro. feature_preproc
é um objeto scikit-learn pipeline
.
from snowflake.ml.model import custom_model
import pandas as pd
import json
class ExamplePipelineModel(custom_model.CustomModel):
@custom_model.inference_api
def predict(self, input: pd.DataFrame) -> pd.DataFrame:
...
return pd.DataFrame(...)
# Here is the fully-functional custom model that uses both model1 and model2
class ExamplePipelineModel(custom_model.CustomModel):
def __init__(self, context: custom_model.ModelContext) -> None:
super().__init__(context)
@custom_model.inference_api
def predict(self, input: pd.DataFrame) -> pd.DataFrame:
features = self.context['feature_preproc'].transform(input)
model_output = self.context['model1'].predict(
self.context['model2'].predict(features)
)
return pd.DataFrame({'output': model_output})