Java 人工智能 - Weka - 回归算法
数据样本
数据集为能源效率数据集
基于建筑的结构的表面 墙体 屋顶面积 高度 紧凑度特点 研究它们的目标变量 加热与冷却负载要求
现在有 12 种不同房屋配置
这 12 种的不同房屋配置 通过改变 18 种建筑特征得出 768种建筑
加载数据
CSV 格式
CSV的意思为逗号分隔值



转换之后

// 加载 CSV 文件
CSVLoader loader = new CSVLoader();
// 设置数据源
loader.setSource(new File(EnergyLoad.class.getClassLoader().getResource("data/ENB2012_data.csv").getPath()));
// 获取数据集
Instances data = loader.getDataSet();
System.out.println(data);


// 除开冷 热 属性作为结果变量 其余属性作为分类属性
data.setClassIndex(data.numAttributes() - 2);
// 移除冷却负载属性 即为 Y2
Remove remove = new Remove();
remove.setOptions(new String[]{"-R", data.numAttributes() + ""});
remove.setInputFormat(data);
data = Filter.useFilter(data, remove);
System.out.println(data);
@relation ENB2012_data-weka.filters.unsupervised.attribute.Remove-R10
@attribute X1 numeric
@attribute X2 numeric
@attribute X3 numeric
@attribute X4 numeric
@attribute X5 numeric
@attribute X6 numeric
@attribute X7 numeric
@attribute X8 numeric
@attribute Y1 numeric
使用算法训练模型
// 创建一个线性回归模型
// 新模型实例 传递参数和数据
LinearRegression model = new LinearRegression();
// 学习的模型存储在 model 对象当中
model.buildClassifier(data);
System.out.println(model);
Linear Regression Model
Y1 =
-64.774 * X1 +
-0.0428 * X2 +
0.0163 * X3 +
-0.089 * X4 +
4.1699 * X5 +
19.9327 * X7 +
0.2038 * X8 +
83.9329
线性回归模型构建了一个函数 把输入变量 x 的 各个值 映射为y 组合在一起 并且满足线性关系
对加热负载进行评估
特征变量前面的数字 对要预测的目标变量的影响
+符号表示正面影响
-符号表示负面影响
数值的大小影响的程度
比如特征X1 相对紧凑度 它跟加热负载是负相关
玻璃窗面积与加热负载正相关的
这两个特征也对最后加热负载的评估有明显影响
交叉验证对模型性能做评估
做10折交叉验证
Evaluation eval = new Evaluation(data);
eval.crossValidateModel(model, data, 10,
new Random(1), new String[]{});
System.out.println(eval.toSummaryString());
输出常见的评估指标 包括相关系数 平均绝对误差 相对绝对误差
Correlation coefficient 0.956
Mean absolute error 2.0923
Root mean squared error 2.9569
Relative absolute error 22.8555 %
Root relative squared error 29.282 %
Total Number of Instances 768
回归树
一组回归模型
每一个模型对应与模型相关的数据中一部分

