Snowpark ML Modeling: desenvolvimento de modelo de ML

O Snowpark ML Modeling é uma coleção de APIs Python para pré-processamento de dados e modelos de treinamento. Ao usar o Snowpark ML Modeling para executar essas tarefas no Snowflake, você pode:

  • Transforme seus dados e treine seus modelos sem retirar seus dados do Snowflake.

  • Trabalhe com APIs semelhantes àqueles com os quais você já está familiarizado, como scikit-learn.

  • Mantenha seu pipeline de ML em execução nas estruturas de segurança e governança do Snowflake.

  • Aproveite o desempenho e a escalabilidade dos data warehouses da Snowflake.

O pacote do Snowpark ML Modeling descrito neste tópico fornece estimadores e transformadores compatíveis com os das bibliotecas scikit-learn, xgboost e lightgbm. Você pode usar estas APIs para criar e treinar modelos de aprendizado de máquina no Snowflake.

Para uma introdução rápida ao Snowpark ML Modeling, consulte nosso guia de início rápido.

Nota

Este tópico pressupõe que o módulo Snowpark ML já esteja instalado. Caso contrário, consulte Instalação do Snowpark ML.

Classes do Snowpark ML Modeling

Todas as classes do Snowpark ML Modeling e de pré-processamento estão no namespace snowflake.ml.modeling. Os módulos do Snowpark ML têm o mesmo nome que os módulos correspondentes do namespace sklearn. Por exemplo, o módulo Snowpark ML correspondente a sklearn.calibration é snowflake.ml.modeling.calibration.

O módulos xgboost e lightgbm correspondem a snowflake.ml.modeling.xgboost e snowflake.ml.modeling.lightgbm, respectivamente.

Nem todas as classes do scikit-learn são suportadas no Snowpark ML. A tabela abaixo indica quais classes são suportadas. Classes marcadas com um asterisco (:sobrescrito:`*`) oferecem suporte à execução distribuída.

Dica

Consulte a Referência de API do Snowpark ML para obter detalhes completos da API de modelagem.

Nome do módulo Snowpark ML

Classes

snowflake.ml.modeling.calibration

  • CalibratedClassifierCV

snowflake.ml.modeling.cluster

  • AgglomerativeClustering

  • AffinityPropagation

  • Birch

  • DBSCAN

  • FeatureAgglomeration

  • KMeans

  • MeanShift

  • MiniBatchKMeans

  • OPTICS

  • SpectralBiclustering

  • SpectralClustering

  • SpectralCoclustering

snowflake.ml.modeling.compose

  • ColumnTransformer

  • TransformedTargetRegressor

snowflake.ml.modeling.covariance

  • EllipticEnvelope

  • EmpiricalCovariance

  • GraphicalLasso

  • GraphicalLassoCV

  • LedoitWolf

  • MinCovDet

  • OAS

  • ShrunkCovariance

snowflake.ml.modeling.decomposition

  • DictionaryLearning

  • FactorAnalysis

  • FastICA

  • IncrementalPCA

  • KernelPCA

  • MiniBatchDictionaryLearning

  • MiniBatchSparsePca

  • PCA

  • SparsePCA

  • TruncatedSVD

snowflake.ml.modeling.discriminant_analysis

  • LinearDiscriminantAnalysis

  • QuadraticDiscriminantAnalysis

snowflake.ml.modeling.ensemble

  • AdaBoostClassifier

  • AdaBoostRegressor

  • BaggingClassifier

  • BaggingRegressor

  • ExtraTreesClassifier

  • ExtraTreesRegressor

  • GradientBoostingClassifier

  • GradientBoostingRegressor

  • IsolationForest

  • RandomForestClassifier

  • RandomForestRegressor

  • StackingRegressor

  • VotingClassifier

  • VotingRegressor

snowflake.ml.modeling.feature_selection

  • GenericUnivariateSelect

  • SelectFdr

  • SelectFpr

  • SelectFwe

  • SelectKBest

  • SelectPercentile

  • SequentialFeatureSelector

  • VarianceThreshold

snowflake.ml.modeling.gaussian_process

  • GaussianProcessClassifier

  • GaussianProcessRegressor

