18、线性模型与深度学习:从足球比赛预测到神经网络探索

线性模型与深度学习:从足球比赛预测到神经网络探索

1. 线性模型在足球比赛预测中的应用

在处理数据时,由于2000年8月之前的数据存在大量列缺失的情况,这些数据被移除。在尝试 COORDINATE_DESCENT_NAIVE 时出现了错误,但其他结果仍具有一定的参考价值。以下是不同求解器和 alpha 值下的均方误差(MSE)、对数损失误差(logloss error)结果:
| 求解器(solver) | alpha | MSE | logloss error |
| — | — | — | — |
| IRLSM | 0 | 0.075 0.292 | 0.0791 |
| COORDINATE_DESCENT | 0 | 0.077 0.297 | 0.0802 |
| L_BFGS | 0 | 0.08 | 0.31 | 0.0839 |
| IRLSM | 0.99 | 0.098 0.343 | 0.0931 |
| COORDINATE_DESCENT | 0.5 | 0.101 0.352 | 0.0941 |
| IRLSM | 0.5 | 0.101 0.352 | 0.0942 |
| COORDINATE_DESCENT | 0.99 | 0.1 | 0.35 | 0.0953 |
| L_BFGS | 0.5 | 0.81 | 2.302 | 0.8899 |
| L_BFGS | 0.99 | 0.81 | 2.302 | 0.8899 |

然而,所有这些结果都不如默认模型(得分0.0782)。这表明在这种情况下,默认的广义线性模型(GLM)参数可能难以被超越。

接下来看足球比赛结果预测,这是一个具有挑战性的数据集。预测基于近期表现和博彩公司赔率形式的专家预测。具体操作步骤如下:
1. 运行相关脚本设置H2O,加载数据,并定义训练集、验证集、测试集、输入变量 x 、不包含赔率的输入变量 xNoOdds 和输出变量 y 。确保使用 football.train2.csv 、 football.valid2.csv 和 football.test2.csv ,因为这些文件中的缺失值已被处理,而GLM对缺失值处理效果不佳。
2. 构建一个简单的线性模型,仅使用博彩公司平均胜赔作为单一输入,其他采用默认设置。该模型可作为评估其他模型的基准。以下是R代码:

mAvH <- h2o.glm("BbAvH", "HomeWin", train,
  model_id = "GLM_defaults_HomeWin_BbAvH",
  validation_frame = valid, family = "binomial")

该模型的AUC和准确率结果如下:
| 数据集 | HomeWin (AUC) | HomeWin (Accuracy) |
| — | — | — |
| 训练集 | 0.618 | 0.589 |
| 验证集 | 0.675 | 0.650 |
| 测试集 | 0.650 | 0.634 |

然后,构建两个感兴趣的模型:一个使用所有字段预测主场获胜( m1 ),另一个不使用博彩公司赔率预测主场获胜( m2 )。

m1 <- h2o.glm(x, "HomeWin", train,
  model_id = "GLM_defaults_HomeWin_Odds",
  validation_frame = valid, family = "binomial")
m2 <- h2o.glm(xNoOdds, "HomeWin", train,
  model_id = "GLM_defaults_HomeWin_NoOdds",
  validation_frame = valid, family = "binomial")

使用 compareModels() 函数查看它们的AUC和准确率:

res <- compareModels(c(m1,m2), test)
round(res[",AUC",], 3)
round(res[",Accuracy",], 3)

结果如下:
| 数据集 | Odds (AUC) | NoOdds (AUC) | Odds (Accuracy) | NoOdds (Accuracy) |
| — | — | — | — | — |
| 训练集 | 0.636 | 0.595 | 0.607 | 0.582 |
| 验证集 | 0.678 | 0.625 | 0.650 | 0.615 |
| 测试集 | 0.645 | 0.612 | 0.622 | 0.605 |

