项目描述
基于舆情数据建模分析,进行机器学习模型的部署、应用。
- 生成机器学习模型;
- flask实现机器学习模型部署;
- flask实现前端输入一段文字、实现jieba分词、编码、过滤关键词、返回特种设备分类;
- flask接口实现json格式数据接入、jieba分词、过滤关键词、返回特种设备种类。
机器学习模型生成
# 以贝叶斯分类器为例
from sklearn.naive_bayes import MultinomialNB # MultinomialNB:Naive Bayes classifier for multinomial models
classifier = MultinomialNB()
classifier.fit(vec.transform(words), y_train)
机器学习模型保存和读取
使用Pickle文件格式
# 保存,在当前目录下可以看到svm.pickle
import pickle
# 方法1
# 保存模型
with open('classifier.pickle','wb') as fw:
pickle.dump(classifier,fw)
#加载模型classifier.pickle
with open('classifier.pickle','rb') as fr:
new_classifier1 = pickle.load(fr)
#使用模型
print (new_classifier1.predict(X[0:1]))
# 方法2
# 保存模型
with open('classifier.pkl', 'wb') as fid:
pickle.dump(classifier, fid,2) # 保存为2进制文件
- python open 函数的参数
Python open() 函数
使用sklearn的Joblib文件格式
import joblib
# 保存模型
joblib.dump(classifier,'classifier.pkl')
# 加载模型svm.pkl
new_classifier2 = joblib.load('classifier.pkl')
# 使用模型
print (new_classifier2.predict(X[0:1]))
应用Flask进行机器学习模型部署
使用jsonify
from flask import jsonify
app.config['JSON_AS_ASCII'] = False #放在app = Flask(__name__)之后,解决中文显示编码的问题实现直接显示中文
# 设置一个list
equtypes = [
{
'锅炉': 1, "压力容器": 2, "压力管道": 3, "电梯": 4, "起重机械":5, "客运索道": 6,"大型游乐设施": 7,"场(厂)内专用机动车辆": 8,"其他": 9
}
]
# 设置json路由
@app.route('/json',methods=['GET'])
def get_json():
return jsonify({'equtypes': equtypes})
过程记录和总结
部署特种设备舆情分类模型。
问题1:提示输入的数据维数与模型维数不一致
解决:
主要是CountVectorizer 的fit(words) ,模型训练的时候fit过,对于输入的数据,再次进行fit得到的数据维数不一致;初步的解决办法:
使用训练数据fit一下,然后直接transform 输入的新数据。
问题2:重新部署后,模型正确率严重降低
训练时候提示争取率达到了95%,部署后输入几个测试数据,都失败了;
解决:
排除法:
- 尝试flask和jupyter输入同一个文本,查看输出:结果不一样;
- 尝试flask和jupyter输入同一个文本,查看fit后的特征矩阵,结果不一样,问题应该出在了CountVectorizer 的fit(words)上(初步锁定问题)。
- 尝试在jupyter下,打包和加载,查看输出:结果一样,保持了准确率;排除打包问题;解决办法:
- 定义一个before_first_request 函数,实现模型初始化。
@app.before_first_request
def model_creation()
整体部署应用方案
- https://github.com/ccmajor/ml-flask-EquType-Prediction
- https://gitee.com/stdfirm/ml-flask-EquType-Prediction
致谢
在应用Flask进行模型部署的过程中,参考学习了github flask ml。
GitHub地址:https://github.com/xcitech/ml-flask-tutorial在前辈的基础上,这一段路走的顺利了很多;希望能够对后来者有所帮助,加油~