snowflake.ml.modeling.impute

snowflake.ml.modeling.kernel_approximation

  • AdditiveChi2Sampler

  • Nystroem

  • PolynomialCountSketch

  • RBFSampler

  • SkewedChi2Sampler

snowflake.ml.modeling.kernel_ridge

  • KernelRidge

snowflake.ml.modeling.lightgbm

  • LGBMClassifier

  • LGBMRegressor

snowflake.ml.modeling.linear_model

  • ARDRegression

  • BayesianRidge

  • ElasticNet

  • ElasticNetCV

  • GammaRegressor

  • HuberRegressor

  • Lars

  • LarsCV

  • Lasso

  • LassoCV

  • LassoLars

  • LassoLarsCV

  • LassoLarsIC

  • LinearRegression

  • LogisticRegression

  • LogisticRegressionCV

  • MultiTaskElasticNet

  • MultiTaskElasticNetCV

  • MultiTaskLasso

  • MultiTaskLassoCV

  • OrthogonalMatchingPursuit

  • PassiveAggressiveClassifier

  • PassiveAggressiveRegressor

  • Perceptron

  • PoissonRegressor

  • RANSACRegressor

  • Ridge

  • RidgeClassifier

  • RidgeClassifierCV

  • RidgeCV

  • SGDClassifier

  • SGDOneClassSvm

  • SGDRegressor

  • TheilSenRegressor

  • TweedieRegressor

snowflake.ml.modeling.manifold

  • Isomap

  • MDS

  • SpectralEmbedding

  • TSNE

snowflake.ml.modeling.metrics

correlation:

covariance:

classification:

ranking:

  • precision_recall_curve

  • roc_auc_score

  • roc_curve

regression:

  • d2_absolute_error_score

  • d2_pinball_score

  • explained_variance_score

  • mean_absolute_error

  • mean_absolute_percentage_error

  • mean_squared_error

  • r2_score :sobrescrito:`*`

snowflake.ml.modeling.mixture

  • BayesianGaussianMixture

  • GaussianMixture

snowflake.ml.modeling.model_selection

  • GridSearchCV

  • RandomizedSearchCV

snowflake.ml.modeling.multiclass

  • OneVsOneClassifier

  • OneVsRestClassifier

  • OutputCodeClassifier

snowflake.ml.modeling.naive_bayes

  • BernoulliNB

  • CategoricalNB

  • ComplementNB

  • GaussianNB

  • MultinomialNB

snowflake.ml.modeling.neighbors

  • KernelDensity

  • KNeighborsClassifier

  • KNeighborsRegressor

  • LocalOutlierFactor

  • NearestCentroid

  • NearestNeighbors

  • NeighborhoodComponentsAnalysis

  • RadiusNeighborsClassifier

  • RadiusNeighborsRegressor

snowflake.ml.modeling.neural_network

  • BernoulliRBM

  • MLPClassifier

  • MLPRegressor

snowflake.ml.modeling.preprocessing

snowflake.ml.modeling.semi_supervised

  • LabelPropagation

  • LabelSpreading

snowflake.ml.modeling.svm

  • LinearSVC

  • LinearSVR

  • NuSVC

  • NuSVR

  • SVC

  • SVR

snowflake.ml.modeling.tree

  • DecisionTreeClassifier

  • DecisionTreeRegressor

  • ExtraTreeClassifier

  • ExtraTreeRegressor

snowflake.ml.modeling.xgboost

  • XGBClassifier

  • XGBRegressor

  • XGBRFClassifier

  • XGBRFRegressor

Diferenças gerais da API

Dica

Consulte a Referência de API do Snowpark ML para obter detalhes completos da API de modelagem.

O Snowpark ML Modeling inclui pré-processamento de dados, transformação e algoritmos de previsão baseados em scikit-learn, xgboost e lightgbm. As classes Snowpark Python são substituições para as classes correspondentes dos pacotes originais, com assinaturas semelhantes. No entanto, estas APIs são projetadas para funcionar com o Snowpark DataFrames em vez das matrizes NumPy.

