深度学习在MNIST和足球数据集中的应用与调优
1. MNIST数据集的默认深度学习模型
MNIST是一个模式识别问题,旨在判断一组784个像素代表的是0到9中的哪个数字,属于多项式分类问题。
1.1 模型设置与训练
首先,需要运行之前章节的示例代码来设置H2O、加载数据,并定义训练集、验证集、测试集以及输入和输出变量。然后,可以使用以下代码进行默认的深度学习训练:
Python代码
m = h2o.estimators.H2ODeepLearningEstimator(model_id="DL_defaults")
m.train(x, y, train, validation_frame=valid)
R代码
m <- h2o.deeplearning(x, y, train,
model_id = "DL_defaults", validation_frame = valid)
训练过程大约需要三分钟多,会占用机器的所有八个核心。训练时会丢弃67个常量列,因此输入神经元变为717个,而不是原来的784个。
1.2 模型评估
使用
summary(m)
(Python中为
m.summary()
)可以查看每层的详细信息,以及均方误差(MSE)等指标,还有训练集和验证集的交叉验证表。
运行
h2o.performance(m, test)
可以得到测试集的性能指标。训练集的错误率为0.55%,验证集和测试集的错误率分别为3.32%和3.04%;训练集的MSE为0.005,验证集和测试集的MSE分别为0.028和0.027。这表明模型出现了过拟合问题。
1.3 训练和验证结果分析
通过Flow界面的截图(Figure 8 - 5)可以看到,训练数据的性能(蓝线)和验证集的性能(橙线)之间存在差距。这些图表还有以下特点:
- 图表会有波动,不要因为第一次上升就放弃。
- 对于验证线,对数损失(logloss)和MSE有明显差异,而训练线的差异较小。
- 图表末尾的上升或下降是因为
overwrite_with_best_model
参数为
true
,模型根据logloss判断最佳模型,在训练结束时会使用之前的最佳模型。
2. MNIST数据集的调优深度学习模型
2.1 增强数据的效果
使用增强数据(通过
load.mnist_enhanced.R
或
load.mnist_enhanced.py
加载),在默认设置下(10个周期),“原始”MNIST数据的验证集错误分别为417和390,而增强数据的验证集错误为317、313和292,有超过20%的提升,训练集错误的减少更为明显。这说明深度学习更容易对增强数据产生过拟合,但对未见过的数据也有显著的好处。
2.2 增加周期和设置早停
为了控制计算量,增加周期的同时设置早停:
stopping_metric = "misclassification",
stopping_tolerance = 0.01,
stopping_rounds = 3,
epochs = 500,
classification_stop = -1,
这些设置表示,在三个评分周期内错误分类的改善小于1%时停止训练,最多训练500个周期。
classification_stop
默认值为0,意味着模型在完美分类整个训练数据时停止学习,但实际上模型在达到这一状态后仍能提高验证分数,因此将其设置为 -1。
进行两次运行,模型分别在40和46个周期时触发早停。第一次运行在训练集上获得了完美分数,验证集错误分别为268和272,相比10个周期时又有17%的提升。
2.3 隐藏层和神经元数量的选择
考虑到模型需要从像素组中形成概念来判断数字,更多的隐藏层和足够的神经元可以帮助模型学习更多的概念。参考相关文章,最佳模型使用了1024、1024、2048个神经元。增加层间神经元数量而不是减少的一个实际原因是,输入神经元有898个,输出神经元只有10个,较少的权重意味着更快的训练时间。
2.4 超参数调优
为了解决训练数据的过拟合问题,进行了以下超参数的实验:
| 超参数 | 说明 | 实验值 |
| ---- | ---- | ---- |
| l1 | L1正则化,使模型更抗噪声 | 0(无正则化)和1e - 5 |
| input_dropout_ratio | 丢弃部分输入神经元 | 10%和20% |
| hidden_dropout_ratios | 隐藏层神经元的丢弃比例 | 0%、10%和50% |
| max_w2 | 仅用于4层网络 | 默认值(无穷大)和20 |
激活函数选择Rectifier(WithDropout),因为相关文章表明它比Maxout和Tanh更好,且速度更快。
由于不能在网格中同时实验隐藏层神经元的丢弃比例和隐藏层数量,所以网格搜索分三步进行:
1. 比较2个隐藏层的模型:200 x 200(221,600个权重)、512 x 512(727,040个权重)、1024 x 1024(1,978,368个权重)。
2. 尝试1个3层模型和另一个3层模型:400 x 800 x 800(1,327,200个权重)、1024 x 1024 x 2048(4,085,760个权重)。
3. 尝试2个4层模型:200 x 200 x 200 x 200(301,600个权重)、300 x 400 x 500 x 600(895,400个权重)。
最后添加的超参数是
seed
,仅用于区分不同的运行,因为H2O的深度学习实现即使使用相同的种子也不能保证得到相同的模型。
2.5 调优结果分析
调优结果表明,
l1 = 0.00001
比
l1 = 0
要好得多,前13个最佳模型都使用了L1正则化。
max_w2
似乎没有效果,
input_dropout_ratio
为0.1和0.2的差异不大。
hidden_dropout_ratios
比较复杂,最佳的4层模型使用了0.1,0.0的效果较差。
以下是最佳10个模型的验证错误、logloss、构建时间和周期数:
| 隐藏层 | 错误数(每10,000个) | Logloss | 时间 | 周期数 |
| ---- | ---- | ---- | ---- | ---- |
| 300,400,500,600 | 121 | 0.0701 | 796 | 210 |
| 1024,1024 | 124 | 0.0602 | 2079 | 410 |
| 1024,1024,2048 | 126 | 0.0720 | 3382 | 459 |
| 400,800,800 | 127 | 0.0673 | 1266 | 501
|
| 1024,1024 | 134 | 0.0655 | 1660 | 200 |
| 400,800,800 | 137 | 0.0646 | 1419 | 272 |
| 512,512 | 137 | 0.0634 | 943 | 476 |
| 1024,1024 | 150 | 0.0671 | 2249 | 240 |
| 300,400,500,600 | 161 | 0.0699 | 1037 | 501
|
| 300,400,500,600 | 167 | 0.0820 | 1099 | 501* |
虽然没有明确的最佳选择,但4层模型有最好的得分,因此选择4层模型进行最终训练。
2.6 最终模型
最终模型的代码如下:
DLt <- h2o.deeplearning(x, y, train, validation_frame = valid,
model_id = "DL_tuned", seed = seed,
hidden = c(300,400,500,600),
activation = "RectifierWithDropout",
l1 = 0.00001,
input_dropout_ratio = 0.2,
hidden_dropout_ratios = c(0.1, 0.1, 0.1, 0.1),
classification_stop = -1,
stopping_metric = "misclassification",
stopping_tolerance = 0.001,
stopping_rounds = 8,
epochs = 2000
)
该模型在机器上大约需要两小时构建,验证集分数为130,测试集错误为138,是目前表现最好的模型。模型最终使用了642个周期,但返回的是第275个周期的模型。
3. 足球数据集的默认深度学习模型
足球数据集根据近期表现和博彩赔率来预测足球比赛结果,数据存在大量噪声。人类专家在该数据集上的预测准确率仅为0.634,说明数据中的线索并不完整。
3.1 数据准备
如果在自己的机器上运行,需要运行之前章节的示例代码,确保加载的CSV文件中缺失数据已被移除或修补,即
football.train2.csv
、
football.valid2.csv
和
football.test2.csv
。运行这些代码会设置H2O、加载数据,并定义训练集、验证集、测试集、输入变量(包括有赔率和无赔率的情况)和输出变量。
3.2 模型构建与评估
构建两个版本的模型,分别尝试两种预测方式:
- 赛前球队实力估计 + 赛前博彩赔率
- 仅赛前球队实力估计
使用
compareModels()
函数来获取模型的指标,重点关注AUC和准确率。
R代码
m1 <- h2o.deeplearning(x, y, train,
model_id = "DL_defaults_Odds",
validation_frame = valid, seed = seed)
m2 <- h2o.deeplearning(xNoOdds, y, train,
model_id = "DL_defaults_NoOdds",
validation_frame = valid, seed = seed)
以下是AUC和准确率的结果:
| 数据集 | AUC(有赔率) | AUC(无赔率) | 准确率(有赔率) | 准确率(无赔率) |
| ---- | ---- | ---- | ---- | ---- |
| 训练集 | 0.647 | 0.607 | 0.612 | 0.586 |
| 验证集 | 0.672 | 0.630 | 0.648 | 0.617 |
| 测试集 | 0.645 | 0.606 | 0.624 | 0.601 |
结果表明模型性能一般,但没有明显的过拟合问题。验证集和测试集的结果比较接近,可能是因为验证集和测试集的数据更容易预测。
3.3 足球数据集调优思路
接下来将对足球数据集的模型进行调优,主要思路如下:
- 增加训练周期并设置早停机制,以提高模型性能。
- 尝试不同的隐藏层数量和神经元数量,找到最佳的网络拓扑结构。
- 引入dropout和正则化技术,减少过拟合。
3.4 增加训练周期和早停设置
首先尝试增加训练周期并设置早停机制,以提高模型性能。以下是第二个模型(无赔率)的代码:
m2es <- h2o.deeplearning(xNoOdds, y, train,
model_id = "DL_ES_NoOdds",
validation_frame = valid, seed = seed,
replicate_training_data = TRUE,
stopping_metric = "AUC",
stopping_tolerance = 0.01,
stopping_rounds = 3,
epochs = 1000
)
运行结果如下:
| 数据集 | AUC(有赔率) | AUC(无赔率) | 准确率(有赔率) | 准确率(无赔率) |
| ---- | ---- | ---- | ---- | ---- |
| 训练集 | 0.622 | 0.584 | 0.593 | 0.571 |
| 验证集 | 0.632 | 0.605 | 0.637 | 0.611 |
| 测试集 | 0.601 | 0.577 | 0.588 | 0.589 |
可以看到,增加训练周期后结果并不理想。从评分历史图表可以看出,随着模型对训练数据的学习越来越好,对验证数据的表现却越来越差。
3.5 隐藏层和神经元数量的实验
接下来考虑隐藏层的数量和神经元的数量。之前的默认模型使用了两个隐藏层,每个隐藏层有200个神经元。为了回答以下三个问题,尝试了三种不同的拓扑结构:
- 三个隐藏层是否比两个更好?
- 第一个隐藏层是否需要更多的神经元?
- 最后一个隐藏层是否需要更多的神经元?
尝试的拓扑结构分别为200x200x200、400x200和200x400。同时,考虑了dropout参数:
-
input_dropout_ratio
设置为0.3,表示每次丢弃30%的输入。
-
hidden_dropout_ratios
设置为0.5和0.3,表示第一个隐藏层丢弃50%的输出,后续层丢弃30%的输出。
激活函数选择
RectifierWithDropout
,并使用L1和L2正则化(均设置为0.0005),同时设置
balance_classes
和
shuffle_training_data
为
true
。
首先,使用上述参数对默认的两个隐藏层(每个200个神经元)的模型进行训练:
m2_200x200 <- h2o.deeplearning(xNoOdds, "HomeWin", train,
model_id = "DL_200x200",
validation_frame = valid, seed = seed,
replicate_training_data = TRUE,
balance_classes = TRUE,
shuffle_training_data = TRUE,
hidden = c(200,200),
activation = "RectifierWithDropout",
hidden_dropout_ratios = c(0.5, 0.3),
input_dropout_ratio = 0.3,
l1 = 0.0005,
l2 = 0.0005,
stopping_metric = "AUC",
stopping_tolerance = 0.01,
stopping_rounds = 3,
epochs = 1000
)
以下是不同模型的AUC和准确率比较:
| 模型 | AUC(训练集) | AUC(验证集) | 准确率(训练集) | 准确率(验证集) |
| ---- | ---- | ---- | ---- | ---- |
| 默认模型 | 0.607 | 0.630 | 0.586 | 0.617 |
| 增加周期模型 | 0.584 | 0.605 | 0.571 | 0.611 |
| Drop + Reg模型 | 0.594 | 0.630 | 0.568 | 0.619 |
可以看到,使用dropout和正则化后,验证集的结果有所改善。
3.6 不同拓扑结构的实验结果
继续使用不同的拓扑结构进行实验,包括200x200x200、200x400、400x200和400x400,并添加了200x200x200x200的实验。
AUC比较:
| 拓扑结构 | AUC(训练集) | AUC(验证集) |
| ---- | ---- | ---- |
| 200x200 | 0.594 | 0.630 |
| 200x200x200 | 0.597 | 0.631 |
| 200x400 | 0.591 | 0.633 |
| 400x200 | 0.598 | 0.629 |
| 400x400 | 0.595 | 0.630 |
准确率比较:
| 拓扑结构 | 准确率(训练集) | 准确率(验证集) |
| ---- | ---- | ---- |
| 200x200 | 0.568 | 0.619 |
| 200x200x200 | 0.571 | 0.621 |
| 200x400 | 0.563 | 0.618 |
| 400x200 | 0.570 | 0.615 |
| 400x400 | 0.565 | 0.618 |
结果显示,增加第一个隐藏层的神经元数量并没有明显帮助,增加第二个隐藏层的神经元数量也效果不大,但三个隐藏层似乎有轻微的帮助。而尝试四个隐藏层(200x200x200x200)时,结果非常糟糕,说明数据集中的噪声过多,无法训练四层网络。
3.7 最终模型
最终选择200x200x200的拓扑结构,并放宽早停标准,允许模型最多训练2000个周期,只要在四个评分周期内的改善不低于0.1%就继续训练。该模型将在测试数据上进行实验,预测主场获胜情况,并分别尝试有赔率和无赔率的数据。
综上所述,通过对MNIST和足球数据集的深度学习模型进行调优,我们可以看到不同的调优策略对模型性能的影响。在MNIST数据集中,使用增强数据、增加周期、设置早停机制以及合理选择隐藏层和神经元数量等方法可以有效提高模型性能;而在足球数据集中,由于数据噪声较大,需要更加谨慎地选择调优策略,避免过拟合。
4. 总结与展望
4.1 不同数据集调优策略总结
- MNIST数据集 :增强数据对模型性能提升显著,能有效降低验证集和训练集的错误率。增加训练周期并结合早停机制,可在控制计算量的同时提高模型性能。合理选择隐藏层和神经元数量,以及进行超参数调优,如使用L1正则化、dropout等技术,能缓解过拟合问题,提升模型泛化能力。
- 足球数据集 :数据噪声较大,增加训练周期可能导致训练集和验证集结果差异增大,出现过拟合现象。尝试不同的隐藏层和神经元数量时,三个隐藏层有轻微帮助,但四层网络因数据噪声过多而效果不佳。使用dropout和正则化技术能在一定程度上改善验证集结果。
4.2 未来调优方向
- 数据层面 :对于MNIST数据集,可进一步探索数据增强的方法,如更多的图像变换操作,以提供更丰富的训练数据。对于足球数据集,可收集更多相关数据,如球员伤病情况、球队战术安排等,以减少数据中的不确定性。
- 模型层面 :尝试更复杂的模型架构,如卷积神经网络(CNN)在MNIST数据集上可能会有更好的表现。对于足球数据集,可考虑引入循环神经网络(RNN)或长短时记忆网络(LSTM),以处理时间序列数据中的依赖关系。
- 超参数调优 :使用更先进的超参数调优算法,如贝叶斯优化、遗传算法等,以更高效地找到最优超参数组合。
4.3 流程图总结
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A[数据准备]:::process --> B[默认模型训练]:::process
B --> C{是否过拟合?}:::process
C -- 是 --> D[调优策略]:::process
C -- 否 --> E[评估模型]:::process
D --> E
E --> F{性能是否满足要求?}:::process
F -- 是 --> G[最终模型应用]:::process
F -- 否 --> D
这个流程图展示了深度学习模型从数据准备到最终应用的一般流程。首先进行数据准备,然后训练默认模型,判断是否存在过拟合问题。如果存在过拟合,则采取调优策略;如果不存在,则直接评估模型。评估后判断模型性能是否满足要求,若满足则应用最终模型,若不满足则继续调优。
4.4 关键技术点回顾
| 技术点 | MNIST数据集 | 足球数据集 |
|---|---|---|
| 数据增强 | 有效降低错误率,提升模型性能 | 未提及相关操作 |
| 早停机制 | 控制计算量,避免过拟合 | 可尝试但需谨慎,可能导致训练/验证结果差异增大 |
| 隐藏层和神经元数量 | 合理选择可提升模型学习能力 | 三个隐藏层有轻微帮助,四层网络效果差 |
| 正则化和dropout | 缓解过拟合,提升泛化能力 | 能改善验证集结果 |
通过对MNIST和足球数据集的深度学习模型调优实践,我们深入了解了不同数据集的特点以及相应的调优策略。在实际应用中,需要根据具体数据集的特点和问题,灵活选择合适的方法进行模型调优,以达到最佳的性能表现。未来,随着深度学习技术的不断发展,我们可以期待更多先进的方法和技术应用于这些数据集,进一步提升模型的性能和泛化能力。
超级会员免费看
27

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



