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 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
edrop_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
epredict
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 parafit
oupredict
. Consulte fit e predict.Os métodos
transform
epredict
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 passandodrop_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étodofit
, então você deve chamarfit
em algum momento antes detransform
, 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 |
---|---|
|
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 |
|
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. |
|
Uma cadeia de caracteres ou lista de cadeia de caracteres que representa nomes de colunas que armazenarão a saída das operações Se você omitir esse parâmetro, os nomes das colunas de saída serão derivados adicionando um prefixo Para transformar no local, passe os mesmos nomes para |
|
Uma cadeia de caracteres representando o nome da coluna contendo os pesos dos exemplos. Este argumento é necessário para conjuntos de dados ponderados. |
|
Um valor booleano que indica se as colunas de entrada são removidas do DataFrame de resultado. O padrão é |
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()
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 )
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)
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]
)
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)
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])
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]
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)
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 |
TypeError, «unexpected keyword argument» |
Erro tipográfico no argumento nomeado. |
Verifique a ajuda da classe ou método usando a função |
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 |
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 |
Atualize ou faça downgrade do pacote conforme solicitado pela mensagem de erro. |
AttributeError envolvendo |
Uma tentativa de usar um desses métodos em um modelo de um tipo diferente. |
Use |
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.