Embora a API do Snowpark ML Modeling seja semelhante ao scikit-learn, existem algumas diferenças importantes. Esta seção explica como chamar os métodos __init__ (construtor), fit e predict para as classes estimador e transformador fornecidas no Snowpark ML.

  • O construtor de todas as classes do Snowpark ML Python aceitam cinco parâmetros adicionais — input_cols, output_cols, sample_weight_col, label_cols e drop_input_cols — além dos parâmetros aceitos pelas classes equivalentes em scikit-learn, xgboost ou lightgbm. São cadeias de caracteres, ou sequências de cadeias de caracteres, que especificam os nomes das colunas de entrada, colunas de saída, coluna de peso de amostra e colunas de rótulo em um DataFrame do Snowpark ou Pandas.

  • Os métodos fit e predict no Snowpark ML aceitam um único DataFrame em vez de matrizes separadas que representam dados de entrada, rótulos e pesos. Com o Snowpark ML, você especifica os nomes das colunas a serem usadas para essas finalidades ao instanciar a classe; esses nomes são usados para encontrar as colunas necessárias no DataFrame que você passa para fit ou predict. Consulte fit e predict.

  • Os métodos transform e predict no Snowpark ML retornam um DataFrame contendo todas as colunas do DataFrame passado para o método, com a saída da previsão armazenada em colunas adicionais. (Você pode transformar no local especificando os mesmos nomes de coluna de entrada e saída ou eliminar as colunas de entrada passando drop_input_cols = True.) Os equivalentes scikit-learn, xgboost e lightgbm retornam matrizes contendo apenas os resultados.

  • Os transformadores Snowpark Python não têm um método fit_transform. No entanto, como no scikit-learn, a validação de parâmetros é realizada apenas no método fit, então você deve chamar fit em algum momento antes de transform, mesmo quando o transformador não tem nenhum encaixe. fit retorna o transformador, então as chamadas de método podem ser encadeadas; por exemplo, Binarizer(threshold=0.5).fit(df).transform(df).

  • Os transformadores Snowpark ML não têm um método inverse_transform. Este método é desnecessário com o Snowpark ML porque a representação original permanece disponível nas colunas de entrada do DataFrame de entrada, que são preservadas, a menos que você execute explicitamente uma transformação no local especificando os mesmos nomes para as colunas de entrada e saída.

Criação de um modelo

Além dos parâmetros aceitos pelas classes de modelo individuais do scikit-learn, todas as classes do Snowpark ML Modeling aceitam cinco parâmetros adicionais, listados na tabela a seguir, na instanciação.

Esses parâmetros são todos tecnicamente opcionais, mas muitas vezes você desejará especificar input_cols, output_cols ou ambos. label_cols e sample_weight_col são obrigatórios em situações específicas indicadas na tabela, mas podem ser omitidos em outros casos.

Parâmetro

Descrição

input_cols

Uma cadeia de caracteres ou lista de cadeias de caracteres que representam nomes de colunas que contêm recursos.

Se você omitir este parâmetro, todas as colunas no DataFrame de entrada, exceto as colunas especificadas pelos parâmetros label_cols e sample-weight_col, são consideradas colunas de entrada.

label_cols

Uma cadeia de caracteres ou lista de cadeias de caracteres que representam nomes de colunas que contêm rótulos.

Você deve especificar colunas de rótulos para estimadores porque não é possível inferir essas colunas. Se você omitir este parâmetro, o modelo é considerado um transformador e é ajustado sem rótulos.

output_cols

Uma cadeia de caracteres ou lista de cadeia de caracteres que representa nomes de colunas que armazenarão a saída das operações predict e transform. O comprimento do output_cols deve corresponder ao número esperado de colunas de saída da classe específica do preditor ou transformador usada.

Se você omitir esse parâmetro, os nomes das colunas de saída serão derivados adicionando um prefixo OUTPUT_ para os nomes das colunas do rótulo. Esses nomes de colunas de saída inferidas funcionam para preditores, mas output_cols deve ser definido explicitamente para transformadores. Especificar explicitamente os nomes das colunas de saída é mais claro, especialmente se você não especificar os nomes das colunas de entrada.

Para transformar no local, passe os mesmos nomes para input_cols e output_cols.

sample_weight_col

Uma cadeia de caracteres representando o nome da coluna contendo os pesos dos exemplos.

