然而,模型使用pyfunc返回ModuleNotFoundErrorFileNotFoundError

問題

您已經創建了使用的Sklearn模型KNeighborsClassifier和使用pyfunc進行預測。

例如:

進口mlflow.pyfuncpyfunc_udfmlflowpyfuncspark_udf火花model_urimodel_uriresult_type“字符串”predicted_df合並withColumn“預測”pyfunc_udf合並1:]))predicted_df收集()

預測返回一個ModuleNotFoundError:沒有模塊命名“sklearn.neighbors._classification”錯誤消息。

預測也可能返回aFileNotFoundError:[Errno2]沒有可用的臨時目錄發現錯誤消息。

導致

當記錄KNN模型時,用於訓練的所有數據點都保存為pickle文件的一部分。

如果模型使用數百萬條記錄進行訓練,那麼所有這些數據都將添加到模型中,這將極大地增加模型的大小。在數百萬條記錄上訓練的模型可以很容易地合計多個gb。

pyfunc在運行預測時,嚐試將整個模型加載到執行程序的緩存中。

如果模型太大而無法放入內存中,就會導致上述錯誤消息之一。

解決方案

您應該使用基於樹的算法,例如隨機森林或XGBoost對KNN模型中的數據進行下采樣。

如果你有不平衡的數據,在訓練基於樹的算法時,嚐試像SMOTE這樣的抽樣方法。