使用 scikit-learn 和 Flask 对随机森林回归器建模

Posted

技术标签:

【中文标题】使用 scikit-learn 和 Flask 对随机森林回归器建模【英文标题】:Model Random Forest Regressor with scikit-learn and Flask 【发布时间】:2021-01-22 12:59:50 【问题描述】:

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

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

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

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

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

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)中,当然我不想使用 dev。我的生产环境中的服务器。

知道为什么在生产环境中会出现 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)

【问题讨论】:

【参考方案1】:

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

这是之前的一篇关于该问题的相关解决方案:How to properly pickle sklearn pipeline when using custom transformer

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

【讨论】:

您好,谢谢您的回答。是的,在定义管道和超参数定义后,我使用model.fit(X, y)。只有在此之后,我才会倾倒。我试过protocol=2,但我遇到了同样的问题。 好的,你能给我们提供 504 错误的详细信息吗? 我没有详细信息,但日志文件中有两条消息:“access_log”中的"GET /exemple HTTP/1.1" 504 247 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:81.0) Gecko/20100101 Firefox/81.0" 和“error_log”中的[wsgi:error] [pid 6309] [client 10.101.1.59:23482] Timeout when reading response headers from daemon process 'apache': /var/www/webroot/ROOT/wsgi.py ______________________________________________ Je n'ai aucun detail de l'erreur。 Dans deux fichiers de logs, j'ai seulement les erreurs que j'ai mis plus haut。 谢谢,您的 Flask 应用程序似乎花费了太多时间来回答。那么,pickle 加载和 model.predict() 需要多少时间?您的脚本中的负载在哪里?加载模型应该在 GET 相关方法之外的 Flask 脚本之上。 @app.route('/exemple') def recup_df(): fd = open("model.pickle", "rb") mod = pickle.load(fd) fd.close() 这是我的代码。但是我尝试在函数之外测试加载模型,我得到了相同的响应。

以上是关于使用 scikit-learn 和 Flask 对随机森林回归器建模的主要内容,如果未能解决你的问题,请参考以下文章

使用 scikit-learn 对 SVR 进行递归特征消除和网格搜索

scikit-learn 对整数变量的解释

使用 pandas 和 scikit-learn 对多维数组进行 one-hot 编码

给定参考值的二维矩阵,对两个变量进行 Scikit-learn 回归

Scikit-learn 对 MLR 的正确性? [关闭]

scikit-learn Adaboost类库使用小结