Este argumento é necessário para conjuntos de dados ponderados.

drop_input_cols

Um valor booleano que indica se as colunas de entrada são removidas do DataFrame de resultado. O padrão é False.

Exemplo

O construtor DecisionTreeClassifier não possui nenhum argumento necessário no scikit-learn; todos os argumentos têm valores padrão. Portanto, no scikit-learn, você pode escrever:

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier()
Copy

No Snowpark ML, você deve especificar os nomes das colunas (ou aceitar os padrões não especificando-os). Neste exemplo, eles são especificados explicitamente.

Você pode inicializar um Snowpark ML DecisionTreeClassifier passando os argumentos diretamente para o construtor ou definindo-os como atributos do modelo após a instanciação. (Os atributos podem ser alterados a qualquer momento.)

  • Como argumentos do construtor:

    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
  • Definindo os atributos do modelo:

    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

O método fit de um classificador do Snowpark ML leva um único DataFrame do Snowpark ou Pandas contendo todas as colunas, incluindo recursos, rótulos e pesos. Isso é diferente do método fit do scikit-learn, que usa entradas separadas para recursos, rótulos e pesos.

No scikit-learn, a chamada do método DecisionTreeClassifier.fit fica assim:

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

No Snowpark ML, você só precisa passar o DataFrame. Você já definiu os nomes de coluna de entrada, rótulo e peso na inicialização ou usando métodos setter, conforme mostrado em Criação de um modelo.

model.fit(df)
Copy

predict

O método predict de uma classe do Snowpark ML também leva um único DataFrame do Snowpark ou Pandas contendo todas as colunas de recursos. O resultado é um DataFrame que contém todas as colunas no DataFrame de entrada inalterado e as colunas de saída anexadas. Você deve extrair as colunas de saída deste DataFrame. Isso é diferente do predict no scikit-learn, que retorna apenas os resultados.

Exemplo

No scikit-learn, predict retorna apenas os resultados da previsão:

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

Para obter apenas os resultados da previsão no Snowpark ML, extraia as colunas de saída do DataFrame retornado. Aqui, output_column_names é uma lista contendo os nomes das colunas de saída:

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

Como implantar e executar seu modelo

O resultado do treinamento de um modelo é um objeto de modelo Python do Snowpark ML. Você pode usar o modelo treinado para fazer previsões chamando o método predict do modelo. Isso cria uma função temporária definida pelo usuário para executar o modelo em seu warehouse virtual Snowflake. Esta função é excluída automaticamente no fim de sua sessão do Snowpark ML (por exemplo, quando seu script termina ou quando você fecha seu Jupyter Notebook).

Para manter a função definida pelo usuário após o término da sessão, você pode criá-la manualmente. Consulte o Guia de início rápido sobre o tópico para obter mais informações.

O registro de modelo do Snowpark ML, um recurso futuro, também oferece suporte a modelos persistentes e facilita sua localização e implantação. Para obter acesso antecipado à documentação sobre esse recurso, entre em contato com o representante da Snowflake.

Pipeline para múltiplas transformações

Com o scikit-learn, é comum executar uma série de transformações usando um pipeline. Os pipelines do scikit-learn não funcionam com classes do Snowpark ML, portanto, o Snowpark ML fornece uma versão Snowpark Python de sklearn.pipeline.Pipeline para executar uma série de transformações. Esta classe está no pacote snowflake.ml.modeling.pipeline e funciona da mesma forma que a versão scikit-learn.

Limitações conhecidas

  • Os estimadores e transformadores do Snowpark ML atualmente não oferecem suporte às entradas esparsas ou respostas esparsas. Se você tiver dados esparsos, converta-os em um formato denso antes de passá-los para os estimadores ou transformadores do Snowpark ML.

  • O pacote Snowpark ML atualmente não oferece suporte a tipos de dados de matriz. Qualquer operação em estimadores e transformadores que produzam uma matriz como resultado falha.

  • Não há garantia de que a ordem das linhas nos dados de resultado corresponda à ordem das linhas nos dados de entrada.

Solução de problemas

Adição de mais detalhes ao registro

