用 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/ ,如需转载,请注明出处,否则将追究法律责任。