从准确率来看,以0.634为目标(验证集为0.650),使用更多字段反而使模型表现更差。查看 m1 的重要输入变量,前24个变量都是博彩赔率,第25个是 res5a ,这使得结果变差有些奇怪。对于 m2 ,不使用博彩赔率时得分自然更低,但也不算太差。其前五大变量如下:
| 名称(names) | 系数(coefficients) | 符号(sign) |
| — | — | — |
| res20A | 0.199159 | NEG |
| res20H | 0.183050 | POS |
| Div.E0 | 0.098531 | POS |
| HS1 | 0.080411 | POS |
| res5H | 0.062600 | POS |

前两个变量是基于前20场比赛结果的“长期球队实力”估计,客队实力为负影响,主队实力为正影响,这是合理的。第三个变量表明如果比赛是顶级联赛,主场获胜的可能性更大。第四个变量显示主队最近一场比赛的射门次数越多,获胜机会越大。

2. 调整GLM模型

既然使用所有列的结果比仅使用一列更差,那么能否调整GLM以获得更好的结果呢?这里专注于使用所有可用列预测主场获胜的情况。由于有79列,远低于IRLSM求解器的500列指南,因此继续使用该求解器。对于二项式分类,设置 family = "binomial" ,链接函数固定为“logit”。

使用早停策略、开启 lambda 搜索,并尝试三个主要的 alpha 值(0.0用于岭回归,1.0用于套索回归,0.5用于弹性网络)。以下是相关代码:

g <- h2o.grid("glm", grid_id = "GLM_1",
  hyper_params = list(
    alpha = c(0, 0.5, 0.99)
  ),
  x = x, y = "HomeWin", training_frame = train,
  validation_frame = valid,
  family = "binomial",
  lambda_search = TRUE,
  stopping_metric = "AUC",
  stopping_tolerance = 0,
  stopping_rounds = 4,
  max_iterations = 100
)

结果显示,精确到三位小数时,所有 alpha 值的测试集AUC相同(0.645),略低于基准模型。准确率结果也不太理想。最佳 alpha 值为0.0,再次尝试一些较低的 alpha 值(0.05和0.15),0.0仍然是最佳值,模型之间的差异较小。最终结论是没有其他值得调整的参数,最佳模型的表现与默认模型相同,测试集AUC为0.645。

3. 深度学习(神经网络)简介

深度学习是神经网络的新流行名称,它在当前的人工智能和机器学习领域取得了显著进展。深度学习算法在人类容易解决但其他机器学习方法困难的问题上表现出色,如模式识别。然而,它也有缺点,如训练速度慢、是黑盒模型难以解释、处理分类输入有一定困难。如果问题是计算公司年度交易的应纳税额,神经网络不是合适的选择。

H2O的深度学习实现易于使用,能处理大部分细节,只需一行代码就能获得不错的结果。不过,仍有大量参数需要调整,但大部分参数无需过多关注。

4. 神经网络的工作原理

在H2O中,神经网络采用前馈神经网络实现,设计用于在大型数据集的集群上并行运行,目前不支持GPU。其基本原理如下:
- 神经元是一个接受多个数值输入并输出一个数值的函数。这些神经元组织成层,一层中所有神经元的输出成为下一层每个神经元的输入。
- 第一层是数据(训练样本、测试样本或生产中的实际输入),最后一层是输出(答案)。如果是回归问题,输出层有一个神经元;如果是分类问题,输出层的每个可能答案对应一个神经元,每个输出值是该答案的概率,选择概率最高的答案。输入层和输出层之间的层称为隐藏层。
- 每个隐藏层的神经元对其每个输入都有一个权重,修改这些权重是网络学习的方式。每个神经元还有一个“偏置”输入,可视为连接到常量输入的权重,在训练过程中也会被调整。

