首页 > 解决方案 > 使用 scikit-learn 和 Flask 对随机森林回归器建模

问题描述

我有一个在本地环境中工作的 Flask 应用程序。但是当我在生产模式下运行它时它不起作用。

我正在使用 pickle 来保存我的模型,并且我测试了 joblib。

当我加载泡菜文件时出现问题:我有一个 504 超时错误。我正在像这样加载文件,一旦文件由培训生成: model = pickle.load(open(file))

我很确定是训练生成的泡菜文件引发了这个错误(我用其他泡菜文件测试过)

经过更多调查,我通过管道功能管道缝合了注射女佣导致问题:

model = Pipeline(
        [
            ('features', my_data),
            ('model', ensemble.RandomForestRegressor(min_samples_leaf=1, n_jobs=-1))
        ])
...
pickle.dump(model, file)

这项工作很好:

model = Pipeline(
        [
            ('features', my_data),
            ('model', ensemble.RandomForestRegressor(min_samples_leaf=1, n_jobs=-1))
        ])
model = {}
model["foo"] = "bar"
pickle.dump(model, file)

我对 Flask 开发服务器没有任何问题,只在生产环境(apache)中,当然我不想使用开发。我的生产环境中的服务器。

知道为什么在生产环境中会出现 504 错误吗?

编辑:这是我使用 pickle.load(...) 的方法

def recup_df():
    df = pd.read_pickle("dataframe.pickle")
    mod = pickle.load("model.pickle")
    X = df.head(20).drop(['price'], axis=1)
    y = df.head(20).price.values.copy()
    predict_df = pd.DataFrame.from_dict({
    'predicted':mod.predict(X),
    'true':y,
    'make':X.make,
    'model':X.model
    })
    prediction = dict()
    result = 1
    for data in predict_df.itertuples():
        str_result = "result n°{}".format(result)
        car_name = "{} {}".format(data.make, data.model)
        prediction[str_result] = {
        car_name : [{
        "true price":data.true,
        "predict price":data.predicted
        }]
        }
        result += 1
    output =  {
        "prediction":prediction
    }
    return jsonify(output)

标签: pythonflaskscikit-learnpicklejoblib

解决方案


当涉及到由不同转换器组成的 Pipeline 对象时,pickle.dump 存在问题。

这是关于相关解决方案问题的先前帖子:How to proper pickle sklearn pipeline when using custom transformer

我尝试了 cloudpickle,它与 skleanr.Pipeline 一起工作。


推荐阅读