ITPub博客

首页 > 应用开发 > Java > java用 scikit-learn 实现一个模型自动训练+调参器。

java用 scikit-learn 实现一个模型自动训练+调参器。

原创 Java 作者:tiannuo 时间:2026-05-09 10:57:18 0 删除 编辑

用 Smile 实现 自动训练 + 超参数搜索


假设我们做一个 分类任务,用 随机森林 + 网格搜索。


import smile.classification.RandomForest;

import smile.data.DataFrame;

import smile.data.Tuple;

import smile.data.formula.Formula;

import smile.io.Read;

import smile.validation.CrossValidation;

import smile.validation.metric.Accuracy;


import java.io.IOException;


public class AutoTrainExample {


    public static void main(String[] args) throws IOException {

        // 1. 读取数据

        DataFrame df = Read.csv("iris.csv"); // csv 文件,最后一列是标签


        // 2. 定义训练公式

        Formula formula = Formula.lhs("class"); // class 是标签列名


        // 3. 自动调参器

        int[] nTreesOptions = {50, 100, 200};

        int[] maxDepthOptions = {3, 5, 10};


        double bestAcc = 0;

        RandomForest bestModel = null;


        for (int nTrees : nTreesOptions) {

            for (int maxDepth : maxDepthOptions) {

                RandomForest model = RandomForest.fit(formula, df, nTrees, maxDepth);

                CrossValidation cv = new CrossValidation(df.nrows(), 5); // 5折交叉验证

                double acc = 0;

                for (int i = 0; i < 5; i++) {

                    int[] trainIdx = cv.train[i];

                    int[] testIdx = cv.test[i];

                    RandomForest foldModel = RandomForest.fit(formula, df.select(trainIdx), nTrees, maxDepth);

                    int correct = 0;

                    for (int idx : testIdx) {

                        Tuple row = df.get(idx);

                        int yTrue = row.getInt(df.schema().fieldIndex("class"));

                        int yPred = foldModel.predict(row);

                        if (yTrue == yPred) correct++;

                    }

                    acc += correct / (double) testIdx.length;

                }

                acc /= 5.0;

                System.out.printf("nTrees=%d, maxDepth=%d, CV Accuracy=%.4f%n", nTrees, maxDepth, acc);


                if (acc > bestAcc) {

                    bestAcc = acc;

                    bestModel = model;

                }

            }

        }


        System.out.println("Best Accuracy: " + bestAcc);

        // 可以保存模型 bestModel 或直接预测

    }

}


✅ 特点:


网格搜索实现自动调参(类似 scikit-learn 的 GridSearchCV)

支持交叉验证

可扩展到其他算法,如 SVM、KNN、决策树

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70050070/viewspace-3117387/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2026-05-08

  • 博文量
    74
  • 访问量
    66702