Stonksmaster:使用 Python 和 ML 预测股票价格 - 第二部分

2025-06-07

Stonksmaster:使用 Python 和 ML 预测股票价格 - 第二部分

*这是我们之前文章的后续文章。*
在上一篇文章中,我们讨论了机器学习的基础知识及其用于股票价格预测的回归模型。今天,我们来谈谈监督机器学习中使用的集成方法和增强模型。

。

集成方法

集成方法是一种机器学习技术,它将多种机器学习算法组合在一起,以获得单独使用任何一种组成算法都无法获得的更佳预测性能。基础模型的组合方式多种多样,从简单的平均法最大投票法,到更复杂的BoostingStacking等方法,不一而足。

。

为了进行基本的类比,我们可以假设一个议会,议会中坐满了投票支持某项法案或表达意见的议员。议员们充当模型,他们的意见则是模型的结果。因此,法案是否通过取决于议员们及其投票结果。同样,在集成学习中,最终结果也取决于每个基础模型的结果。在二分类问题中,情况可能正是如此。但其他集成方法的基本思想也是一样的。我们希望以上内容能够更清晰地展现这一图景。

。

在过去的几年里,集成学习技术的普及度大幅提升,背后的原因很明显,它们帮助我们从几个基础模型构建出一个真正强大的模型。

集成方法

集成模型的使用方法多种多样,既有简单的方法,例如最大投票法或平均法,也有更复杂的方法,例如 boosting、bagging 或 stacking。

多数表决

多数投票有三种版本,其中集成方法选择类别 -

  • 所有分类器都同意
  • 至少有一半以上的分类器能够预测
  • 获得最高票数的候选人,无论票数总和是否超过 50%

平均

平均法是一种简单的方法,通常用于解决回归问题。在这里,我们简单地取预测值的平均值,以获得更稳健的结果。虽然这种方法看起来很简单,但它几乎总是比单个模型能给出更好的结果,因此可以满足集成学习的目的。

加权平均值

对预测进行平均可以提供很好的结果,但它有一个主要流程,那就是在大多数情况下,一个模型比另一个模型具有更强的预测能力或基于输入问题的表现更好,因此我们希望在最终预测中给予它更多的权重。

装袋

Bagging 是一种流行的集成方法,常用于随机森林等算法中。它不仅通过对模型进行平均来提高准确性,还可以通过创建不相关的模型来提高准确性,而这可以通过为这些模型提供不同的训练集来实现。

提升

Boosting 是一个顺序过程,其中每个后续模型都会尝试纠正前一个模型的错误。由于这个原因,后续模型依赖于之前的模型,因此我们按顺序训练模型,而不是并行训练它们。

梯度提升回归器

在本教程中,我们将重点关注并使用梯度提升回归 (GBR)对上一教程中用于股票预测的数据集进行研究。

术语“梯度”源于gradient boosting该算法使用梯度下降来最小化损失。
了解更多关于梯度下降的内容:

决策树在梯度提升算法中用作弱学习器或基础模型。决策树将数据转换为树形表示。树形表示的每个内部节点表示一个属性,每个叶节点表示一个类标签。

决策树看起来怎么样?像上面的图片吗?当然不是 ;)它看起来像这样 :)
。

。

阅读有关决策树的更多信息。

GBR计算当前预测与已知正确目标值之间的差异,该差异称为残差

之后,梯度提升回归会训练一个弱模型,将特征映射到其残差。弱模型预测的残差被添加到现有模型的输入中,从而推动模型向正确的目标靠拢。反复重复此步骤,可以改进整体模型的预测效果。

。

我们实施 GBR 的一般步骤如下:

  1. 选择弱学习者(基础模型)
  2. 使用加性模型
  3. 定义损失函数
  4. 最小化损失函数

梯度提升的优势

  • 比大多数基础模型(如随机森林)具有更高的准确度和精确度
  • 需要较少的数据预处理
  • 更高的灵活性,能够更好地处理各种类型的输入数据

梯度提升参数

