提交 16dbe77d 编写于 作者: W wizardforcel

2019-04-12 18:40:22

上级 4cfe4cef
+ [如何开发人类活动识别的一维卷积神经网络模型](cnn-models-for-human-activity-recognition-time-series-classification.md)
+ [人类活动识别的深度学习模型](deep-learning-models-for-human-activity-recognition.md)
+ [如何评估人类活动识别的机器学习算法](evaluate-machine-learning-algorithms-for-human-activity-recognition.md)
+ [时间序列预测的多层感知器网络探索性配置](exploratory-configuration-multilayer-perceptron-network-time-series-forecasting.md)
+ [比较经典和机器学习方法进行时间序列预测的结果](findings-comparing-classical-and-machine-learning-methods-for-time-series-forecasting.md)
+ [如何通过深度学习快速获得时间序列预测的结果](get-good-results-fast-deep-learning-time-series-forecasting.md)
+ [如何利用 Python 处理序列预测问题中的缺失时间步长](handle-missing-timesteps-sequence-prediction-problems-python.md)
+ [如何建立预测大气污染日的概率预测模型](how-to-develop-a-probabilistic-forecasting-model-to-predict-air-pollution-days.md)
+ [如何开发一种熟练的机器学习时间序列预测模型](how-to-develop-a-skilful-time-series-forecasting-model.md)
+ [如何构建家庭用电自回归预测模型](how-to-develop-an-autoregression-forecast-model-for-household-electricity-consumption.md)
+ [如何开发多步空气污染时间序列预测的自回归预测模型](how-to-develop-autoregressive-forecasting-models-for-multi-step-air-pollution-time-series-forecasting.md)
+ [如何制定多站点多元空气污染时间序列预测的基线预测](how-to-develop-baseline-forecasts-for-multi-site-multivariate-air-pollution-time-series-forecasting.md)
+ [如何开发时间序列预测的卷积神经网络模型](how-to-develop-convolutional-neural-network-models-for-time-series-forecasting.md)
+ [如何开发卷积神经网络用于多步时间序列预测](how-to-develop-convolutional-neural-networks-for-multi-step-time-series-forecasting.md)
+ [如何开发单变量时间序列预测的深度学习模型](how-to-develop-deep-learning-models-for-univariate-time-series-forecasting.md)
+ [如何开发 LSTM 模型用于家庭用电的多步时间序列预测](how-to-develop-lstm-models-for-multi-step-time-series-forecasting-of-household-power-consumption.md)
+ [如何开发 LSTM 模型进行时间序列预测](how-to-develop-lstm-models-for-time-series-forecasting.md)
+ [如何开发多元多步空气污染时间序列预测的机器学习模型](how-to-develop-machine-learning-models-for-multivariate-multi-step-air-pollution-time-series-forecasting.md)
+ [如何开发多层感知器模型进行时间序列预测](how-to-develop-multilayer-perceptron-models-for-time-series-forecasting.md)
+ [如何开发人类活动识别时间序列分类的 RNN 模型](how-to-develop-rnn-models-for-human-activity-recognition-time-series-classification.md)
+ [如何开始深度学习的时间序列预测(7 天迷你课程)](how-to-get-started-with-deep-learning-for-time-series-forecasting-7-day-mini-course.md)
+ [如何网格搜索深度学习模型进行时间序列预测](how-to-grid-search-deep-learning-models-for-time-series-forecasting.md)
+ [如何对单变量时间序列预测的网格搜索朴素方法](how-to-grid-search-naive-methods-for-univariate-time-series-forecasting.md)
+ [如何在 Python 中搜索 SARIMA 模型超参数用于时间序列预测](how-to-grid-search-sarima-model-hyperparameters-for-time-series-forecasting-in-python.md)
+ [如何在 Python 中进行时间序列预测的网格搜索三次指数平滑](how-to-grid-search-triple-exponential-smoothing-for-time-series-forecasting-in-python.md)
+ [一个标准的人类活动识别问题的温和介绍](how-to-load-and-explore-a-standard-human-activity-recognition-problem.md)
+ [如何加载和探索家庭用电数据](how-to-load-and-explore-household-electricity-usage-data.md)
+ [如何加载,可视化和探索复杂的多变量多步时间序列预测数据集](how-to-load-visualize-and-explore-a-complex-multivariate-multistep-time-series-forecasting-dataset.md)
+ [如何从智能手机数据模拟人类活动](how-to-model-human-activity-from-smartphone-data.md)
+ [如何根据环境因素预测房间占用率](how-to-predict-room-occupancy-based-on-environmental-factors.md)
+ [如何使用脑波预测人眼是开放还是闭合](how-to-predict-whether-eyes-are-open-or-closed-using-brain-waves.md)
+ [如何在 Python 中扩展长短期内存网络的数据](how-to-scale-data-for-long-short-term-memory-networks-in-python.md)
+ [如何使用 TimeseriesGenerator 进行 Keras 中的时间序列预测](how-to-use-the-timeseriesgenerator-for-time-series-forecasting-in-keras.md)
+ [基于机器学习算法的室内运动时间序列分类](indoor-movement-time-series-classification-with-machine-learning-algorithms.md)
+ [用于时间序列预测的状态 LSTM 在线学习的不稳定性](instability-online-learning-stateful-lstm-time-series-forecasting.md)
+ [用于罕见事件时间序列预测的 LSTM 模型体系结构](lstm-model-architecture-for-rare-event-time-series-forecasting.md)
+ [用于时间序列预测的 4 种通用机器学习数据变换](machine-learning-data-transforms-for-time-series-forecasting.md)
+ [Python 中长短期记忆网络的多步时间序列预测](multi-step-time-series-forecasting-long-short-term-memory-networks-python.md)
+ [家庭用电机器学习的多步时间序列预测](multi-step-time-series-forecasting-with-machine-learning-models-for-household-electricity-consumption.md)
+ [Keras 中 LSTM 的多变量时间序列预测](multivariate-time-series-forecasting-lstms-keras.md)
+ [如何开发和评估朴素的家庭用电量预测方法](naive-methods-for-forecasting-household-electricity-consumption.md)
+ [如何为长短期记忆网络准备单变量时间序列数据](prepare-univariate-time-series-data-long-short-term-memory-networks.md)
+ [循环神经网络在时间序列预测中的应用](promise-recurrent-neural-networks-time-series-forecasting.md)
+ [如何在 Python 中使用差异变换删除趋势和季节性](remove-trends-seasonality-difference-transform-python.md)
+ [如何在 LSTM 中种子状态用于 Python 中的时间序列预测](seed-state-lstms-time-series-forecasting-python.md)
+ [使用 Python 进行时间序列预测的有状态和无状态 LSTM](stateful-stateless-lstm-time-series-forecasting-python.md)
+ [长短时记忆网络在时间序列预测中的适用性](suitability-long-short-term-memory-networks-time-series-forecasting.md)
+ [时间序列预测问题的分类](taxonomy-of-time-series-forecasting-problems.md)
+ [Python 中长短期记忆网络的时间序列预测](time-series-forecasting-long-short-term-memory-network-python.md)
+ [基于 Keras 的 Python 中 LSTM 循环神经网络的时间序列预测](time-series-prediction-lstm-recurrent-neural-networks-python-keras.md)
+ [Keras 中深度学习的时间序列预测](time-series-prediction-with-deep-learning-in-python-with-keras.md)
+ [如何用 Keras 调整 LSTM 超参数进行时间序列预测](tune-lstm-hyperparameters-keras-time-series-forecasting.md)
+ [如何在时间序列预测训练期间更新 LSTM 网络](update-lstm-networks-training-time-series-forecasting.md)
+ [如何使用 LSTM 网络的 Dropout 进行时间序列预测](use-dropout-lstm-networks-time-series-forecasting.md)
+ [如何使用 LSTM 网络中的特征进行时间序列预测](use-features-lstm-networks-time-series-forecasting.md)
+ [如何在 LSTM 网络中使用时间序列进行时间序列预测](use-timesteps-lstm-networks-time-series-forecasting.md)
+ [如何利用 LSTM 网络进行权重正则化进行时间序列预测](use-weight-regularization-lstm-networks-time-series-forecasting.md)
\ No newline at end of file
# 比较经典和机器学习方法进行时间序列预测的结果
> 原文: [https://machinelearningmastery.com/findings-comparing-classical-and-machine-learning-methods-for-time-series-forecasting/](https://machinelearningmastery.com/findings-comparing-classical-and-machine-learning-methods-for-time-series-forecasting/)
通常报告机器学习和深度学习方法是所有预测建模问题的关键解决方案。
最近一项重要的研究评估并比较了许多经典和现代机器学习和深度学习方法在 1000 多个单变量时间序列预测问题的大量不同组合中的表现。
这项研究的结果表明,简单的经典方法,如线性方法和指数平滑,优于复杂和复杂的方法,如决策树,多层感知器(MLP)和长期短期记忆(LSTM)网络模型。
这些发现突出了评估经典方法并将其结果用作评估任何机器学习和时间序列预测的深度学习方法的基线的要求,以证明其增加的复杂性增加了预测技能。
在这篇文章中,您将发现这项最新研究的重要发现,评估和比较经典和现代机器学习方法在大量不同时间序列预测数据集上的表现。
阅读这篇文章后,你会知道:
* 像 ETS 和 ARIMA 这样的经典方法胜过机器学习和深度学习方法,可以对单变量数据集进行一步预测。
* 像 Theta 和 ARIMA 这样的经典方法胜过机器学习和深度学习方法,可以对单变量数据集进行多步预测。
* 机器学习和深度学习方法还没有兑现他们对单变量时间序列预测的承诺,还有很多工作要做。
让我们开始吧。
![Findings Comparing Classical and Machine Learning Methods for Time Series Forecasting](img/3e0a3895f026fa2bc5f0f9f4d5dacf9a.jpg)
研究结果比较时间序列预测的经典和机器学习方法
[Lyndon Hatherall](https://www.flickr.com/photos/m8ee/8492207975/) 的照片,保留一些权利。
## 概观
[Spyros Makridakis](https://en.wikipedia.org/wiki/Spyros_Makridakis) ,等。发表于 2018 年的一项研究题为“[统计和机器学习预测方法:关注和前进方向](http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0194889)。”
在这篇文章中,我们将仔细研究 Makridakis 等人的研究。仔细评估和比较经典时间序列预测方法与现代机器学习方法的表现。
这篇文章分为七个部分;他们是:
1. 学习动机
2. 时间序列数据集
3. 时间序列预测方法
4. 数据准备
5. 一步预测结果
6. 多步预测结果
7. 成果
## 学习动机
该研究的目的是清楚地展示一套不同的机器学习方法的能力,与传统的时间序列预测方法相比,它可以收集大量不同的单变量时间序列预测问题。
该研究是对越来越多的论文的回应,并声称机器学习和深度学习方法为时间序列预测提供了优异的结果,几乎没有客观证据。
> 数以百计的论文提出了新的 ML 算法,提出了方法上的进步和准确性的改进。然而,关于它们作为标准预测工具的相对表现,可获得有限的客观证据。
- [统计和机器学习预测方法:关注点和前进方向](http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0194889),2018。
作者清楚地提出了大量索赔的三个问题;他们是:
* 他们的结论基于一些甚至一个时间序列,提出了关于结果的统计显着性及其概括性的问题。
* 对这些方法进行短期预测视野评估,通常是一步到位,不考虑中期和长期预测。
* 没有使用基准来比较 ML 方法与其他方法的准确性。
作为回应,该研究包括八种经典方法和 10 种机器学习方法,使用一个步骤和多步骤预测,在 1,045 个月度时间序列的集合中进行评估。
虽然不是确定的,但结果旨在客观和稳健。
## 时间序列数据集
研究中使用的时间序列数据集来自 M3 竞赛中使用的时间序列数据集。
M3 竞赛是一系列竞赛中的第三项,旨在准确发现在实时系列预测问题中哪些算法在实践中表现良好。比赛结果发表在 2000 年题为“ [M3 竞赛:结果,结论和影响](https://www.sciencedirect.com/science/article/pii/S0169207000000571)”的论文中。
比赛中使用的数据集来自各行各业,并且具有从小时到年度的各种不同时间间隔。
> M3-Competition 的 3003 系列是在配额基础上选择的,包括各种类型的时间序列数据(微观,行业,宏观等)和连续观测之间的不同时间间隔(年度,季度等)。
下表摘自论文,提供了竞赛中使用的 3,003 个数据集的摘要。
![Table of Datasets, Industry and Time Interval Used in the M3-Competition](img/64e666aef1f30c62616410d8e1e2a5cc.jpg)
M3 竞赛中使用的数据集,行业和时间间隔表
取自“M3 竞赛:结果,结论和影响”。
竞争的结果是更简单的时间序列预测方法优于更复杂的方法,包括神经网络模型。
> 这项研究,前两次 M-Competitions 和许多其他实证研究已经证明,除了最简单的疑问之外,精心设计的理论结构或更复杂的方法并不一定能提高样本后预测的准确性,而不是简单的方法,尽管它们可以更好地适应统计模型到可用的历史数据。
- [M3-竞争:结果,结论和影响](https://www.sciencedirect.com/science/article/pii/S0169207000000571),2000。
我们在本文中回顾的最近一项评估机器学习方法的研究选择了 1,045 个时间序列的子集,每月间隔与 M3 竞赛中使用的间隔相比。
> ...使用 M3 竞赛中使用的 1045 个月度时间序列的大部分,在多个预测视野中评估此类表现。
- [统计和机器学习预测方法:关注点和前进方向](http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0194889),2018。
## 时间序列预测方法
该研究评估了八种经典(或简单)方法和 10 种机器学习方法的表现。
> ......八种传统统计方法和八种流行的 ML 方法,以及近两年来最受欢迎的两种方法。
- [统计和机器学习预测方法:关注点和前进方向](http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0194889),2018。
评估的八种经典方法如下:
* 朴素 2,实际上是一个随季节调整的随机游走模型。
* 简单的指数平滑。
* 霍尔特。
* 阻尼指数平滑。
* SES,Holt 和 Damped 的平均值。
* Theta 方法。
* ARIMA,自动。
* ETS,自动。
共有八种机器学习方法用于重现和比较 2010 年论文“[时间序列预测的机器学习模型的经验比较](https://www.tandfonline.com/doi/abs/10.1080/07474938.2010.481556)”中提供的结果。
他们是:
* 多层感知器(MLP)
* 贝叶斯神经网络(BNN)
* 径向基函数(RBF)
* 广义循环神经网络(GRNN),也称为核回归
* K-最近邻回归(KNN)
* CART 回归树(CART)
* 支持向量回归(SVR)
* 高斯过程(GP)
另外两个'_ 现代 _'神经网络算法也被添加到列表中,因为它们的采用率最近有所上升;他们是:
* 循环神经网络(RNN)
* 长短期记忆(LSTM)
## 数据准备
再次,基于 2010 年论文“[时间序列预测的机器学习模型的经验比较](https://www.tandfonline.com/doi/abs/10.1080/07474938.2010.481556)”中描述的方法,使用了谨慎的数据准备方法。
在那篇论文中,每个时间序列都是使用幂变换进行调整,去季节化和去趋势化。
> [...]在计算 18 个预测之前,他们对系列进行了预处理,以实现平均值和方差的平稳性。这是使用对数转换,然后去季节化和最终缩放来完成的,同时还考虑了去除趋势分量的第一个差异。
- [统计和机器学习预测方法:关注点和前进方向](http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0194889),2018。
受这些操作的启发,对一步预测的 MLP 应用了五种不同数据转换的变体,并对它们的结果进行了比较。五个转变是:
* 原始数据。
* Box-Cox 功率变换。
* 延长数据的时间。
* 去除数据。
* 所有三个变换(权力,去季节化,趋势)。
一般来说,人们发现最好的方法是应用功率变换并对数据进行去季节化,并且可能也会对系列产生不利影响。
> 根据 sMAPE 的最佳组合是 7 号(Box-Cox 转换,deseasonalization),而根据 MASE 的最佳组合是 10 号(Box-Cox 转换,deseasonalization 和 detrending)
- [统计和机器学习预测方法:关注点和前进方向](http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0194889),2018。
## 一步预测结果
所有模型均使用一步时间序列预测进行评估。
具体而言,最后 18 个时间步骤用作测试集,并且模型适合于所有剩余的观察。对测试集中的 18 个观测值中的每个观测值进行单独的一步预测,可能使用前向验证方法,其中使用真实观测值作为输入以进行每个预测。
> 预测模型是使用前 n - 18 个观测值开发的,其中 n 是序列的长度。然后,生成了 18 个预测,并且与开发预测模型时未使用的实际值进行了评估。
- [统计和机器学习预测方法:关注点和前进方向](http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0194889),2018。
回顾结果,发现 MLP 和 BNN 从所有机器学习方法中获得最佳表现。
> 结果表明,MLP 和 BNN 的表现优于其余的 ML 方法。
- [统计和机器学习预测方法:关注点和前进方向](http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0194889),2018。
令人惊讶的结果是发现 RNN 和 LSTM 表现不佳。
> 应该指出的是,RNN 是不太准确的 ML 方法之一,这表明研究进展并不一定能保证预测表现的提高。这个结论也适用于 LSTM 的表现,LSTM 是另一种流行且更先进的 ML 方法,它也不能提高预测精度。
- [统计和机器学习预测方法:关注点和前进方向](http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0194889),2018。
比较所有方法的表现,发现机器学习方法都是通过简单的经典方法进行的,其中 ETS 和 ARIMA 模型的整体表现最佳。
这一发现证实了之前类似研究和竞赛的结果。
![Bar Chart Comparing Model Performance (sMAPE) for One-Step Forecasts](img/3618a63641ec8ba329ce9ed44aa54d58.jpg)
条形图比较模型表现(sMAPE)的一步预测
取自“统计和机器学习预测方法:关注和前进方向”。
## 多步预测结果
多步骤预测涉及在最后一次已知观察之前预测多个步骤。
针对机器学习方法评估了[多步预测](https://machinelearningmastery.com/multi-step-time-series-forecasting/)的三种方法;他们是:
* 迭代预测
* 直接预测
* 多神经网络预测
发现经典方法再次优于机器学习方法。
在这种情况下,发现诸如 Theta,ARIMA 和指数平滑(梳状)的组合的方法实现了最佳表现。
> 简而言之,统计模型在所有预测视野中似乎总体上优于 ML 方法,根据所检查的误差指标,Theta,Comb 和 ARIMA 在竞争者中占主导地位。
- [统计和机器学习预测方法:关注点和前进方向](http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0194889),2018。
## 成果
该研究提供了重要的支持证据,即经典方法可能主导单变量时间序列预测,至少在评估的预测问题类型上如此。
该研究表明,对于单步和多步预测的单变量时间序列预测,机器学习和深度学习方法的表现更差,计算成本增加。
这些发现强烈鼓励使用经典方法,如 ETS,ARIMA 等,作为探索更精细方法之前的第一步,并要求将这些简单方法的结果用作表现的基线,以便更精细的方法必须清楚,以证明其使用的合理性。
它还强调了不仅要考虑仔细使用数据准备方法,而且需要主动测试针对给定问题的多种不同数据准备方案组合,以便发现哪种方法最有效,即使在经典方法的情况下也是如此。
机器学习和深度学习方法仍然可以在特定的单变量时间序列问题上获得更好的表现,并且应该进行评估。
该研究没有考虑更复杂的时间序列问题,例如那些数据集:
* 复杂的不规则时间结构
* 缺少观察
* 噪音很大。
* 多个变量之间复杂的相互关系。
该研究总结了一个诚实的困惑,为什么机器学习方法在实践中表现如此糟糕,因为它们在其他人工智能领域表现出色。
> 最有趣的问题和最大的挑战是找出其表现不佳的原因,目的是提高准确性并发挥其巨大潜力。人工智能学习算法已经彻底改变了各种领域的广泛应用,并且没有理由用 ML 方法在预测中无法实现同样的目标。因此,我们必须找到如何应用以提高他们更准确的预测能力。
- [统计和机器学习预测方法:关注点和前进方向](http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0194889),2018。
作者对 LSTM 和 RNN 进行了评论,这些评论通常被认为是一般的序列预测问题的深度学习方法,在这种情况下,它们在实践中表现明显不佳。
> [...]人们会期望更高级的 NN 类型的 RNN 和 LSTM 比 ARIMA 和其他统计方法更准确。
- [统计和机器学习预测方法:关注点和前进方向](http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0194889),2018。
他们评论说 LSTM 似乎更适合拟合或过度拟合训练数据集而不是预测它。
> 另一个有趣的例子可能是 LSTM 的情况与较简单的 NN(如 RNN 和 MLP)相比,报告更好的模型拟合但更差的预测准确性
- [统计和机器学习预测方法:关注点和前进方向](http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0194889),2018。
有工作要做,机器学习方法和深度学习方法比传统的统计方法更有学习时间序列数据的承诺,甚至通过自动特征学习直接对原始观察这样做。
> 鉴于他们的学习能力,ML 方法应该比简单的基准测试更好,比如指数平滑。接受问题是设计可行解决方案的第一步,我们希望 AI 和 ML 领域的人员能够接受实证研究结果并努力提高其方法的预测准确性。
- [统计和机器学习预测方法:关注点和前进方向](http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0194889),2018。
## 进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
* [Makridakis 比赛,维基百科](https://en.wikipedia.org/wiki/Makridakis_Competitions)
* [M3-竞争:结果,结论和影响](https://www.sciencedirect.com/science/article/pii/S0169207000000571),2000。
* [M4 竞赛:结果,发现,结论和前进方向](https://www.sciencedirect.com/science/article/pii/S0169207018300785),2018。
* [统计和机器学习预测方法:关注点和前进方向](http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0194889),2018。
* [时间序列预测机器学习模型的实证比较](https://www.tandfonline.com/doi/abs/10.1080/07474938.2010.481556),2010。
## 摘要
在这篇文章中,您发现了最近一项研究的重要发现,该研究评估和比较了经典和现代机器学习方法在大量不同时间序列预测数据集上的表现。
具体来说,你学到了:
* 像 ETS 和 ARIMA 这样的经典方法胜过机器学习和深度学习方法,可以对单变量数据集进行一步预测。
* 像 Theta 和 ARIMA 这样的经典方法胜过机器学习和深度学习方法,可以对单变量数据集进行多步预测。
* 机器学习和深度学习方法尚未兑现其对单变量时间序列预测的承诺,还有很多工作要做。
你有任何问题吗?
在下面的评论中提出您的问题,我会尽力回答。
\ No newline at end of file
# 如何通过深度学习快速获得时间序列预测的结果
> 原文: [https://machinelearningmastery.com/get-good-results-fast-deep-learning-time-series-forecasting/](https://machinelearningmastery.com/get-good-results-fast-deep-learning-time-series-forecasting/)
#### 3
您的预测建模问题设计实验和管理复杂性的策略。
新的时间序列预测项目很难开始。
鉴于多年的数据,适合深度学习模型可能需要数天或数周。你是如何开始的?
对于一些从业者来说,这可能会导致项目一开始就瘫痪甚至拖延。在其他情况下,它可能导致陷入只尝试和使用以前工作的陷阱,而不是真正探索问题。
在这篇文章中,您将发现在将多层神经网络和长短期记忆(LSTM)循环神经网络模型等深度学习方法应用于时间序列预测问题时可以使用的实用策略。
这篇文章中的策略并非万无一失,但是我在处理大型时间序列数据集时发现了很难学到的经验法则。
阅读这篇文章后,你会知道:
* 一种平衡思想探索和利用对你的问题起作用的策略。
* 一种快速学习和利用数据扩展思路的策略,以确认它们能够解决更广泛的问题。
* 一种策略,可以解决问题框架的复杂性以及所选深度学习模型的复杂性。
让我们开始吧。
## 1.勘探和开发战略
在搜索能够很好地解决问题的模型时,平衡探索和利用非常重要。
我建议两种不同的方法应该串联使用:
* 诊断。
* 网格搜索。
### 诊断
诊断涉及使用一组超参数执行运行,并在每个训练时期的训练和测试数据集上生成模型技能的痕迹。
这些图提供了对过度学习或学习不足以及特定超参数集的潜力的深入了解。
它们是健全性检查或种子,用于深入研究可以探索的参数范围,并防止您浪费时间,使其具有比合理要求更多的时代,或者太大的网络。
以下是来自模型运行的诊断图的示例,其显示了训练和验证 RMSE。
![Example Diagnostic Line Plot Comparing Train and Test Loss Over Training Epochs](img/c8ef908f2c8e1207087d46f000c468d7.jpg)
示例诊断线图比较训练时期的训练和测试损失
### 网格搜索
基于对诊断结果的学习,网格搜索提供了针对特定模型超参数的一组值的扫描,例如神经元的数量,批量大小等。
它们允许您以分段方式系统地拨入特定的超参数值。
### 交织方法
我建议交错诊断运行和网格搜索运行。
您可以通过诊断检查您的假设,并通过网格搜索结果从有前途的想法中获得最佳效果。
我强烈建议你测试一下你对模型的每一个假设。这包括简单的事情,如数据缩放,权重初始化,甚至激活函数,损失函数等的选择。
与下面的数据处理策略一起使用,您将快速构建一个有关预测问题的有效和无效的映射。
下面是模型批量大小的网格搜索结果示例,显示每个实验重复 30 次的结果分布。
![Example Box and Whisker Plots Comparing a Model Skill For Different Model Parameter Values](img/cfc3b57cc10dc8b0937a34613f5d5f17.jpg)
示例框和晶须图比较不同模型参数值的模型技巧
## 2.处理数据大小的策略
我建议首先使用较小的数据样本来测试想法并慢慢增加数据量,以查看在小样本上学到的东西是否包含更大的样本。
例如,如果您有多年的每小时测量,则可以按如下方式拆分数据:
* 1 周样本。
* 1 个月的样本。
* 1 年样本。
* 所有数据。
另一种方法是,您可以在整个数据集中拟合和探索模型,其中每个模型可能需要数天才能适应,这反过来意味着您的学习速度会大幅降低。
这种方法的好处是,您可以在几分钟内快速测试多次重复(例如统计上显着)的想法,然后将这些有前途的想法扩展到越来越多的数据。
一般来说,有了良好框架的监督学习问题,学习的确会随着数据而扩展。然而,存在这样的风险:在不同的数据规模上问题存在很大差异,并且结果不成立。您可以使用更简单的模型来检查这一点,这些模型可以更快地进行训练,并在早期就弄清楚这是否是一个问题。
最后,当您将模型扩展到更多数据时,您还可以减少实验的重复次数,以帮助加快结果的周转时间。
## 3.模型复杂性策略
与数据大小一样,模型的复杂性是另一个必须管理并可以扩展的问题。
我们可以从监督学习问题的框架和模型本身来看待这一点。
### 模型框架复杂性
例如,我们可以假设包括外生变量的时间序列预测问题(例如,多输入序列或多变量输入)。
我们可以扩展问题的复杂性,看看在一个复杂程度(例如,单变量输入)中工作的是复杂的复杂程度(多变量输入)。
例如,您可以通过以下方式处理模型复杂性:
* 单变量输入,单步输出。
* 单变量输入,多步输出。
* 多变量输入,单步输出。
* 多变量输入,多步输出。
这也可以扩展到多变量预测。
在每个步骤中,目标是证明增加复杂性可以提升模型的技能。
例如:
* 神经网络模型能否胜过持久性预测模型?
* 神经网络模型能否胜过线性预测模型?
* 外生输入变量可以通过单变量输入提升模型的技能吗?
* 直接多步骤预测能否比递归单步预测更具技巧性?
如果这些问题无法克服或轻易克服,它可以帮助您快速解决问题框架和所选模型。
### 模型能力的复杂性
当使用更复杂的神经网络模型(如 LSTM)时,可以使用相同的方法。
例如:
* 将问题建模为输入到输出的映射(例如,没有内部状态或 BPTT)。
* 将问题建模为仅在输入序列中具有内部状态的映射问题(无 BPTT)。
* 将问题建模为具有内部状态和 BPTT 的映射问题。
在每个步骤中,增加的模型复杂性必须证明技能处于或高于先前的复杂程度。换句话说,增加的模型复杂性必须通过模型技能或能力的相应增加来证明。
例如:
* LSTM 能否胜过带窗口的 MLP?
* 具有内部状态且没有 BPTT 的 LSTM 能否优于 LSTM,其中状态在每个样本后重置?
* BPTT 超过输入序列的 LSTM 能否优于每个时间步后更新的 LSTM 吗?
### 进一步阅读
如果您要深入了解,本节将提供有关该主题的更多资源。
* [如何通过时间序列预测项目](http://machinelearningmastery.com/work-time-series-forecast-project/)
* [如何用 Keras 调整 LSTM 超参数进行时间序列预测](http://machinelearningmastery.com/tune-lstm-hyperparameters-keras-time-series-forecasting/)
* [如何提高深度学习效能](http://machinelearningmastery.com/improve-deep-learning-performance/)
## 摘要
在本教程中,您了解了如何克服在深度学习项目开始时可能出现的瘫痪。
具体来说,您了解了如何系统地分解可用于快速获得结果的复杂性和策略:
* 一种平衡思想探索和利用对你的问题起作用的策略。
* 一种快速学习和利用数据扩展思路的策略,以确认它们能够解决更广泛的问题。
* 一种策略,可以解决问题框架的复杂性以及所选深度学习模型的复杂性。
你有任何问题吗?
在下面的评论中提出您的问题,我会尽力回答。
\ No newline at end of file
# 如何利用 Python 处理序列预测问题中的缺失时间步长
> 原文: [https://machinelearningmastery.com/handle-missing-timesteps-sequence-prediction-problems-python/](https://machinelearningmastery.com/handle-missing-timesteps-sequence-prediction-problems-python/)
通常缺少来自序列数据的观察结果。
数据可能已损坏或不可用,但根据定义,您的数据也可能具有可变长度序列。具有较少时间步长的那些序列可被认为具有缺失值。
在本教程中,您将了解如何使用 Keras 深度学习库处理 Python 中序列预测问题缺失值的数据。
完成本教程后,您将了解:
* 如何删除包含缺少时间步长的行。
* 如何标记丢失的时间步骤并强制网络了解其含义。
* 如何屏蔽缺失的时间步长并将其从模型中的计算中排除。
让我们开始吧。
![A Gentle Introduction to Linear Algebra](img/a3d40bba50bf998fdd0ac5f7625becad.jpg)
线性代数的温和介绍
[Steve Corey](https://www.flickr.com/photos/stevecorey/13939447959/) 的照片,保留一些权利。
## 概观
本节分为 3 部分;他们是:
1. 回波序列预测问题
2. 处理缺失的序列数据
3. 学习缺少序列值
### 环境
本教程假定您已安装 Python SciPy 环境。您可以在此示例中使用 Python 2 或 3。
本教程假设您使用 TensorFlow(v1.1.0 +)或 Theano(v0.9 +)后端安装了 Keras(v2.0.4 +)。
本教程还假设您安装了 scikit-learn,Pandas,NumPy 和 Matplotlib。
如果您在设置 Python 环境时需要帮助,请参阅以下帖子:
* [如何使用 Anaconda 设置用于机器学习和深度学习的 Python 环境](http://machinelearningmastery.com/setup-python-environment-machine-learning-deep-learning-anaconda/)
## 回波序列预测问题
回声问题是一个人为的序列预测问题,其目标是在固定的先前时间步长处记住和预测观察,称为滞后观察。
例如,最简单的情况是预测从前一个时间步的观察结果,即回显它。例如:
```
Time 1: Input 45
Time 2: Input 23, Output 45
Time 3: Input 73, Output 23
...
```
问题是,我们如何处理时间步 1?
我们可以在 Python 中实现回声序列预测问题。
这涉及两个步骤:随机序列的生成和随机序列到有监督学习问题的转换。
### 生成随机序列
我们可以使用随机模块中的 [random()函数](https://docs.python.org/3/library/random.html)生成 0 到 1 之间的随机值序列。
我们可以将它放在一个名为 generate_sequence()的函数中,该函数将为所需的时间步长生成一系列随机浮点值。
此功能如下所列。
```
# generate a sequence of random values
def generate_sequence(n_timesteps):
return [random() for _ in range(n_timesteps)]
```
### 框架作为监督学习
在使用神经网络时,必须将序列框定为监督学习问题。
这意味着序列需要分为输入和输出对。
该问题可以被构造为基于当前和先前时间步的函数进行预测。
或者更正式地说:
```
y(t) = f(X(t), X(t-1))
```
其中 y(t)是当前时间步长的期望输出,f()是我们寻求用神经网络逼近的函数,X(t)和 X(t-1)是当前和之前的观测值时间步长。
输出可以等于先前的观察值,例如,y(t)= X(t-1),但是它可以很容易地是 y(t)= X(t)。我们针对这个问题进行训练的模型并不知道真正的表述,必须学习这种关系。
这模拟了真实的序列预测问题,其中我们将模型指定为一组固定的顺序时间步长的函数,但我们不知道从过去的观察到期望的输出值的实际函数关系。
我们可以将这个回声问题的框架实现为 python 中的监督学习问题。
[Pandas shift()函数](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.shift.html)可用于创建序列的移位版本,可用于表示先前时间步的观测值。这可以与原始序列连接以提供 X(t-1)和 X(t)输入值。
```
df = DataFrame(sequence)
df = concat([df.shift(1), df], axis=1)
```
然后我们可以将 Pandas DataFrame 中的值作为输入序列(X),并使用第一列作为输出序列(y)。
```
# specify input and output data
X, y = values, values[:, 0]
```
综上所述,我们可以定义一个函数,它将时间步数作为参数,并返回名为 generate_data()的序列学习的 X,y 数据。
```
# generate data for the lstm
def generate_data(n_timesteps):
# generate sequence
sequence = generate_sequence(n_timesteps)
sequence = array(sequence)
# create lag
df = DataFrame(sequence)
df = concat([df.shift(1), df], axis=1)
values = df.values
# specify input and output data
X, y = values, values[:, 0]
return X, y
```
### 序列问题演示
我们可以将 generate_sequence()和 generate_data()代码绑定到一个工作示例中。
下面列出了完整的示例。
```
from random import random
from numpy import array
from pandas import concat
from pandas import DataFrame
# generate a sequence of random values
def generate_sequence(n_timesteps):
return [random() for _ in range(n_timesteps)]
# generate data for the lstm
def generate_data(n_timesteps):
# generate sequence
sequence = generate_sequence(n_timesteps)
sequence = array(sequence)
# create lag
df = DataFrame(sequence)
df = concat([df.shift(1), df], axis=1)
values = df.values
# specify input and output data
X, y = values, values[:, 0]
return X, y
# generate sequence
n_timesteps = 10
X, y = generate_data(n_timesteps)
# print sequence
for i in range(n_timesteps):
print(X[i], '=>', y[i])
```
运行此示例会生成一个序列,将其转换为监督表示,并打印每个 X,Y 对。
```
[ nan 0.18961404] => nan
[ 0.18961404 0.25956078] => 0.189614044109
[ 0.25956078 0.30322084] => 0.259560776929
[ 0.30322084 0.72581287] => 0.303220844801
[ 0.72581287 0.02916655] => 0.725812865047
[ 0.02916655 0.88711086] => 0.0291665472554
[ 0.88711086 0.34267107] => 0.88711086298
[ 0.34267107 0.3844453 ] => 0.342671068373
[ 0.3844453 0.89759621] => 0.384445299683
[ 0.89759621 0.95278264] => 0.897596208691
```
我们可以看到第一行有 NaN 值。
这是因为我们没有事先观察序列中的第一个值。我们必须用一些东西填补这个空间。
但我们无法使用 NaN 输入拟合模型。
## 处理缺失的序列数据
处理缺失的序列数据有两种主要方法。
它们将删除缺少数据的行,并使用其他值填充缺少的时间步。
有关处理缺失数据的更常用方法,请参阅帖子:
* [如何使用 Python 处理丢失的数据](http://machinelearningmastery.com/handle-missing-data-python/)
处理缺失序列数据的最佳方法取决于您的问题和您选择的网络配置。我建议探索每种方法,看看哪种方法效果最好。
### 删除缺失的序列数据
在我们回显前一个时间步骤中的观察的情况下,第一行数据不包含任何有用的信息。
也就是说,在上面的例子中,给定输入:
```
[ nan 0.18961404]
```
和输出:
```
nan
```
没有任何有意义的东西可以学习或预测。
这里最好的情况是删除这一行。
我们可以通过删除包含 NaN 值的所有行,在序列的制定过程中将其作为监督学习问题。具体来说,可以在将数据拆分为 X 和 y 分量之前调用 [dropna()函数](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html)
完整示例如下:
```
from random import random
from numpy import array
from pandas import concat
from pandas import DataFrame
# generate a sequence of random values
def generate_sequence(n_timesteps):
return [random() for _ in range(n_timesteps)]
# generate data for the lstm
def generate_data(n_timesteps):
# generate sequence
sequence = generate_sequence(n_timesteps)
sequence = array(sequence)
# create lag
df = DataFrame(sequence)
df = concat([df.shift(1), df], axis=1)
# remove rows with missing values
df.dropna(inplace=True)
values = df.values
# specify input and output data
X, y = values, values[:, 0]
return X, y
# generate sequence
n_timesteps = 10
X, y = generate_data(n_timesteps)
# print sequence
for i in range(len(X)):
print(X[i], '=>', y[i])
```
运行该示例会导致 9 X,y 对而不是 10 对,并删除第一行。
```
[ 0.60619475 0.24408238] => 0.606194746194
[ 0.24408238 0.44873712] => 0.244082383195
[ 0.44873712 0.92939547] => 0.448737123424
[ 0.92939547 0.74481645] => 0.929395472523
[ 0.74481645 0.69891311] => 0.744816453809
[ 0.69891311 0.8420314 ] => 0.69891310578
[ 0.8420314 0.58627624] => 0.842031399202
[ 0.58627624 0.48125348] => 0.586276240292
[ 0.48125348 0.75057094] => 0.481253484036
```
### 替换缺失的序列数据
在回声问题被配置为在当前时间步骤回显观察的情况下,第一行将包含有意义的信息。
例如,我们可以将 y 的定义从值[:,0]更改为值[:,1]并重新运行演示以生成此问题的示例,如下所示:
```
[ nan 0.50513289] => 0.505132894821
[ 0.50513289 0.22879667] => 0.228796667421
[ 0.22879667 0.66980995] => 0.669809946421
[ 0.66980995 0.10445146] => 0.104451463568
[ 0.10445146 0.70642423] => 0.70642422679
[ 0.70642423 0.10198636] => 0.101986362328
[ 0.10198636 0.49648033] => 0.496480332278
[ 0.49648033 0.06201137] => 0.0620113728356
[ 0.06201137 0.40653087] => 0.406530870804
[ 0.40653087 0.63299264] => 0.632992635565
```
我们可以看到第一行给出了输入:
```
[ nan 0.50513289]
```
和输出:
```
0.505132894821
```
这可以从输入中学到。
问题是,我们仍然需要处理 NaN 值。
我们可以用输入中不会自然出现的特定值(例如-1)替换所有 NaN 值,而不是删除具有 NaN 值的行。为此,我们可以使用 [fillna()Pandas 函数](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html)
完整示例如下:
```
from random import random
from numpy import array
from pandas import concat
from pandas import DataFrame
# generate a sequence of random values
def generate_sequence(n_timesteps):
return [random() for _ in range(n_timesteps)]
# generate data for the lstm
def generate_data(n_timesteps):
# generate sequence
sequence = generate_sequence(n_timesteps)
sequence = array(sequence)
# create lag
df = DataFrame(sequence)
df = concat([df.shift(1), df], axis=1)
# replace missing values with -1
df.fillna(-1, inplace=True)
values = df.values
# specify input and output data
X, y = values, values[:, 1]
return X, y
# generate sequence
n_timesteps = 10
X, y = generate_data(n_timesteps)
# print sequence
for i in range(len(X)):
print(X[i], '=>', y[i])
```
运行该示例,我们可以看到第一行的第一列中的 NaN 值被替换为-1 值。
```
[-1\. 0.94641256] => 0.946412559807
[ 0.94641256 0.11958645] => 0.119586451733
[ 0.11958645 0.50597771] => 0.505977714614
[ 0.50597771 0.92496641] => 0.924966407025
[ 0.92496641 0.15011979] => 0.150119790096
[ 0.15011979 0.69387197] => 0.693871974256
[ 0.69387197 0.9194518 ] => 0.919451802966
[ 0.9194518 0.78690337] => 0.786903370269
[ 0.78690337 0.17017999] => 0.170179993691
[ 0.17017999 0.82286572] => 0.822865722747
```
## 学习缺少序列值
在学习具有标记缺失值的序列预测问题时,有两个主要选项。
该问题可以按原样建模,我们可以鼓励模型了解特定值意味着“缺失”。或者,可以屏蔽特殊缺失值并从预测计算中明确排除。
我们将通过两个输入来看看这两个案例的人为“回应当前观察”问题。
### 学习缺失的价值观
我们可以为预测问题开发 LSTM。
输入由 2 个时间步长和 1 个特征定义。在第一隐藏层中定义具有 5 个存储器单元的小 LSTM,并且具有线性激活功能的单个输出层。
使用均方误差丢失函数和具有默认配置的高效 ADAM 优化算法,网络将适合。
```
# define model
model = Sequential()
model.add(LSTM(5, input_shape=(2, 1)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
```
为了确保模型学习问题的广义解,即始终将输入作为输出返回(y(t)== X(t)),我们将在每个时期生成一个新的随机序列。该网络将适合 500 个时期,并且将在每个序列中的每个样本之后执行更新(batch_size = 1)。
```
# fit model
for i in range(500):
X, y = generate_data(n_timesteps)
model.fit(X, y, epochs=1, batch_size=1, verbose=2)
```
一旦拟合,将生成另一个随机序列,并将来自模型的预测与预期值进行比较。这将提供模型技能的具体概念。
```
# evaluate model on new data
X, y = generate_data(n_timesteps)
yhat = model.predict(X)
for i in range(len(X)):
print('Expected', y[i,0], 'Predicted', yhat[i,0])
```
将所有这些结合在一起,下面提供了完整的代码清单。
```
from random import random
from numpy import array
from pandas import concat
from pandas import DataFrame
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense
# generate a sequence of random values
def generate_sequence(n_timesteps):
return [random() for _ in range(n_timesteps)]
# generate data for the lstm
def generate_data(n_timesteps):
# generate sequence
sequence = generate_sequence(n_timesteps)
sequence = array(sequence)
# create lag
df = DataFrame(sequence)
df = concat([df.shift(1), df], axis=1)
# replace missing values with -1
df.fillna(-1, inplace=True)
values = df.values
# specify input and output data
X, y = values, values[:, 1]
# reshape
X = X.reshape(len(X), 2, 1)
y = y.reshape(len(y), 1)
return X, y
n_timesteps = 10
# define model
model = Sequential()
model.add(LSTM(5, input_shape=(2, 1)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
# fit model
for i in range(500):
X, y = generate_data(n_timesteps)
model.fit(X, y, epochs=1, batch_size=1, verbose=2)
# evaluate model on new data
X, y = generate_data(n_timesteps)
yhat = model.predict(X)
for i in range(len(X)):
print('Expected', y[i,0], 'Predicted', yhat[i,0])
```
运行该示例将打印每个时期的损失,并在运行结束时比较一个序列的预期输出与预测输出。
回顾最终预测,我们可以看到网络已经了解了问题并预测了“足够好”的输出,即使存在缺失值。
```
...
Epoch 1/1
0s - loss: 1.5992e-04
Epoch 1/1
0s - loss: 1.3409e-04
Epoch 1/1
0s - loss: 1.1581e-04
Epoch 1/1
0s - loss: 2.6176e-04
Epoch 1/1
0s - loss: 8.8303e-05
Expected 0.390784174343 Predicted 0.394238
Expected 0.688580469278 Predicted 0.690463
Expected 0.347155799665 Predicted 0.329972
Expected 0.345075533266 Predicted 0.333037
Expected 0.456591840482 Predicted 0.450145
Expected 0.842125610156 Predicted 0.839923
Expected 0.354087132135 Predicted 0.342418
Expected 0.601406667694 Predicted 0.60228
Expected 0.368929815424 Predicted 0.351224
Expected 0.716420996314 Predicted 0.719275
```
您可以进一步尝试此示例,并将给定序列的 t-1 观察值的 50%标记为-1,并查看它如何影响模型的技能随时间的变化。
### 掩盖缺失的价值观
可以从网络中的所有计算中屏蔽标记的缺失输入值。
我们可以通过使用 [Masking 层](https://keras.io/layers/core/#masking)作为网络的第一层来实现。
定义层时,我们可以指定要屏蔽的输入中的哪个值。如果时间步长的所有要素都包含蒙版值,则整个时间步长将从计算中排除。
这为完全排除行并强制网络了解标记缺失值的影响提供了一个中间立场。
由于 Masking 层是网络中的第一个,因此必须指定输入的预期形状,如下所示:
```
model.add(Masking(mask_value=-1, input_shape=(2, 1)))
```
我们可以将所有这些结合起来并重新运行示例。完整的代码清单如下。
```
from random import random
from numpy import array
from pandas import concat
from pandas import DataFrame
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense
from keras.layers import Masking
# generate a sequence of random values
def generate_sequence(n_timesteps):
return [random() for _ in range(n_timesteps)]
# generate data for the lstm
def generate_data(n_timesteps):
# generate sequence
sequence = generate_sequence(n_timesteps)
sequence = array(sequence)
# create lag
df = DataFrame(sequence)
df = concat([df.shift(1), df], axis=1)
# replace missing values with -1
df.fillna(-1, inplace=True)
values = df.values
# specify input and output data
X, y = values, values[:, 1]
# reshape
X = X.reshape(len(X), 2, 1)
y = y.reshape(len(y), 1)
return X, y
n_timesteps = 10
# define model
model = Sequential()
model.add(Masking(mask_value=-1, input_shape=(2, 1)))
model.add(LSTM(5))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
# fit model
for i in range(500):
X, y = generate_data(n_timesteps)
model.fit(X, y, epochs=1, batch_size=1, verbose=2)
# evaluate model on new data
X, y = generate_data(n_timesteps)
yhat = model.predict(X)
for i in range(len(X)):
print('Expected', y[i,0], 'Predicted', yhat[i,0])
```
同样,每个时期打印损失,并将预测与最终序列的预期值进行比较。
同样,预测看起来足够小到几位小数。
```
...
Epoch 1/1
0s - loss: 1.0252e-04
Epoch 1/1
0s - loss: 6.5545e-05
Epoch 1/1
0s - loss: 3.0831e-05
Epoch 1/1
0s - loss: 1.8548e-04
Epoch 1/1
0s - loss: 7.4286e-05
Expected 0.550889403319 Predicted 0.538004
Expected 0.24252028132 Predicted 0.243288
Expected 0.718869927574 Predicted 0.724669
Expected 0.355185878917 Predicted 0.347479
Expected 0.240554707978 Predicted 0.242719
Expected 0.769765554707 Predicted 0.776608
Expected 0.660782450416 Predicted 0.656321
Expected 0.692962017672 Predicted 0.694851
Expected 0.0485233839401 Predicted 0.0722362
Expected 0.35192019185 Predicted 0.339201
```
### 选择哪种方法?
这些一次性实验不足以评估在简单回波序列预测问题上最有效的方法。
他们提供的模板可以用于您自己的问题。
我鼓励您探索在序列预测问题中处理缺失值的 3 种不同方法。他们是:
* 删除缺少值的行。
* 标记并学习缺失值。
* 掩盖和学习没有遗漏的价值观。
尝试针对序列预测问题的每种方法,并对看起来效果最好的方法进行加倍研究。
## 摘要
如果序列具有可变长度,则通常在序列预测问题中具有缺失值。
在本教程中,您了解了如何使用 Keras 处理 Python 中序列预测问题中的缺失数据。
具体来说,你学到了:
* 如何删除包含缺失值的行。
* 如何标记缺失值并强制模型了解其含义。
* 如何屏蔽缺失值以将其从模型中的计算中排除。
您对处理丢失的序列数据有任何疑问吗?
在评论中提出您的问题,我会尽力回答。
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册