训练过程是从随机权重开始,输入第一个训练样本和正确答案,计算误差,然后根据误差调整权重以减少误差。处理完所有训练数据称为一个 epoch,可指定算法执行的 epoch 数。与其他深度学习库不同,H2O不使用小批量,权重在每个样本后更新。在多节点集群上运行时,每个节点独立工作一次迭代,迭代结束时将网络权重与其他节点的权重平均。

5. 神经网络中的数字与类别处理

在神经网络中,一切都是数字,当所有预测变量都是数值时,神经网络表现最佳。对于分类输入,每个可能的值会成为一个输入神经元,采用独热编码。例如,对于性别字段(“Male”、“Female”、“Unknown”)和年龄字段(数字),会有四个输入神经元:
- Male?
- Female?
- Gender-unknown?
- Age

对于21岁男性,输入为:
- Male = 1
- Female = 0
- Gender-unknown = 0
- Age = 21

对于未回答性别问题的55岁人,输入为:
- Male = 0
- Female = 0
- Gender-unknown = 1
- Age = 55

H2O会自动处理包含数值、整数和枚举变量的数据集的所有数据操作。

6. 有序因子的处理

如果年龄作为分类输入,例如分为“under 18”、“18 to 24”、“25 to 39”、“40 to 59”、“60+”,这是一个有序因子。是否将其转换为单个数值输入是一个棘手的问题。在这种情况下,建议保留为五个类别,因为难以确定如何转换为数字,且数据的意图可能是作为生活方式的代理。但如果年龄字段由20个干净的五年范围类别组成,则更倾向于将其转换为单个值。

7. 网络层的选择

使用 h2o.deeplearning() 时,主要关注两个方面:训练的 epoch 数和网络的形状(层数和每层的神经元数)。层数和神经元数越多,训练和使用的速度越慢,因此应尽量减少。理论上,一个隐藏层足以表示所有数据,但实际中往往不够,而且大多数人不认为只有一个隐藏层的是深度学习。

选择层数和神经元数的一些提示如下:
- 对于非线性问题,从两层开始尝试。
- 问题的非线性程度越高,需要的层数越多。如果感觉模型无法学习,可以尝试增加一层、增加 epoch 数或增加训练数据。但如果已经有五层,增加第六层可能不会有帮助,且训练时间会大幅增加。
- 一层中的神经元越多,对数据的理解越清晰。如果感觉模型有大致概念但不够精确,可以尝试增加神经元、增加 epoch 数或增加训练数据。
- 输入数据越多,第一个隐藏层可能需要的神经元越多。
- 输出神经元越多,最后一个隐藏层可能需要的神经元越多。
- 层数越多,越可能从丢弃函数中受益。

可以通过查看得分历史图来判断增加 epoch 数是否有帮助。如果线条波动剧烈且总体趋势横向,增加 epoch 数可能无济于事;如果线条变得平坦,增加 epoch 数可能会有小的改进,但收益递减。

训练深度学习模型的时间主要由训练样本数乘以 epoch 数决定。模型中的权重数也会影响训练时间,两层之间的权重数是两层神经元数的乘积,不要忘记计算输入层和输出层。例如,一个100x100的网络,有2个数值输入和1个输出,有(2 * 100) + (100 * 100) + (100 * 1) = 10,300个权重;如果增加一个同样有100个神经元的第三层,权重数变为(2 * 100) + (100 * 100) + (100 * 100) + (100 * 1) = 20,300个,模型可能会更好地理解问题,但可能需要更多时间收敛。

8. 激活函数