估计器数量
表示为n_estimators
此参数的默认值为 100。
要执行的提升阶段数。梯度提升对过拟合具有相当强的鲁棒性,因此较大的数量通常会带来更好的性能。换句话说,估计器的数量表示森林中树木的数量。树木数量越多,学习数据的效果就越好。另一方面,树木数量越多,训练时间就越长。因此,我们需要找到合适且平衡的值,n_estimators以获得最佳性能。

最大深度
表示为max_depth
默认值为max_depth3,它是一个可选参数。最大深度是梯度提升回归器中决策树估计器的深度。最大深度限制了树中节点的数量。调整此参数以获得最佳性能;最佳值取决于输入变量的相互作用。我们需要找到此参数的最优值以获得最佳性能。

学习率
表示为learning_rate
的默认值为learning_rate0.1,它是一个可选参数。学习率是梯度提升回归算法中的一个超参数,它决定了每次迭代的步长,并朝着损失函数的最小值移动。

Criterion
表示为criterion
默认值为criterionfriedman_mse,它是一个可选参数。该函数用于衡量分割的质量。Criterion 用于衡量决策树分割的质量。mse 代表均方误差。friedman_mse 的默认值通常是最佳的,因为它在某些情况下可以提供更好的近似值。

损失
函数(loss)表示为loss
损失函数的默认值为ls,它是一个可选参数。此参数指示要优化的损失函数。损失函数有很多种,例如ls,代表最小二乘回归。最小绝对偏差(缩写为lad)是另一种损失函数。huber是两者的组合。quantile允许进行分位数回归(使用 alpha 指定分位数)

子样本
表示为subsample
子样本的默认值为 1.0,它是一个可选参数。子样本是用于拟合单个树学习器的样本比例。如果subsample小于 1.0,则会导致方差减小,偏差增加。

迭代次数不变,
用 表示n_iter_no_change。subsample
的默认值为 None,它是一个可选参数。此参数用于决定当验证分数没有随着进一步迭代而提高时,是否使用提前停止来终止训练。如果启用此参数,它将留出validation_fraction训练数据的大小作为验证,并在验证分数没有提高时终止训练。

有关此模型参数的更多信息,请参阅此文档

基本梯度提升的改进

梯度提升是一种贪婪算法,很容易使训练数据集过拟合。因此,我们需要使用各种技术来调整或改进模型。

以下是一些增强基本梯度提升算法性能的方法:

  • 树约束
  • 收缩
  • 随机抽样
  • 惩罚学习

有关 GBR 调整的参考请阅读此处

基本实现

以下是本文前面部分导入的 Iexfinance 数据集上使用的梯度提升回归器的基本实现:

# GBR
from sklearn import ensemble
# Fit regression model
params = {'n_estimators': 500, 'max_depth': 4, 'min_samples_split': 2,
          'learning_rate': 0.01, 'loss': 'ls'}
model = ensemble.GradientBoostingRegressor(**params)
model.fit(x_training_set, y_training_set)

from sklearn.metrics import mean_squared_error, r2_score
model_score = model.score(x_training_set,y_training_set)
# Have a look at R sq to give an idea of the fit ,
# Explained variance score: 1 is perfect prediction
print('R2 sq: ',model_score)
y_predicted = model.predict(x_test_set)

# The mean squared error
print("Mean squared error: %.2f"% mean_squared_error(y_test_set, y_predicted))
# Explained variance score: 1 is perfect prediction
print('Test Variance score: %.2f' % r2_score(y_test_set, y_predicted))
Enter fullscreen mode Exit fullscreen mode

希望您觉得本文对您有所帮助。
欢迎访问我们的网站了解更多信息,并关注我们的平台:

也不要忘记点赞和评论。

在那之前,
请保持安全,愿源头与你同在!

星球大战谁?

***本文由***共同撰写
文章来源:https://dev.to/nitdgplug/stonksmaster-predict-stock-prices-using-python-and-ml-part-ii-5144
PREV
如何在 React Native 中生成调试 apk
NEXT
通过游戏学习 Javascript