Core Java

Machine Learning in Java, part 1

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

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();
Published on Java Code Geeks with permission by Sezin Karli, partner at our JCG program. See the original article here: machine learning ass-kicking in java part 1

Opinions expressed by Java Code Geeks contributors are their own.

Sezin Karli

Mathematics Engineer & Computer Scientist with a passion for software development. Avid learner for new technologies. Currently working as Senior Software Engineer at Sahibinden.com.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

3 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Behzod
Behzod
6 years ago

someone can understand more easy way, cause I’m not a geek :0

gregory higgins
6 years ago

I 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?

Are the two licenses even compatible? see https://www.apache.org/licenses/GPL-compatibility.html

Sezin Karli
6 years ago

Hey Gregory, thanks for your inquiry. I checked and saw that strong licenses like agpl must be used if your dependencies are agpl so I updated my license. Thanks a lot!

Back to top button