在神经网络中,神经元内部的函数即激活函数起着关键作用。它决定了神经元如何将输入信号转换为输出信号,对网络的学习和表达能力有着重要影响。常见的激活函数有以下几种:
- Sigmoid函数 :其公式为 ( f(x)=\frac{1}{1 + e^{-x}} ),该函数将输入值映射到 (0, 1) 区间,具有平滑的曲线,常用于二分类问题的输出层,可将输出解释为概率值。但它存在梯度消失问题,当输入值非常大或非常小时,函数的导数趋近于 0,导致在反向传播过程中梯度更新缓慢。
- ReLU函数 :即修正线性单元,公式为 ( f(x) = max(0, x) )。它计算简单,能有效缓解梯度消失问题,使得网络训练速度更快。在隐藏层中广泛应用,许多深度学习模型都采用 ReLU 作为默认的激活函数。不过,ReLU 存在“死亡 ReLU”问题,当输入值为负数时,神经元的输出为 0,且在后续训练中可能无法恢复。
- Tanh函数 :公式为 ( f(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} ),它将输入值映射到 (-1, 1) 区间,与 Sigmoid 函数类似,但输出范围更广。Tanh 函数的均值更接近 0,在某些情况下能使训练更稳定。

激活函数 公式 优点 缺点
Sigmoid ( f(x)=\frac{1}{1 + e^{-x}} ) 输出在 (0, 1) 区间,可解释为概率 梯度消失问题
ReLU ( f(x) = max(0, x) ) 计算简单,缓解梯度消失 死亡 ReLU 问题
Tanh ( f(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} ) 输出在 (-1, 1) 区间,均值接近 0 存在一定的梯度消失问题
9. 深度学习在数据集中的应用步骤

下面以一个具体的数据集为例,说明使用 H2O 进行深度学习的操作步骤:
1. 数据准备 :确保数据集的格式正确,处理缺失值。如果数据集中包含分类变量,H2O 会自动进行独热编码。
2. 加载数据到 H2O :使用 H2O 的相关函数将数据加载到 H2O 环境中。
3. 划分数据集 :将数据集划分为训练集、验证集和测试集,用于模型的训练、调优和评估。
4. 构建深度学习模型 :使用 h2o.deeplearning() 函数构建模型,设置必要的参数,如 epochs (训练的 epoch 数)、 hidden (隐藏层的神经元数)等。以下是一个示例代码:

library(h2o)
h2o.init()

# 加载数据
data <- h2o.importFile("your_data.csv")

# 划分数据集
splits <- h2o.splitFrame(data, ratios = c(0.7, 0.15), seed = 123)
train <- splits[[1]]
valid <- splits[[2]]
test <- splits[[3]]

# 定义输入和输出变量
x <- setdiff(names(train), "target_column")
y <- "target_column"

# 构建深度学习模型
model <- h2o.deeplearning(
  x = x,
  y = y,
  training_frame = train,
  validation_frame = valid,
  epochs = 10,
  hidden = c(100, 100),
  activation = "ReLU"
)
  1. 模型评估 :使用测试集评估模型的性能,可使用常见的评估指标,如准确率、AUC 等。
# 模型预测
predictions <- h2o.predict(model, test)

# 评估模型
performance <- h2o.performance(model, test)
print(h2o.accuracy(performance))
print(h2o.auc(performance))
10. 深度学习模型的调优策略

为了提高深度学习模型的性能,可采用以下调优策略:
- 调整网络结构 :尝试不同的层数和每层的神经元数,根据问题的复杂度和数据集的大小进行调整。
- 选择合适的激活函数 :根据问题的特点选择合适的激活函数,如对于二分类问题,Sigmoid 函数可能更合适;对于隐藏层,ReLU 函数通常效果较好。
- 调整学习率 :学习率控制着权重更新的步长,过大的学习率可能导致模型无法收敛,过小的学习率会使训练速度变慢。可以尝试不同的学习率,或者使用学习率衰减策略。
- 使用正则化方法 :如 L1 和 L2 正则化,可防止模型过拟合。在 H2O 中,可以通过设置 lambda 参数来实现。
- 增加训练数据 :更多的训练数据可以提高模型的泛化能力,减少过拟合的风险。

11. 总结与对比

