Modelo KNN usando pyfunc devoluções ModuleNotFoundError ou FileNotFoundError

Problema

Criou um modelo Sklearn usando KNeighborsClassifier e está a usar para executar uma pyfunc previsão.

Por exemplo:

import mlflow.pyfunc
pyfunc_udf = mlflow.pyfunc.spark_udf(spark, model_uri=model_uri, result_type='string')
predicted_df = merge.withColumn("prediction", pyfunc_udf(*merge.columns[1:]))
predicted_df.collect()

A previsão devolve uma ModuleNotFoundError: No module named 'sklearn.neighbors._classification' mensagem de erro.

A previsão também pode devolver uma FileNotFoundError: [Errno 2] No usable temporary directory found mensagem de erro.

Causa

Quando um modelo KNN é registado, todos os pontos de dados utilizados para o treino são guardados como parte do ficheiro de pickles.

Se o modelo for treinado com milhões de registos, todos esses dados são adicionados ao modelo, o que pode aumentar drasticamente o seu tamanho. Um modelo treinado em milhões de registos pode facilmente totalizar vários GBs.

pyfunc tenta carregar todo o modelo na cache do executor ao executar uma previsão.

Se o modelo for demasiado grande para caber na memória, resulta numa das mensagens de erro acima.

Solução

Você deve usar um algoritmo à base de árvores, como Random Forest ou XGBoost para reduzir os dados em um modelo KNN.

Se tiver dados desequilibrados, tente um método de amostragem como o SMOTE, ao treinar um algoritmo à base de árvores.