問題
您已經創建了一個Sklearn模型KNeighborsClassifier並且正在使用pyfunc進行預測。
例如:
導入mlflow。pyfuncpyfunc_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()
預測返回一個沒有名為“sklearn.neighbors._classification”的模塊錯誤消息。
預測也可能返回aFileNotFoundError: [Errno 2]找不到可用的臨時目錄錯誤消息。
導致
當記錄KNN模型時,用於訓練的所有數據點都保存為pickle文件的一部分。
如果用數百萬條記錄訓練模型,那麼所有這些數據都會被添加到模型中,這將極大地增加模型的大小。在數百萬條記錄上訓練的模型很容易總計數gb。
pyfunc在運行預測時,嚐試將整個模型加載到執行程序的緩存中。
如果模型太大,無法裝入內存,則會導致上述錯誤消息之一。
解決方案
您應該使用基於樹的算法,例如隨機森林或XGBoost對KNN模型中的數據進行下采樣。
如果你有不平衡的數據,在訓練基於樹的算法時,嚐試像SMOTE這樣的抽樣方法。