回归模型与所有数据达到最好的拟合的模型
拟合可以理解为误差
回归树是一组的回归模型
每个回归模型只对一部分数据进行建模
相比回归模型来说 回归树对数据的拟合更加好
但是两个回归模型(函数)在各自的建模区域之间会出现分段的现象
Weka 中用 M5 类实现回归树
// 回归树
M5P md5 = new M5P();
md5.setOptions(new String[]{""});
md5.buildClassifier(data);
System.out.println(md5);
M5 pruned model tree:
(using smoothed linear models)
X1 <= 0.75 :
| X7 <= 0.175 :
| | X1 <= 0.65 : LM1 (48/1.264%)
| | X1 > 0.65 : LM2 (96/3.201%)
| X7 > 0.175 :
| | X1 <= 0.65 : LM3 (80/3.652%)
| | X1 > 0.65 :
| | | X7 <= 0.325 : LM4 (80/3.724%)
| | | X7 > 0.325 :
| | | | X1 <= 0.675 : LM5 (20/1.687%)
| | | | X1 > 0.675 :
| | | | | X8 <= 2.5 : LM6 (24/1.314%)
| | | | | X8 > 2.5 :
| | | | | | X8 <= 4.5 : LM7 (24/2.737%)
| | | | | | X8 > 4.5 :
| | | | | | | X1 <= 0.7 : LM8 (4/0.91%)
| | | | | | | X1 > 0.7 : LM9 (8/1.265%)
X1 > 0.75 :
| X1 <= 0.805 :
| | X7 <= 0.175 : LM10 (48/5.775%)
| | X7 > 0.175 :
| | | X7 <= 0.325 : LM11 (40/5.26%)
| | | X7 > 0.325 : LM12 (40/5.756%)
| X1 > 0.805 :
| | X7 <= 0.175 :
| | | X8 <= 1.5 :
| | | | X7 <= 0.05 :
| | | | | X2 <= 539 : LM13 (4/0%)
| | | | | X2 > 539 : LM14 (12/4.501%)
| | | | X7 > 0.05 :
| | | | | X1 <= 0.94 : LM15 (12/4.329%)
| | | | | X1 > 0.94 : LM16 (4/0.226%)
| | | X8 > 1.5 :
| | | | X1 <= 0.94 : LM17 (48/5.693%)
| | | | X1 > 0.94 : LM18 (16/1.119%)
| | X7 > 0.175 :
| | | X1 <= 0.84 :
| | | | X7 <= 0.325 :
| | | | | X8 <= 2.5 : LM19 (8/3.901%)
| | | | | X8 > 2.5 : LM20 (12/3.913%)
| | | | X7 > 0.325 : LM21 (20/5.632%)
| | | X1 > 0.84 :
| | | | X7 <= 0.325 : LM22 (60/4.548%)
| | | | X7 > 0.325 :
| | | | | X3 <= 306.25 : LM23 (40/4.504%)
| | | | | X3 > 306.25 : LM24 (20/6.934%)
LM num: 1
Y1 =
72.2602 * X1
+ 0.0053 * X3
+ 41.5669 * X7
- 0.0049 * X8
- 37.6688
LM num: 2
Y1 =
-14.6772 * X1
+ 0.0053 * X3
+ 40.2316 * X7
+ 0.0181 * X8
+ 15.649
LM num: 3
Y1 =
84.5112 * X1
+ 0.0053 * X3
+ 13.9115 * X7
- 0.1471 * X8
- 42.4943
LM num: 4
Y1 =
-2.8359 * X1
+ 0.0053 * X3
+ 4.3146 * X7
- 0.0111 * X8
+ 12.0357
LM num: 5
Y1 =
-6.0295 * X1
+ 0.0053 * X3
+ 4.3146 * X7
- 0.0524 * X8
+ 16.0295
LM num: 6
Y1 =
-4.3262 * X1
+ 0.0053 * X3
+ 4.3146 * X7
- 0.0665 * X8
+ 14.5905
LM num: 7
Y1 =
-4.3262 * X1
+ 0.0053 * X3
+ 4.3146 * X7
- 0.0888 * X8
+ 14.5832
LM num: 8
Y1 =
-4.3262 * X1
+ 0.0053 * X3
+ 4.3146 * X7
- 0.1025 * X8
+ 14.5352
LM num: 9
Y1 =
-0.8154 * X1
+ 0.0053 * X3
+ 4.3146 * X7
- 0.1025 * X8
+ 11.9531
LM num: 10
Y1 =
105.9033 * X1
+ 0.0113 * X3
+ 59.6616 * X7
+ 0.0975 * X8
- 58.7462
LM num: 11
Y1 =
81.6537 * X1
+ 0.0113 * X3
+ 10.8932 * X7
+ 0.0559 * X8
- 33.0837
LM num: 12
Y1 =
64.6565 * X1
+ 0.0113 * X3
+ 10.8932 * X7
- 0.0337 * X8
- 18.0037
LM num: 13
Y1 =
3.2622 * X1
- 0.0018 * X2
+ 0.0164 * X3
+ 44.6313 * X7
+ 0.0592 * X8
+ 11.9461
LM num: 14
Y1 =
9.1337 * X1
- 0.0018 * X2
+ 0.0164 * X3
- 0.0494 * X6
+ 44.6313 * X7
+ 0.0592 * X8
+ 7.321
LM num: 15
Y1 =
11.8776 * X1
- 0.0018 * X2
+ 0.0164 * X3
- 0.0428 * X6
+ 44.6313 * X7
+ 0.0592 * X8
+ 7.0198
LM num: 16
Y1 =
3.2622 * X1
- 0.0018 * X2
+ 0.0164 * X3
+ 44.6313 * X7
+ 0.0592 * X8
+ 14.1593
LM num: 17
Y1 =
35.1381 * X1
- 0.0018 * X2
+ 0.0164 * X3
+ 16.7723 * X7
+ 0.0592 * X8
- 10.1661
LM num: 18
Y1 =
3.2622 * X1
- 0.0018 * X2
+ 0.0164 * X3
+ 16.7723 * X7
+ 0.0592 * X8
+ 16.4949
LM num: 19
Y1 =
8.5464 * X1
- 0.0012 * X2
+ 0.029 * X3
+ 15.2851 * X7
- 0.2151 * X8
+ 7.86
LM num: 20
Y1 =
8.5464 * X1
- 0.0012 * X2
+ 0.029 * X3
+ 15.2851 * X7
- 0.0475 * X8
+ 7.4789
LM num: 21
Y1 =
8.5464 * X1
- 0.0012 * X2
+ 0.029 * X3
+ 15.2851 * X7
+ 0.013 * X8
+ 8.5537
LM num: 22
Y1 =
1.4309 * X1
- 0.0012 * X2
+ 0.1248 * X3
+ 9.5464 * X7
+ 0.0373 * X8
- 10.9927
LM num: 23
Y1 =
5.1744 * X1
- 0.0012 * X2
+ 0.0633 * X3
+ 9.5464 * X7
+ 0.0235 * X8
+ 5.7355
LM num: 24
Y1 =
5.1744 * X1
- 0.0012 * X2
+ 0.0761 * X3
+ 9.5464 * X7
- 0.0805 * X8
+ 3.4386
Number of Rules : 24
Process finished with exit code 0
一颗叶子节点带有方程式的树
就是说叶子节点是有方程式的

这棵树总共 13 个叶子节点
每个叶子节点对应于一个线程方程
对预测输出做可视化处理
最重要的特征在树顶为 X1 相对密实性
终端节点也叫叶子节点都是一个线性回归模型
总共线性回归模型用于解释到达这部分的数据
评估模型性能
// 评估M5P模型
eval.crossValidateModel(md5, data, 10, new Random(1), new String[]{});
System.out.println(eval.toSummaryString());
Correlation coefficient 0.9762
Mean absolute error 1.371
Root mean squared error 2.1889
Relative absolute error 14.9764 %
Root relative squared error 21.6771 %
Total Number of Instances 1536