本节将通过分析能源效率数据集(Tsanas和Xifara,2012)学习基本的回归算法。我们将基
于建筑的结构特点(比如表面、墙体与屋顶面积、高度、紧凑度)研究它们的加热与冷却负载要
求。研究者使用一个模拟器设计了12种不同的房屋配置,这些房屋配置通过改变18种建筑特征得
出,他们总共模拟了768种建筑。
我们的首要目标是系统分析每种建筑特征对目标变量——加热或冷却负载——产生的影响。
第二个目标是比较经典线性回归模型相对于其他方法(比如SVM回归、随机森林、神经网络)的
性能。这个任务中,我们将使用Weka库。
创建工程
接着使用上一篇文章的工程:
加载数据
// 加载数据CSVLoader loader = new CSVLoader();loader.setFieldSeparator(","); // 设置CSV文件的字段分隔符为逗号loader.setSource(new File(PATH)); // 设置数据源为CSV文件Instances data = loader.getDataSet(); // 从CSV文件中加载数据集
分析属性
进行属性分析之前,先了解要处理什么。总共有8个属性描述建筑特征,有两个目标变量:
heating与cooling。
创建与评估回归模型
首先,在特征位置设置分类属性,为加热负载建立学习模型。第二个目标变量(冷却负载)现在可以移除:
/** 构建回归模型*/// 设置类别索引为Y1(加热负荷),即目标变量data.setClassIndex(data.numAttributes() - 2); // 设置类别索引为倒数第二个属性,表示Y1// 移除最后一个属性Y2,因为Y2是另一个目标变量,我们只处理Y1Remove remove = new Remove();remove.setOptions(new String[]{"-R", String.valueOf(data.numAttributes())}); // 移除最后一个属性remove.setInputFormat(data); // 设置输入格式data = Filter.useFilter(data, remove); // 应用过滤器,移除最后一个属性
线性回归
首先,使用LinearRegression类创建一个基本的线性回归模型。正如在分类示例中所做的
那样,先初始化一个新模型实例,传递参数与数据,并调用buildClassifier(Instances)方 法:
// 构建线性回归模型LinearRegression model = new LinearRegression();model.buildClassifier(data); // 使用数据训练线性回归模型System.out.println(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
线性回归模型构建了一个函数,它把输入变量线性组合在一起,对加热负载进行评估。特征
前面的数字解释特征对目标变量的影响:符号表示正面影响或负面影响,而大小对应于影响程度。
比如特征X1(相对紧凑度),它与加热负载是负相关的,而玻璃窗面积与加热负载是正相关的。
这两个特征也对最后加热负载的评估有明显影响。
使用交叉验证技术可以对模型性能做类似评估。 做10折交叉验证(10-fold cross-validation)如下:
// 10折交叉验证Evaluation evaluation = new Evaluation(data); // 创建评估对象evaluation.crossValidateModel(model, data, 10, new Random(1), new String[]{}); // 执行10折交叉验证System.out.println(evaluation.toSummaryString()); // 输出交叉验证的概要信息double[] coefficients = model.coefficients(); // 获取线性回归模型的系数
结果如下:
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
回归树
另一个方法是构建一组回归模型,每一个模型对应于数据中与其自身相关的部分。图3-5展
示了回归模型与回归树之间的主要不同。回归模型指的是一个与所有数据达到最好拟合的独立模
型;而回归树是一组回归模型,每个模型只对一部分数据进行建模。
Weka中的M5类用于实现回归树。创建模型时,遵从步骤与前面一样:初始化模型、传递参
数与数据、调用buildClassifier(Instances)方法。
// 构建回归树模型(M5P模型)M5P m5p = new M5P();m5p.setOptions(new String[]{""}); // 设置选项,这里为空m5p.buildClassifier(data); // 使用数据训练M5P回归树模型System.out.println(m5p); // 输出M5P回归树模型的详细信息
结果如下:
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.6688LM num: 2
Y1 = -14.6772 * X1 + 0.0053 * X3 + 40.2316 * X7 + 0.0181 * X8 + 15.649LM num: 3
Y1 = 84.5112 * X1 + 0.0053 * X3 + 13.9115 * X7 - 0.1471 * X8 - 42.4943LM num: 4
Y1 = -2.8359 * X1 + 0.0053 * X3 + 4.3146 * X7 - 0.0111 * X8 + 12.0357LM num: 5
Y1 = -6.0295 * X1 + 0.0053 * X3 + 4.3146 * X7 - 0.0524 * X8 + 16.0295LM num: 6
Y1 = -4.3262 * X1 + 0.0053 * X3 + 4.3146 * X7 - 0.0665 * X8 + 14.5905LM num: 7
Y1 = -4.3262 * X1 + 0.0053 * X3 + 4.3146 * X7 - 0.0888 * X8 + 14.5832LM num: 8
Y1 = -4.3262 * X1 + 0.0053 * X3 + 4.3146 * X7 - 0.1025 * X8 + 14.5352LM num: 9
Y1 = -0.8154 * X1 + 0.0053 * X3 + 4.3146 * X7 - 0.1025 * X8 + 11.9531LM num: 10
Y1 = 105.9033 * X1 + 0.0113 * X3 + 59.6616 * X7 + 0.0975 * X8 - 58.7462LM num: 11
Y1 = 81.6537 * X1 + 0.0113 * X3 + 10.8932 * X7 + 0.0559 * X8 - 33.0837LM num: 12
Y1 = 64.6565 * X1 + 0.0113 * X3 + 10.8932 * X7 - 0.0337 * X8 - 18.0037LM num: 13
Y1 = 3.2622 * X1 - 0.0018 * X2 + 0.0164 * X3 + 44.6313 * X7 + 0.0592 * X8 + 11.9461LM num: 14
Y1 = 9.1337 * X1 - 0.0018 * X2 + 0.0164 * X3 - 0.0494 * X6 + 44.6313 * X7 + 0.0592 * X8 + 7.321LM num: 15
Y1 = 11.8776 * X1 - 0.0018 * X2 + 0.0164 * X3 - 0.0428 * X6 + 44.6313 * X7 + 0.0592 * X8 + 7.0198LM num: 16
Y1 = 3.2622 * X1 - 0.0018 * X2 + 0.0164 * X3 + 44.6313 * X7 + 0.0592 * X8 + 14.1593LM num: 17
Y1 = 35.1381 * X1 - 0.0018 * X2 + 0.0164 * X3 + 16.7723 * X7 + 0.0592 * X8 - 10.1661LM num: 18
Y1 = 3.2622 * X1 - 0.0018 * X2 + 0.0164 * X3 + 16.7723 * X7 + 0.0592 * X8 + 16.4949LM num: 19
Y1 = 8.5464 * X1 - 0.0012 * X2 + 0.029 * X3 + 15.2851 * X7 - 0.2151 * X8 + 7.86LM num: 20
Y1 = 8.5464 * X1 - 0.0012 * X2 + 0.029 * X3 + 15.2851 * X7 - 0.0475 * X8 + 7.4789LM num: 21
Y1 = 8.5464 * X1 - 0.0012 * X2 + 0.029 * X3 + 15.2851 * X7 + 0.013 * X8 + 8.5537LM num: 22
Y1 = 1.4309 * X1 - 0.0012 * X2 + 0.1248 * X3 + 9.5464 * X7 + 0.0373 * X8 - 10.9927LM num: 23
Y1 = 5.1744 * X1 - 0.0012 * X2 + 0.0633 * X3 + 9.5464 * X7 + 0.0235 * X8 + 5.7355LM num: 24
Y1 = 5.1744 * X1 - 0.0012 * X2 + 0.0761 * X3 + 9.5464 * X7 - 0.0805 * X8 + 3.4386Number of Rules : 24
这棵树总共有13个叶子,每个叶子对应于一个线性方程。
评估
// 10折交叉验证evaluation = new Evaluation(data); // 重新创建评估对象evaluation.crossValidateModel(m5p, data, 10, new Random(1), new String[]{}); // 执行10折交叉验证System.out.println(evaluation.toSummaryString()); // 输出交叉验证的概要信息
结果如下:
Correlation coefficient 0.996
Mean absolute error 0.6497
Root mean squared error 0.9164
Relative absolute error 7.0972 %
Root relative squared error 9.0753 %
Total Number of Instances 768
完整代码
private static String PATH = ClassUtils.getDefaultClassLoader().getResource("ENB2012_data.csv").getPath();public static void main(String[] args) throws Exception {// 加载数据CSVLoader loader = new CSVLoader();loader.setFieldSeparator(","); // 设置CSV文件的字段分隔符为逗号loader.setSource(new File(PATH)); // 设置数据源为CSV文件Instances data = loader.getDataSet(); // 从CSV文件中加载数据集/** 构建回归模型*/// 设置类别索引为Y1(加热负荷),即目标变量data.setClassIndex(data.numAttributes() - 2); // 设置类别索引为倒数第二个属性,表示Y1// 移除最后一个属性Y2,因为Y2是另一个目标变量,我们只处理Y1Remove remove = new Remove();remove.setOptions(new String[]{"-R", String.valueOf(data.numAttributes())}); // 移除最后一个属性remove.setInputFormat(data); // 设置输入格式data = Filter.useFilter(data, remove); // 应用过滤器,移除最后一个属性// 构建线性回归模型LinearRegression model = new LinearRegression();model.buildClassifier(data); // 使用数据训练线性回归模型System.out.println(model); // 输出线性回归模型的详细信息// 10折交叉验证Evaluation evaluation = new Evaluation(data); // 创建评估对象evaluation.crossValidateModel(model, data, 10, new Random(1), new String[]{}); // 执行10折交叉验证System.out.println(evaluation.toSummaryString()); // 输出交叉验证的概要信息double[] coefficients = model.coefficients(); // 获取线性回归模型的系数// 构建回归树模型(M5P模型)M5P m5p = new M5P();m5p.setOptions(new String[]{""}); // 设置选项,这里为空m5p.buildClassifier(data); // 使用数据训练M5P回归树模型System.out.println(m5p); // 输出M5P回归树模型的详细信息// 10折交叉验证evaluation = new Evaluation(data); // 重新创建评估对象evaluation.crossValidateModel(m5p, data, 10, new Random(1), new String[]{}); // 执行10折交叉验证System.out.println(evaluation.toSummaryString()); // 输出交叉验证的概要信息}
结论
对于线性回归模型:
(1)相关性系数(Correlation coefficient)为0.956,表明模型预测值与实际值之间有较强的相关性。
(2)平均绝对误差(Mean absolute error)为2.0923,表示预测值与实际值之间的平均绝对差距。
(3)均方根误差(Root mean squared error)为2.9569,它衡量了预测值与实际值之间的标准偏差。
(4)相对绝对误差(Relative absolute error)和相对均方根误差(Root relative squared error)分别为22.8555%和29.282%,这些指标是相对于实际值的误差比例。
对于M5模型树:
(1)相关性系数为0.996,比线性回归模型更高,说明M5模型树的预测值与实际值的相关性更强。
(2)平均绝对误差降低到0.6497,表明M5模型树的预测更为准确。
(3)均方根误差也降低到0.9164,说明预测值与实际值的偏差更小。
(4)相对绝对误差和相对均方根误差分别降低到7.0972%和9.0753%,显示M5模型树在相对误差上也有显著改善。