线性回归实战:Java 连接 KingbaseES 进行模型训练与评估
数据入库只是开始。真正的考验是:能否从这张表里,训练出一个不仅'能跑',而且'可信'的模型?
很多人一上来就调 DL4J 的 MultiLayerNetwork,跑完看个 loss 下降就收工。但现实是:loss 低 ≠ 预测准,尤其在线性回归这种可解释模型中,评估比训练更重要。
而真相是:模型的价值,不在于它多复杂,而在于你能多清楚地知道它在哪有效、在哪失效。
今天我们就用纯 Java,从 KES 中加载清洗后的房价数据,手写梯度下降训练线性回归模型,并做一套工程级的评估流程——全程不依赖 Python,不导出 CSV,只用 JDK + KES JDBC + 基础数学。
一、目标明确:我们要评估什么?
对于回归任务,不能只看'平均误差'。我们需要回答:
- 模型整体拟合程度如何? → R²(决定系数)
- 预测偏差有多大? → MAE(平均绝对误差)、RMSE(均方根误差)
- 是否系统性高估或低估? → 残差分布(Residual Plot)
- 在哪些区域表现差? → 按收入/区域分组分析
这些指标,必须基于测试集计算,且数据完全来自 KES。
二、Java 实现:从 KES 加载训练/测试集
首先定义数据结构:
public static class HousingSample {
public final double[] features; // [longitude, latitude, ..., rooms_per_household]
public final double label; // median_house_value (万美元)
public HousingSample(double[] features, double label) {
this.features = features;
this.label = label;
}
}
然后从 KES 读取:
public List<HousingSample> loadDataset(Connection conn, String tableName) throws SQLException {
String sql = """
SELECT longitude, latitude, housing_median_age, total_rooms, total_bedrooms,
population, households, median_income, rooms_per_household,
population_per_household, median_house_value AS label
FROM ai_datasets.""" + tableName;
List<HousingSample> samples = <>();
( conn.prepareStatement(sql); ps.executeQuery()) {
(rs.next()) {
[] x = {
rs.getDouble(), rs.getDouble(),
rs.getDouble(), rs.getDouble(),
rs.getDouble(), rs.getDouble(),
rs.getDouble(), rs.getDouble(),
rs.getDouble(), rs.getDouble()
};
rs.getDouble();
samples.add( (x, y));
}
}
samples;
}

