机器学习模型调优与集成策略深度剖析
1. 分类集成策略
在处理分类模型时,我们可以利用 H2O 的特性,它不仅能返回预测结果,还能给出每个类别作为正确答案的置信度。例如,在鸢尾花分类问题中:
| predict | Iris - setosa | Iris - versicolor | Iris - virginica |
| ---- | ---- | ---- | ---- |
| Iris - setosa | 0.999016 | 0.0009839 | 1.90283e - 19 |
| Iris - setosa | 0.998988 | 0.0010118 | 1.40209e - 20 |
|… |… |… |… |
| Iris - virginica | 1.5678e - 08 | 0.3198963 | 0.680104 |
| Iris - versicolor | 2.3895e - 08 | 0.9863869 | 0.013613 |
从这些数据可以看出,模型对某些类别(如 Iris - setosa)的预测置信度非常高(99.9%),而对其他类别(如 Iris - virginica)的置信度相对较低(68%)。通常,一个好的模型在其置信度高的预测上大多是正确的,而错误的预测往往置信度较低。
我们可以通过以下代码实现一个集成策略:
predictTeam <- function(models, data){
probabilities <- sapply(models, function(m){
p <- h2o.predict(m, data)
as.matrix(p[,setdiff(colnames(p), "predict")])
}, simplify = "array")
apply(probabilities, 1, function(m) which.max(apply(m, 1, sum)) )
}
这个函数的工作流程如下:
1. 获取每个模型的预测结果。
2. 将这些预测结果的概率提取出来,组成一个三维数组。
3. 遍历这个数组,选择在所有模型中平均置信度最高的答案。
4. 返回它认为最佳类别的索引。
2. 不同数据集上的模型表现
我们对三个数据集使用了 H2O 提供的四种监督式机器学习算法进行了比较,包括随机森林(Random Forest)、梯度提升机(GBM)、广义线性模型(GLM)和深度学习(Deep Learning)。
2.1 建筑能源数据集
这是一个回归问题,均方误差(MSE)是关键指标。该数据集对数据划分方式很敏感,因此在划分数据时使用随机种子很重要,以下是不同模型的表现:
| Model | Time/s | MSE | V.Low | V.High |
| ---- | ---- | ---- | ---- | ---- |
| RF, default | 1.3 | 3.596 | 13 | 14 |
| RF, tuned | 7.3 | 3.802 | 17 | 8 |
| GBM, default | 1.3 | 2.318 | 7 | 7 |
| GBM, tuned | 12.4 | 1.640 | 4 | 2 |
| GLM, default | 1.3 | 9.013 | 27 | 33 |
| GLM, tuned | 1.3 | 8.904 | 26 | 27 |
| DL, default | 3.5 | 7.096 | 34 | 13 |
| DL, tuned | 93.9 | 0.425 | 3 | 0 |
各模型的调优参数如下:
-
随机森林(RF)
:ntrees 从 50 到 200;max_depth 从 20 到 40;sample_rate 从 0.632 到 0.9,mtries 从 2 到 4;col_sample_rate_per_tree 从 1.0 到 0.9,score_tree_interval 设置为 10。随机种子的选择影响很大。
-
梯度提升机(GBM)
:ntrees 从 50 到 1000(有 4 轮零改进的提前停止机制;score_tree_interval 为 5),min_rows 从 10 到 1,sample_rate 从 1 到 0.9,col_sample_rate 从 1 到 0.9,learn_rate 从 0.1 到 0.01,种子为 373。
-
广义线性模型(GLM)
:将族改为 tweedie,tweedie_variance_power 为 1.55,tweedie_link_power 为 0,开启 lambda 搜索,alpha 为 0.33,最大迭代次数为 100。
-
深度学习(DL)
:主要受益于切换到提前停止机制,相当于将轮数从 10 增加到近 200 轮。其他调整包括激活函数为 Tanh,L2 正则化为 0.00001,两个隐藏层各有 162 个节点。
总体而言,深度学习在有足够资源时是明显的赢家,GBM 优于随机森林,随机森林又优于 GLM。只有 GBM 和深度学习在调优后有显著改进。
2.2 MNIST 数据集
这是一个 10 路分类问题,错误率是关键指标。以下是不同模型的表现:
| Model | Time/s | Errors - Test | MSE - Test | Errors - Valid | MSE - Valid |
| ---- | ---- | ---- | ---- | ---- | ---- |
| RFd | 117 | 327 | 0.065 | 372 | 0.069 |
| RFe | 126 | 331 | 0.061 | 347 | 0.064 |
| RFt | 385 | 306 | 0.05 | 317 | 0.052 |
| GBMd | 61 | 445 | 0.048 | 481 | 0.051 |
| GBMe | 75 | 410 | 0.041 | 428 | 0.044 |
| GBMt | 1026 | 233 | 0.019 | 214 | 0.018 |
| GLMd | 55 | 746 | 0.068 | 782 | 0.073 |
| GLMe | 87 | 745 | 0.069 | 796 | 0.074 |
| DLd | 34 | 304 | 0.027 | 332 | 0.028 |
| DLe | 42 | 273 | 0.024 | 292 | 0.026 |
| DLt | 2636 | 138 | 0.012 | 130 | 0.012 |
各模型的调优参数如下:
-
随机森林(RF)
:min_rows 从 1 到 2,mtries 从 28 到 56,sample_rate 从 0.632 到 0.9,col_sample_rate_per_tree 从 1.0 到 0.9,max_depth 从 20 到 40,ntrees 从 50 到 500(有 0.01% 改进的提前停止机制,score_tree_interval 为 3)。
-
梯度提升机(GBM)
:主要受益于将树的数量从 50 增加到约 300(实际给了 400 棵树,有 0.1% 改进的提前停止机制,score_tree_interval 为 10)。其他调整包括 sample_rate 从 1.0 到 0.95,col_sample_rate 从 1.0 到 0.8,col_sample_rate_per_tree 从 1.0 到 0.8,learn_rate 从 0.1 到 0.01。
-
广义线性模型(GLM)
:所有调优尝试都失败,调优后的模型与基础模型相同。
-
深度学习(DL)
:切换到增强数据有 20% 的改进,将轮数从 10 增加到 40 - 50 轮又有 17% 的改进。最佳模型使用 4 层,分别有 300、400、500、600 个神经元,激活函数为 RectifierWithDropout,L1 正则化为 0.00001,输入丢弃率为 0.2,隐藏层丢弃率为 0.1,进行 2000 轮训练并设置提前停止机制。
相对简单的数据工程仅对 GBM 和深度学习有帮助。调优后的深度学习模型是明显的赢家,但也花费了最多的精力。调优后的 GBM 排名第二。
2.3 足球数据集
这是一个二项分类问题,准确率是关键指标。考虑了两种模型:使用博彩赔率专家意见的模型和不使用的模型。同时,使用仅基于“BbAvH”(主队获胜的平均博彩赔率)的 GLM 作为基准,还有一个简单的基准是始终猜测最大类别(在这种情况下是“无胜”,测试数据准确率为 0.573)。
以下是使用所有列的模型表现:
| Model | Time/s | Valid | Test |
| ---- | ---- | ---- | ---- |
| Biggest - class | - | 0.579 | 0.573 |
| Benchmark | 1.4 | 0.650 | 0.634 |
| RFd1 | 19.7 | 0.632 | 0.596 |
| RFt1 | 78.2 | 0.649 | 0.634 |
| GBMd1 | 10.5 | 0.644 | 0.626 |
| GBMt1 | 27.0 | 0.649 | 0.622 |
| GLMd1 | 1.3 | 0.650 | 0.620 |
| DLd1 | 6.6 | 0.649 | 0.606 |
| DLt1 | 46.7 | 0.652 | 0.602 |
不使用博彩赔率的模型表现:
| Model | Time/s | Valid | Test |
| ---- | ---- | ---- | ---- |
| Biggest - class | - | 0.579 | 0.573 |
| RFd2 | 14.5 | 0.602 | 0.581 |
| RFt2 | 54.9 | 0.613 | 0.601 |
| GBMd2 | 7.4 | 0.607 | 0.602 |
| GBMt2 | 33.7 | 0.608 | 0.604 |
| GLMd2 | 1.3 | 0.615 | 0.605 |
| DLd2 | 5.5 | 0.610 | 0.609 |
| DLt2 | 54.3 | 0.620 | 0.594 |
各模型的调优参数如下:
-
随机森林(RF)
:sample_rate 从 0.632 改为 0.35,min_rows 从 1 增加到 60,mtries 从 7 改为 5。树的数量从 50 增加到 500,有 0% 改进(AUC)的提前停止机制。
-
梯度提升机(GBM)
:学习率从 0.1 降低到 0.01,设置平衡类别为真,col_sample_rate 从 1.0 到 0.9,col_sample_rate_per_tree 从 1.0 到 0.9,sample_rate 从 1.0 到 0.8,min_rows 从 10 增加到 40,最大深度为 12。给 400 棵树并设置提前停止机制。
-
广义线性模型(GLM)
:所有调优尝试都未得到比默认模型更好的结果。
-
深度学习(DL)
:所有调优都在无赔率模型上进行,调优后有赔率的版本表现更差,存在过拟合问题。使用三个隐藏层,每层 200 个神经元,设置平衡类别为真,激活函数为 RectifierWithDropout,隐藏层丢弃率为 c(0.5, 0.3, 0.3),输入丢弃率为 0.3,L1 和 L2 正则化为 0.0005,进行 2000 轮训练并设置提前停止机制。
所有模型都比简单猜测最大类别的表现好,但所有模型都令人失望,只有随机森林能达到基于单输入的 GLM 的结果。
3. MNIST 问题的进一步探索
为了进一步降低 MNIST 问题的错误率,我们摆脱了一些人为限制:
- 尝试模型集成。
- 使用 EC2 上的机器集群。
- 对数据进行大量预处理。
3.1 更多训练数据的重要性
更多的训练数据行通常更好,但必须是新数据。理想的训练数据应与测试数据中错误的样本相似,例如更多潦草的手写样本。可以通过以下方式获取:
- 聘请医生或有难以辨认手写习惯的人书写数字,扫描并预处理。
- 使用 R 的 imager 库对现有数据进行处理,如旋转、变形、移动、加粗、侵蚀等操作。
我们准备了九种带有随机元素的效果:
- rotate
- warp(使其更“潦草”)
- shift(向上、下、左、右移动 1 像素)
- bold(加粗)
- dilate(加粗)
- erode(变细)
- erodedilate(两者之一)
- scratches(添加线条)
- blotches(移除斑点)
最终为训练和验证数据各生成了 20 个新版本。在这些生成的数据上训练模型时,会出现训练数据误差高于验证或测试集误差的情况,这通常不是过拟合或有 bug,而是训练数据不具代表性,因为生成的数据平均比原始数据更难。
3.2 利用验证数据
为了获得更多训练数据,我们尝试利用验证数据。但直接使用所有 60,000 个样本进行训练会导致无法判断模型好坏和是否过拟合。因此,我们采取了折衷方案:保留前 1000 个验证样本,将其他 9000 个原始验证样本和 20 个生成文件中的样本加入训练数据,最终训练数据达到 1,239,000 行。
综上所述,通过对不同数据集上多种模型的调优和集成策略的探索,我们可以看到不同模型在不同场景下的表现和潜力。在实际应用中,需要根据具体问题选择合适的模型和调优策略,并不断探索新的数据处理和模型集成方法,以提高模型的性能。
机器学习模型调优与集成策略深度剖析
4. 模型调优与集成的关键要点总结
为了更清晰地呈现不同数据集上各模型的调优要点和表现,我们将其总结如下表:
| 数据集 | 模型 | 关键指标 | 调优参数要点 | 调优后表现 |
| ---- | ---- | ---- | ---- | ---- |
| 建筑能源数据集 | 随机森林(RF) | MSE | ntrees、max_depth、sample_rate 等调整,随机种子影响大 | MSE 有一定变化,但整体提升不显著 |
| | 梯度提升机(GBM) | MSE | ntrees 增加,学习率等参数调整 | MSE 显著降低 |
| | 广义线性模型(GLM) | MSE | 族改为 tweedie 等调整 | MSE 变化不大 |
| | 深度学习(DL) | MSE | 提前停止机制,多层节点和正则化调整 | MSE 大幅降低 |
| MNIST 数据集 | 随机森林(RF) | 错误率 | min_rows、mtries、sample_rate 等调整 | 错误率降低 |
| | 梯度提升机(GBM) | 错误率 | ntrees 增加,学习率等参数调整 | 错误率显著降低 |
| | 广义线性模型(GLM) | 错误率 | 调优失败,与基础模型相同 | 无明显改善 |
| | 深度学习(DL) | 错误率 | 增强数据,增加轮数和多层节点调整 | 错误率大幅降低 |
| 足球数据集 | 随机森林(RF) | 准确率 | sample_rate、min_rows、mtries 等调整 | 准确率有一定提升 |
| | 梯度提升机(GBM) | 准确率 | 学习率降低,平衡类别等调整 | 准确率有一定提升 |
| | 广义线性模型(GLM) | 准确率 | 调优未改善 | 无明显提升 |
| | 深度学习(DL) | 准确率 | 多层节点和正则化调整,存在过拟合 | 部分情况准确率有提升 |
从这个表格中可以直观地看出,不同模型在不同数据集上的调优重点和效果差异很大。深度学习模型在建筑能源和 MNIST 数据集上调优后表现突出,但在足球数据集上存在过拟合问题。GBM 模型在多个数据集上调优后都有较好的表现。
5. 模型集成的流程与优势
模型集成是提高模型性能的重要策略。以分类集成为例,其流程如下:
graph LR
A[获取多个模型] --> B[对数据进行预测]
B --> C[提取概率数组]
C --> D[计算各答案平均置信度]
D --> E[选择置信度最高的答案]
具体实现代码如下:
predictTeam <- function(models, data){
probabilities <- sapply(models, function(m){
p <- h2o.predict(m, data)
as.matrix(p[,setdiff(colnames(p), "predict")])
}, simplify = "array")
apply(probabilities, 1, function(m) which.max(apply(m, 1, sum)) )
}
这个流程的优势在于,它综合了多个模型的预测结果,通过置信度的计算来选择最终答案,能够减少单个模型的误差,提高预测的准确性。在实际应用中,当单个模型的性能有限时,模型集成可以充分发挥多个模型的优势,从而得到更可靠的预测结果。
6. 未来探索方向
虽然我们已经对不同数据集上的多种模型进行了调优和集成探索,但仍有许多可以进一步研究的方向:
-
深度学习的进一步调优
:在建筑能源和 MNIST 数据集上,深度学习模型表现出色,但仍有提升空间。例如,尝试不同的激活函数(如 Rectifier 代替 Tanh)是否能在保证结果的同时提高训练速度。
-
模型集成的优化
:目前的模型集成策略相对简单,可以探索更复杂的集成方法,如加权投票、堆叠等,以进一步提高模型的性能。
-
数据的挖掘与利用
:对于足球数据集,结果令人失望,可能是因为数据挖掘不够深入。可以收集更多相关数据,如天气、教练变动、球员签约和伤病等信息,构建更全面的模型。同时,针对不同的联赛或球队构建特定的模型,可能会取得更好的效果。
-
异常数据处理
:在 MNIST 数据集中,生成的数据导致训练数据误差高于验证或测试集误差,这提示我们需要更好地处理异常数据,使训练数据更具代表性。
通过不断地探索和实践,我们有望在机器学习领域取得更好的成果,为实际问题提供更有效的解决方案。
总之,机器学习模型的调优和集成是一个复杂而又充满挑战的过程。我们需要根据具体问题选择合适的模型和方法,并不断尝试新的思路和技术,以提高模型的性能和可靠性。希望本文的内容能为读者在机器学习的实践中提供一些有价值的参考。
超级会员免费看
1898

被折叠的 条评论
为什么被折叠?



