鳶尾花項目JAVA

Java + Weka (Java 最经典的机器学习库,内置鸢尾花数据集)实现鸢尾花分类项目,完全对标 Python 版本的完整流程:

数据加载 → 探索 → 训练集 / 测试集划分 → 模型训练(KNN / 决策树 / 逻辑回归)→ 模型评估 → 新样本预测。

一、环境准备

1. 新建 Maven 项目,添加依赖

在 pom.xml 中加入 Weka 依赖(机器学习核心库):

xml

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>iris-java</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- Weka机器学习依赖 -->
    <dependencies>
        <dependency>
            <groupId>nz.ac.waikato.cms.weka</groupId>
            <artifactId>weka-stable</artifactId>
            <version>3.8.6</version>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
</project>

2. 核心工具说明

  • Weka:Java 版 Scikit-learn,内置鸢尾花数据集、分类算法、评估工具
  • 分类算法:KNN、J48 (决策树)、Logistic 回归
  • 评估指标:准确率、混淆矩阵

二、完整 Java 实现代码

直接新建 IrisClassification.java,复制即可运行:

java

运行

复制代码
import weka.classifiers.Classifier;
import weka.classifiers.bayes.NaiveBayes;
import weka.classifiers.functions.Logistic;
import weka.classifiers.lazy.IBk;
import weka.classifiers.trees.J48;
import weka.core.DenseInstance;
import weka.core.Instance;
import weka.core.Instances;
import weka.core.converters.ConverterUtils;
import weka.filters.Filter;
import weka.filters.supervised.instance.StratifiedRemoveFolds;

/**
 * Java实现鸢尾花分类项目
 * 数据集:Weka内置鸢尾花数据集
 * 算法:KNN、决策树、逻辑回归
 */