线性模型和深度学习模型各有优缺点,适用于不同的场景。线性模型在数据存在线性关系时表现出色,能够以较少的努力获得较好的模型,且在处理大规模数据集时速度较快。例如在足球比赛预测中,线性模型可以通过简单的设置得到一个基准模型。而深度学习模型在处理非线性问题和模式识别方面具有优势,但训练速度慢,是黑盒模型难以解释。

以下是两者的对比表格:
| 模型类型 | 优点 | 缺点 | 适用场景 |
| — | — | — | — |
| 线性模型 | 训练速度快,易于解释,对线性数据效果好 | 不适合非线性数据和复杂模式识别 | 数据存在线性关系的场景 |
| 深度学习模型 | 擅长处理非线性问题和模式识别 | 训练速度慢,难以解释,处理分类输入有困难 | 非线性问题和模式识别场景 |

在实际应用中,应根据问题的特点和数据集的情况选择合适的模型。如果对模型的可解释性要求较高,线性模型可能是更好的选择;如果追求更高的准确率和处理复杂问题的能力,深度学习模型可能更合适。同时,也可以尝试将两种模型结合使用,发挥各自的优势。

相关推荐

深度学习之TF-IDF原理与实战

【代码】深度学习之TF_IDF原理与实战。

yumiwangzi30的博客 180

深度学习之LoRA(低秩适配)原理与实战

【代码】深度学习之LoRA(低秩适配)原理与实战。

yumiwangzi30的博客 247

深度学习之词袋(Bag-of-Words, BoW)原理与实战

【代码】深度学习之词袋(Bag-of-Words, BoW)原理与实战。

yumiwangzi30的博客 208

深度学习之LSTM原理与实战

【代码】深度学习之LSTM原理与实战。

yumiwangzi30的博客 124

【信息科学与工程学】【数据科学】第一百八十八篇 数据处理方法列表02

编号类型领域数据处理方法适用的数据类型缺陷与优势应用场景关联知识和标准和法律法规1001物理世界数据处理线性代数广义逆矩阵(Moore-Penrose伪逆)在超定线性方程组求解中的应用——当物理实验中获得的观测方程个数多于未知数时(例如通过多个传感器测量同一个物理量的不同线性组合),需要寻找最小二乘意义下的最佳解。该方法通过奇异值分解(SVD)计算伪逆,即 A+=VΣ+UT,其中 Σ+ 是将奇异值的倒数取零(小于阈值的奇异值置零)。超定线性方程组 Ax=b,其中 A 为 m×n 矩阵且 m>n,b 为观测向

weixin_49199313的博客 324

【信息科学与工程学】【数据科学】数据科学领域——第三篇 数学08 几何学07 网络几何01

编号类型领域问题问题的数学分析参数列表及参数的数值范围关联知识1组合优化 / 计算几何网络几何(几何图论):给定平面上的 n 个点(节点),求连接所有点的总边长最小的树。数学模型:设点集 P={p1​,…,pn​}⊂R2,边权为欧氏距离 d(pi​,pj​)=(xi​−xj​)2+(yi​−yj​)2​。目标是找到一棵生成树 T=(P,E)使得 ∑(i,j)∈E​d(pi​,pj​)最小。该问题是经典 MST 在欧氏度量下的特例,属于 NP-hard 吗?

weixin_49199313的博客 165

手教你如何使用Simulink和相关工具箱模拟和实现无人机的多机接力信号中继的建模

扩大通信范围:单架无人机的通信能力有限,通过多机接力的方式可以显著扩展通信覆盖范围。提高可靠性:当某架无人机出现故障或电量不足时,其他无人机可以接管其任务,确保通信不中断。适应复杂环境:在山区、森林等复杂地形中,多机接力可以绕过障碍物,建立稳定的通信链路。使用Communications Toolbox中的模块来模拟无线通信链路。例如,可以使用模块模拟噪声信道,或者使用模块计算信号衰减。matlab深色版本。

MHD0815的博客 766

Jetson AGX Orin到手必看:DP线选错黑屏、SSD不识别?这篇避坑指南帮你一次搞定

