本篇讲讲模型执行相关操作,以逻辑回归评分卡为示例。
根据已有模型,调用执行接口:
http://ip:port//model/execute
post
{
“modelFilePath”:"/data/model/lr.pkl",
“paramsData”:{
#这里是模型特征
}
}
后台代码如下:
import numpy as np
import pandas as pd
import scorecardpy as sc
#缓存变量
modelPath,binsPath='',''
bins,model=[],[]
@app.route('/model/execute',methods=['POST'])
def execute_data():
start = time.time()
try:
global modelPath,binsPath,bins,model
logger.info('入参:%s',str(request.get_data()))
request_data = request.get_json() #获取传入数据
paramsJson = request_data['paramsData']
modelFilePath = modelFilePathCheck(request_data)
if (type(paramsJson) == type({})):
#原始数据中数值型字符串转为int64
items = paramsJson.items();
for key,value in items:
if (is_number(value)):
paramsJson[key] = int(value)
logger.info("paramsJson:%s",paramsJson)
#构建dataFrame
df = pd.json_normalize(paramsJson)
if (modelPath != modelFilePath):
logger.info('调用模型路径发生变化,重新加载模型!')
logger.info('global modelFilePath:%s',modelPath)
logger.info('param modelFilePath:%s',modelFilePath)
modelPath = modelFilePath
#导入模型
model = joblib.load(modelFilePath)
else:
logger.info('调用模型路径未发生变化,使用缓存中模型。')
logger.info('global modelFilePath:%s',modelPath)
#原始数据转换为woe值
bins = model.bins
df_woe = sc.woebin_ply(df, bins)
#打标签
label = model.predict(df_woe)[0]
#构建评分卡
card = sc.scorecard(bins, model, df_woe.keys())
#评分
score = sc.scorecard_ply(df, card,only_total_score=False, print_step=0)
#计算每个特征的得分
featureScore = {}
# featureScore = calculateFeatures(df, card)
if isinstance(card, dict):
card_df = pd.concat(card, ignore_index=True)
elif isinstance(card, pd.DataFrame):
card_df = card.copy(deep=True)
# x variables
xs = card_df.loc[card_df.variable != 'basepoints', 'variable'].unique()
for i in xs:
featureScore[i] = score[i + '_points'][0]
result = {}
result['code'] = '00000'
result['score'] = str(score['score'][0])
result['label'] = str(label)
result['featureScore'] = featureScore
end = time.time()
logger.info("运行结果:%s,模型执行耗时:%s",result,end-start)
return jsonify(result)
code10002['errorMsg']='输入值错误:请传入json格式参数'
return jsonify(code10002)
except Exception as e:
#do something
程序中加入了global变量来对模型进行缓存,目的是提高对同一模型的调用效率。
(一)机器学习模型的api调用之初探
(二)机器学习模型的api调用之日志打印
(三)机器学习模型的api调用之异常控制
(四)机器学习模型的api调用之特征查询
(五)机器学习模型的api调用之模型执行