Introduction: Why Java in the World of Machine Learning?
\nWhen it comes to machine learning (ML), most developers and researchers immediately think of Python with its ecosystem of libraries (scikit-learn, TensorFlow, PyTorch). However, Java, as one of the most popular languages for enterprise development, also offers solid tools for ML. On high-load platforms, in the banking sector, telecommunications, and Big Data infrastructures (e.g., Apache Hadoop or Spark), Java remains indispensable. In this article, we will examine the real capabilities of Java for machine learning, show code examples, and honestly discuss the limitations you will encounter in practice.
\n\nMain Part
\n\n1. Key Java Libraries for ML: From Weka to Deep Learning
\nJava cannot boast as many "out-of-the-box" solutions as Python, but it has several powerful frameworks.
\n- \n
- Weka — a classic library for research tasks. It contains many algorithms for classification, regression, clustering, and visualization. \n
- Deeplearning4j (DL4J) — an industrial library for deep learning, running on top of ND4J (an analog of NumPy for Java). It supports CNN, RNN, and integration with Spark. \n
- Smile (Statistical Machine Intelligence & Learning Engine) — a modern library focused on performance and API simplicity. \n
- Apache Mahout — a library for scalable ML on top of Hadoop/Spark, focused on collaborative filtering and clustering. \n
Let's look at a practical example of classifying Fisher's Irises using Weka:
\nimport weka.classifiers.Classifier;\nimport weka.classifiers.trees.J48;\nimport weka.core.Instances;\nimport weka.core.converters.ConverterUtils.DataSource;\n\npublic class WekaExample {\n public static void main(String[] args) throws Exception {\n // Loading data from an ARFF file\n DataSource source = new DataSource("iris.arff");\n Instances data = source.getDataSet();\n // Setting the target attribute (last column)\n if (data.classIndex() == -1)\n data.setClassIndex(data.numAttributes() - 1);\n\n // Creating and training a decision tree (C4.5)\n Classifier classifier = new J48(); // J48 is an implementation of C4.5\n classifier.buildClassifier(data);\n\n System.out.println("Model trained: " + classifier);\n }\n}\n\nAs you can see, the code is concise, but it requires preliminary conversion of data into ARFF format (although Weka supports CSV).
\n\n2. Integration with the Big Data Ecosystem: Java's Strong Point
\nThe main advantage of Java over Python for ML is native integration with Apache Spark and Hadoop. If your data pipeline is already built on Spark (written in Scala or Java), running an ML model on the same JVM cluster eliminates data serialization and unnecessary network calls.
\nExample of using MLlib (Spark's machine learning library) for logistic regression:
\nimport org.apache.spark.ml.classification.LogisticRegression;\nimport org.apache.spark.ml.classification.LogisticRegressionModel;\nimport org.apache.spark.sql.Dataset;\nimport org.apache.spark.sql.Row;\nimport org.apache.spark.sql.SparkSession;\n\npublic class SparkMLExample {\n public static void main(String[] args) {\n SparkSession spark = SparkSession.builder()\n .appName("JavaSparkML")\n .master("local[*]")\n .getOrCreate();\n\n // Loading data (assumed to already be in DataFrame format)\n Dataset<Row> data = spark.read().format("libsvm")\n .load("data/mllib/sample_libsvm_data.txt");\n\n // Training the model\n LogisticRegression lr = new LogisticRegression()\n .setMaxIter(10)\n .setRegParam(0.01);\n L