本文详细介绍了Jetson AGX Orin开发套件的硬件避坑指南,涵盖开箱检查、DP线选择、SSD兼容性等关键问题。通过实测数据和实用技巧,帮助开发者避免黑屏、存储不识别等常见问题,提升开发效率。特别推荐符合VESA认证的DP 1.4a线缆和兼容性优秀的SSD型号,确保设备稳定运行。

weixin_33696822的博客 433

UNext:基于 MLP 的快速医学图像分割网络

有代码,可深入学习轻量级分割模型的论文切入点 UNet 及其最新扩展(如 TransUNet)近年来一直是领先的医学图像分割方法。然而,这些网络无法有效地用于应用中的快速图像分割,因为它们参数繁重、计算复杂且使用缓慢。为此,我们提出了 UNeXt,它是一种基于卷积多层感知器(MLP)的图像分割网络。我们以有效的方式设计了 UNeXt,其中包括早期卷积阶段和潜在阶段的 MLP 阶段。我们提出了一个标记化的 MLP 块,我们可以在其中有效地标记和投影卷积特征,并使用 MLP 来对表示进行建模。

Philo的博客 3941

使用基于python的neurora进行表征相似性分析(RSA)

发现了一款用于表征分析的Python API,还是挺方便的,这里简单介绍一下进行表征相似性分析的使用方法。

zjh12312311的博客 2764

液冷方式介绍

如果将直径在1~100nm的颗粒悬置在传热流体(例如:水、乙烯、乙二醇等)中时,其传热能力会得到提升,因为大多数固体材料的热导率要大于液体,因此由颗粒、流体组成的混合物热导率也高于液体本身的热导率,由此制成的流体,我们称之为纳米流体。金属冷管的液体工质蒸散量几乎为0,而柔软材质的管道则会产生液体的蒸散,在封闭式循环系统中,为了弥补液体工质的蒸散,必须定期在系统中补充液体工质。——我们之前说过,材料的导电和导热的机制大致是类似的,所以导电能力更强的金属往往具有更好的导热能力。

制冷技术咨询与服务的博客 2031

【01】Python解释器的安装

工欲善其事必先利其器。君欲学PYthon,则必先安装Python解释器。安装过程相对简单,大致跟着如下步骤走即可。

侯小啾技术博客 1258

[SystemC]SystemC中的模块和程序

SystemC 中的层次结构是使用类 sc_module 创建的。sc_module 可以直接使用,也可以使用宏 SC_MODULE “隐藏”。上面的示例 SC_MODULE 创建了一个名为 nand2 的 sc_module 类对象。它的输出纯粹是输入值的函数。因此,模型可以使用最简单的 SystemC 进程,即 SC_METHOD。摘要:本节包含一个完整的简单设计,用于演示 SystemC 中模块和流程的使用。同样,重要的是要注意这不是典型的设计风格 - 但它很好而且易于理解。为什么要看模块和流程?

元直的博客 1867

本地通知与健康数据的隐私保护方案

随着移动健康(mHealth)应用的普及,本地通知与健康数据的结合为用户提供了更加个性化的健康管理体验。然而,这种便利性也带来了严峻的隐私保护挑战。本文旨在探讨如何在移动应用中实现本地通知功能的同时,确保用户健康数据的隐私安全。本地通知与健康数据结合的技术架构隐私保护的核心技术方案具体算法实现与数学模型实际应用案例分析本文首先介绍背景知识和核心概念,然后深入探讨隐私保护的技术方案,包括算法原理和数学模型。接着提供实际代码实现和应用场景分析,最后讨论未来发展趋势和挑战。

移动开发前沿的博客 1308

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: 17、汇编与C语言中的BIOS和DOS编程知识详解
下一篇: 43、量子物理中的若干重要理论探析
lambda
博客等级 码龄23年 49粉丝 1303原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值