暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【经验与坑】Java调用基于Python的机器学习模型

当前需求:

Web后端基于Java语言编写,后端中的计算模块产生的计算结果是机器学习模型的参数。

(1)Java后端向python模型传递参数

(2)python模型接收参数,生成分类结果值

(3)python模型将分类结果值返回给Java后端


一.生成pkl文件

注意版本问题,默认生成为python3文件

#使用joblib.dump方法将模型保存到文件
import joblib
joblib.dump(rfc,'model_joblib.pkl')
print('模型导出文件成功!')
复制

如果想得到python2版本的话:

    #使用joblib.dump方法将模型保存到文件
    import joblib
    joblib.dump(rfc,'model_joblib.pkl',protocol=2)
    print('模型导出文件成功!')
    复制

    二.创建Flask项目

    通过pycharm傻瓜式操作即可。

    三.Flask部分核心代码

      import joblib
      import numpy as np
      from flask import Flask,request,jsonify
      import pickle
      import pandas as pd
      import sklearn


      app = Flask(__name__)


      # 加载机器学习模型
      model = joblib.load('/data/workarea/PythonArea/xxxProject/xxxtic/model_joblib.pkl')


      @app.route('/classify',methods=['POST'])
      def predict():
      # Get the input data from the request
      input_data = request.get_json()


      # Convert the input data to a numpy array
      input_array = np.array(input_data['input'])


      # Make the prediction using the model
      prediction = model.predict(input_array.reshape(1, -1))


      # Return the prediction as a JSON response
      response = {
      'prediction': prediction[0]
      }
      return jsonify(response)




      if __name__ == '__main__':
      app.run()


      复制

      试运行项目,并通过ApiPost工具对接口进行测试

      那么python这部分的服务到这里就完成了。接下来的工作就是在Java后端中传递参数并获得结果。


      四.Java后端请求分类结果

        package com.githan.utils;


        import com.alibaba.fastjson.JSONArray;
        import com.alibaba.fastjson.JSONObject;


        import java.io.*;
        import java.net.HttpURLConnection;
        import java.net.URL;


        /**
        * @author han56
        * @description 功能描述:调用python机器学习模型
        * @create 2023/4/13 上午9:30
        */
        public class UseDecisionModel {




        public static void main(String[] args) {
        try {
        // 创建连接
        URL url = new URL("http://127.0.0.1:5000/classify");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
        connection.setRequestProperty("Accept", "application/json");
        connection.setRequestProperty("Accept-Encoding", "UTF-8");


        // 构建请求参数
        JSONObject requestParams = new JSONObject();
        JSONArray jsonArray = new JSONArray();
        jsonArray.add(1.0);jsonArray.add(1.34);jsonArray.add(65150.70672);
        requestParams.put("input",jsonArray);


        // 发送请求
        OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
        writer.write(requestParams.toString());
        writer.flush();
        writer.close();


        // 获取响应
        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String line;
        StringBuilder response = new StringBuilder();
        while ((line = reader.readLine()) != null) {
        response.append(line);
        }
        reader.close();


        // 打印响应
        JSONObject res = JSONObject.parseObject(response.toString());
        System.out.println(res);
        } catch (Exception e) {
        e.printStackTrace();
        }
        }
        }


        复制

        这样就基本完成了Java后端与Python项目之间的互通了,这样实现的好处就是不受版本限制,在python中版本不同还是很坑的。缺点:效率偏低等。


        文章转载自码农智涵的程序人生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论