You searched for some way to export your machine learning models so you can use them for evaluating your data and you see that you can export them in PMML format. You actually work in Java ecosystem but not motivated to write neither your PMML library nor an rest api for it. Then I will recommend you LightningScorer, which is a side project of mine.
Let's take you a tour for deploying, and scoring your machine learning models.
Get your local copy first
and build it with maven
and start it by going to your target folder
Now lets make sure our server is up and running by going to
Server returns
Ok then we are now ready to kick ass.
I'll use apache commons' http get/post methods. First, we'll deploy our machine learning model. Then we will check if it's safe and sound and then use our input values and score it. We will use a decision tree trained with iris data set from UCI machine learning repository. We will send 4 parameters ( sepal length and width and petal length and width) and the model will classify it for us into one of 3 values.
Let's take you a tour for deploying, and scoring your machine learning models.
Get your local copy first
git clone https://github.com/sezinkarli/lightningscorer.git
and build it with maven
mvn clean install
and start it by going to your target folder
java -jar lightningscorer-uberjar-1.0.jar
Now lets make sure our server is up and running by going to
http://localhost:8080/.
Server returns
{ "data": "I have come here to chew bubblegum and kick ass...", "success": true }
Ok then we are now ready to kick ass.
I'll use apache commons' http get/post methods. First, we'll deploy our machine learning model. Then we will check if it's safe and sound and then use our input values and score it. We will use a decision tree trained with iris data set from UCI machine learning repository. We will send 4 parameters ( sepal length and width and petal length and width) and the model will classify it for us into one of 3 values.
final String url = "http://localhost:8080/model/"; final String modelId = "test1"; //http://dmg.org/pmml/pmml_examples/KNIME_PMML_4.1_Examples/single_iris_dectree.xml File pmmlFile = new File("/tmp/single_iris_dectree.xml"); CloseableHttpClient client = HttpClients.createDefault(); //first we will deploy our pmml file HttpPost deployPost = new HttpPost(url + modelId); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addBinaryBody("model", new File(pmmlFile.getAbsolutePath()), ContentType.APPLICATION_OCTET_STREAM, "model"); HttpEntity multipart = builder.build(); deployPost.setEntity(multipart); CloseableHttpResponse response = client.execute(deployPost); String deployResponse = IOUtils.toString(response.getEntity().getContent(), Charset.forName("UTF-8")); System.out.println(deployResponse); // response is {"data":true,"success":true} deployPost.releaseConnection(); //now we check the model HttpGet httpGet = new HttpGet(url + "ids"); response = client.execute(httpGet); String getAllModelsResponse = IOUtils.toString(response.getEntity().getContent(), Charset.forName("UTF-8")); System.out.println(getAllModelsResponse); // response is {"data":["test1"],"success":true} httpGet.releaseConnection(); // lets score our deployed mode with parameters below HttpPost scorePost = new HttpPost(url + modelId + "/score"); StringEntity params = new StringEntity("{" + "\"fields\":" + "{\"sepal_length\":4.5," + "\"sepal_width\":3.5," + "\"petal_length\":3.5," + "\"petal_width\":1" + "}" + "} "); scorePost.addHeader("content-type", "application/json"); scorePost.setEntity(params); CloseableHttpResponse response2 = client.execute(scorePost); String scoreResponse = IOUtils.toString(response2.getEntity().getContent(), Charset.forName("UTF-8")); System.out.println(scoreResponse); //response is{"data":{"result":{"class":"Iris-versicolor"}},"success":true} scorePost.releaseConnection(); client.close();
awesome tutorial waiting for next
ReplyDeleteI see your project is Apache Licensed, but jpmml-evaluator is GNU Affero General Public License (AGPL) version 3.0. Does that mean that anybody that uses LightningScorer service will have to open source their calling software.
ReplyDeleteAre the two licenses even compatible? see https://www.apache.org/licenses/GPL-compatibility.html
its not working
ReplyDeleteI am getting error ERROR | 29/May/2018 23:18:40:578 | server | org.rapidoid.net.impl.AbstractLoop | Error occurred before loop is started | name = server | error = java.lang.RuntimeException: Cannot open socket!
java.lang.RuntimeException: Cannot open socket!
at org.rapidoid.u.U.rte(U.java:427)
at org.rapidoid.net.impl.RapidoidServerLoop.beforeLoop(RapidoidServerLoop.java:80)
at org.rapidoid.net.impl.AbstractLoop.run(AbstractLoop.java:56)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.BindException: Address already in use
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.rapidoid.net.impl.RapidoidServerLoop.openSocket(RapidoidServerLoop.java:110)
at org.rapidoid.net.impl.RapidoidServerLoop.beforeLoop(RapidoidServerLoop.java:78)
... 2 more
its related to port number how do I put my port number instead of 8080
Hello Nitin,
DeleteIt is quite easy. Just edit config.yml.example file in the project.
edit this line and write whatever you want
port: 8081