Snowpark ML usa o registro em log do Snowpark Python. Por padrão, o Snowpark ML faz o registro em log de mensagens de nível INFO para a saída padrão. Para obter registros mais detalhados, que podem ajudar a solucionar problemas com o Snowpark ML, altere o nível para um dos níveis compatíveis.

DEBUG produz logs com mais detalhes. Para definir o nível de registro em log como DEBUG:

import logging, sys

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

Soluções para problemas comuns

A tabela a seguir fornece algumas sugestões para resolver possíveis problemas com o Snowflake ML Modeling.

Problema ou mensagem de erro

Possível causa

Resolução

NameError, como «nome x não está definido», ImportError ou ModuleNotFoundError

Erro tipográfico no nome do módulo ou da classe ou o Snowpark ML não está instalado.

Consulte a tabela Classes do Snowpark ML Modeling para obter o módulo e o nome da classe corretos. Certifique-se de que o módulo Snowpark ML esteja instalado (consulte Instalação do Snowpark ML).

KeyError («não está no índice» ou «nenhum dos [Índice[..]] está em [colunas]»)

Nome de coluna incorreto.

Verifique e corrija o nome da coluna.

SnowparkSQLException, «não existe ou não está autorizado»

A tabela não existe ou você não tem privilégios suficientes na tabela.

Certifique-se de que a tabela exista e que a função do usuário tenha os privilégios.

SnowparkSQLException, «identificador inválido PETALLENGTH»

Número incorreto de colunas (geralmente uma coluna ausente).

Verifique o número de colunas especificado quando você criou a classe de modelo e certifique-se de passar o número correto.

InvalidParameterError

Um tipo ou valor inadequado foi passado como parâmetro.

Verifique a ajuda da classe ou método usando a função help em uma sessão Python interativa e corrija os valores.

TypeError, «unexpected keyword argument»

Erro tipográfico no argumento nomeado.

Verifique a ajuda da classe ou método usando a função help em uma sessão Python interativa e corrija o nome do argumento.

ValueError, «array with 0 sample(s)»

O conjunto de dados passado está vazio.

Certifique-se de que o conjunto de dados não esteja vazio.

SnowparkSQLException, «authentication token has expired»

A sessão expirou.

Se você estiver usando um Jupyter Notebook, reinicie o kernel para criar uma nova sessão.

ValueError, como «cannot convert string to float»

Incompatibilidade de tipo de dados.

Verifique a ajuda da classe ou método usando a função help em uma sessão Python interativa e corrija os valores.

SnowparkSQLException, «cannot create temporary table»

Uma classe de modelo está sendo usada dentro de um procedimento armazenado que não é executado com os direitos do chamador.

Crie o procedimento armazenado com os direitos do chamador em vez dos direitos do proprietário.

SnowparkSQLException, «function available memory exceeded»

Seu conjunto de dados é maior que 5 GB em um warehouse padrão.

Mude para um warehouse otimizado para Snowpark.

OSError, «no space left on device»

Seu modelo é maior que cerca de 500 MB em um warehouse padrão.

Mude para um warehouse otimizado para Snowpark.

Versão xgboost incompatível ou erro ao importar xgboost

Você instalou usando pip, que não lida bem com dependências.

Atualize ou faça downgrade do pacote conforme solicitado pela mensagem de erro.

AttributeError envolvendo to_sklearn, to_xgboost ou to_lightgbm

Uma tentativa de usar um desses métodos em um modelo de um tipo diferente.

Use to_sklearn com modelos baseados em scikit-learn etc.

Leitura adicional

Consulte a documentação das bibliotecas originais para obter informações completas sobre sua funcionalidade.

Aviso

Algumas partes deste documento são derivadas da documentação do Scikit-learn, que é licenciada sob a licença BSD-3 «Nova» ou «Revisada» e Copyright © 2007-2023 The scikit-learn developers. Todos os direitos reservados.

Algumas partes deste documento são derivadas da documentação XGboost, que é coberta pela licença Apache 2.0, janeiro de 2004 e Copyright © 2019. Todos os direitos reservados.

Algumas partes deste documento são derivadas da documentação LightGBM, que é licenciado para MIT e Copyright © Microsoft Corp. Todos os direitos reservados.