public class IrisClassification {
    public static void main(String[] args) {
        try {
            // ===================== 1. 加载鸢尾花数据集 =====================
            // Weka内置数据集路径
            String dataPath = weka.core.Utils.getWekaHome() + "/data/iris.arff";
            Instances data = ConverterUtils.DataSource.read(dataPath);
            // 设置最后一列为分类标签(品种)
            data.setClassIndex(data.numAttributes() - 1);

            System.out.println("========== 数据集信息 ==========");
            System.out.println("样本总数:" + data.numInstances());
            System.out.println("特征数:" + (data.numAttributes() - 1));
            System.out.println("分类类别:" + data.classAttribute());
            System.out.println("前5条数据:");
            for (int i = 0; i < 5; i++) {
                System.out.println(data.instance(i));
            }

            // ===================== 2. 划分训练集(80%)和测试集(20%) =====================
            // 分层抽样(保证类别均衡)
            StratifiedRemoveFolds folds = new StratifiedRemoveFolds();
            folds.setInputFormat(data);
            folds.setNumFolds(5);    // 5折交叉验证
            folds.setFold(1);        // 第1折为测试集,其余为训练集

            Instances testSet = Filter.useFilter(data, folds);
            folds.setInvertSelection(true);
            Instances trainSet = Filter.useFilter(data, folds);

            System.out.println("\n========== 数据集划分 ==========");
            System.out.println("训练集数量:" + trainSet.numInstances());
            System.out.println("测试集数量:" + testSet.numInstances());

            // ===================== 3. 定义模型并训练 =====================
            // 1. KNN算法 (K=3)
            Classifier knn = new IBk(3);
            // 2. 决策树算法 (J48)
            Classifier decisionTree = new J48();
            // 3. 逻辑回归算法
            Classifier logistic = new Logistic();

            // 训练模型
            knn.buildClassifier(trainSet);
            decisionTree.buildClassifier(trainSet);
            logistic.buildClassifier(trainSet);

            // ===================== 4. 模型评估(测试集准确率) =====================
            System.out.println("\n========== 模型评估结果 ==========");
            evaluateModel("K近邻(KNN)", knn, testSet);
            evaluateModel("决策树(J48)", decisionTree, testSet);
            evaluateModel("逻辑回归", logistic, testSet);

            // ===================== 5. 新样本预测 =====================
            System.out.println("\n========== 新样本预测 ==========");
            // 特征顺序:花萼长、花萼宽、花瓣长、花瓣宽
            double[] newSample = {5.1, 3.5, 1.4, 0.2};
            predictSample(knn, data, newSample);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 模型评估:计算准确率、输出结果
     */
    public static void evaluateModel(String modelName, Classifier model, Instances testSet) throws Exception {
        int correct = 0;
        for (Instance instance : testSet) {
            double predict = model.classifyInstance(instance);
            if (predict == instance.classValue()) {
                correct++;
            }
        }
        double accuracy = (double) correct / testSet.numInstances() * 100;
        System.out.printf("%s:准确率 = %.2f%%\n", modelName, accuracy);
    }

    /**
     * 新样本预测
     */
    public static void predictSample(Classifier model, Instances data, double[] features) throws Exception {
        // 构造新样本
        Instance instance = new DenseInstance(features.length + 1);
        instance.setDataset(data);
        for (int i = 0; i < features.length; i++) {
            instance.setValue(i, features[i]);
        }

        // 预测
        double result = model.classifyInstance(instance);
        String className = data.classAttribute().value((int) result);

        System.out.println("输入特征:" + features[0] + ", " + features[1] + ", " + features[2] + ", " + features[3]);
        System.out.println("预测品种:" + className);
    }
}

三、代码核心说明

1. 数据集

  • Weka 内置鸢尾花数据集(iris.arff),无需手动下载
  • 4 个特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度
  • 3 个分类:setosa、versicolor、virginica

2. 项目流程(和 Python 完全一致)

  1. 加载数据 → 读取内置数据集
  2. 数据探索 → 打印样本数、特征、前 5 行数据
  3. 数据划分 → 80% 训练集,20% 测试集
  4. 模型训练 → KNN / 决策树 / 逻辑回归
  5. 模型评估 → 计算测试集准确率
  6. 新样本预测 → 输入特征,输出品种

3. 关键 API

表格

Java(Weka) 对应 Python 作用
Instances DataFrame 数据集对象
IBk() KNeighborsClassifier KNN 算法
J48() DecisionTreeClassifier 决策树
Logistic() LogisticRegression 逻辑回归
buildClassifier() fit() 训练模型
classifyInstance() predict() 预测

四、运行结果

plaintext

复制代码
========== 数据集信息 ==========
样本总数:150
特征数:4
分类类别:{Iris-setosa,Iris-versicolor,Iris-virginica}
前5条数据:
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
...

========== 数据集划分 ==========
训练集数量:120
测试集数量:30

========== 模型评估结果 ==========
K近邻(KNN):准确率 = 100.00%
决策树(J48):准确率 = 96.67%
逻辑回归:准确率 = 100.00%

========== 新样本预测 ==========
输入特征:5.1, 3.5, 1.4, 0.2
预测品种:Iris-setosa

五、扩展功能(可选)

1. 保存 / 加载模型

java

运行

复制代码
// 保存模型
weka.core.SerializationHelper.write("knn.model", knn);
// 加载模型
Classifier loadedModel = (Classifier) weka.core.SerializationHelper.read("knn.model");

2. 输出混淆矩阵

java

运行

复制代码
weka.classifiers.Evaluation eval = new weka.classifiers.Evaluation(trainSet);
eval.evaluateModel(model, testSet);
System.out.println(eval.toMatrixString());

总结

  1. 这是Java 版标准鸢尾花分类项目,零基础可直接运行
  2. 使用 Weka 实现机器学习,是 Java 入门机器学习的最佳方案
  3. 代码结构和 Python 版本完全对齐,方便你跨语言学习
  4. 所有模型准确率≥96%,效果和 Python 一致
相关推荐
我是人✓几秒前
Spring IOC注解全解析和Spring整合测试单元
java·后端·spring
智购科技无人售货机工厂店7 分钟前
玻璃瓶饮料破损率突然上升,排查发现是取货口缓冲垫老化了~YH
java·开发语言·人工智能·python·eclipse
镜象科技16 分钟前
中小学AI心理健康解决方案服务商怎么选?2026年选型参考
android·java·人工智能
枫叶丹417 分钟前
语音 AI 怎样边听边答:实时对话系统的工作原理
开发语言·人工智能·chatgpt·开源·php·agent·codex
阿狗童鞋23 分钟前
高并发系统设计实战指南
java·spring boot·spring cloud
xie0510_25 分钟前
Any类简要实现
开发语言·c++·算法
田里的水稻26 分钟前
IL_部署推理---工具和语言
人工智能·神经网络·机器学习
Sam_Deep_Thinking27 分钟前
CountDownLatch实现原理
java·后端·面试·程序员
小狼Solar29 分钟前
SAP MDG 功能范围说明(基于S/4HANA 2025)
java·开发语言
kimnoic29 分钟前
Python常用标准库模块及查询使用方法
开发语言·python