python - 使用 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)
解决方案
当涉及到由不同转换器组成的 Pipeline 对象时,pickle.dump 存在问题。
这是关于相关解决方案问题的先前帖子:How to proper pickle sklearn pipeline when using custom transformer
我尝试了 cloudpickle,它与 skleanr.Pipeline 一起工作。
推荐阅读
- c++ - How Integers initialize in C++?
- python - 允许 Python 模块写入 AWS Lambda 上的磁盘
- python - 如何将变量存储在多行字符串变量中?
- google-app-engine - Google Cloud Datastore Emulator 如何验证我们的 datastore-index.xml?
- mysql - 显示查询结果中具有特定字段类型的所有数据
- unity3d - 从外部文件夹实例化 3D 模型
- ios - RxSwift 中有没有办法观察数组内部的变化而不设置新值?
- javascript - 如何获得整个网页的高度?javascript
- node.js - 如何在等待/异步中返回承诺的价值,而不是承诺本身?
- php - 在 PHP Laravel 5.1 中验证必须包含字母、数字和特殊字符的密码