原文:
www.kdnuggets.com/2019/06/statistics-mistakes-data-scientists.html
作者 Norman Niemer,首席数据科学家
数据科学家是一个“在统计学上比任何软件工程师都要出色,而在软件工程上又比任何统计学家都要优秀”的人。在 数据科学家常犯的前 10 个编程错误 中,我们讨论了统计学家如何成为更好的编码者。在这里,我们讨论了编码者如何成为更好的统计学家。
1. 谷歌网络安全证书 - 快速开启网络安全职业生涯
2. 谷歌数据分析专业证书 - 提升您的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持您的组织进行 IT 管理
每个示例的详细输出和代码可在 github 和一个 互动笔记本中找到。代码使用了工作流管理库 d6tflow,数据则与数据集管理库 d6tpipe 共享。
数据科学家希望建立“最佳”模型。但美在于观察者的眼中。如果你不知道目标和目标函数是什么以及它是如何运作的,那么你很可能无法建立“最佳”模型。顺便提一下,目标可能甚至不是一个数学函数,而是改进业务指标。
解决方案:大多数 Kaggle 冠军会花很多时间了解目标函数以及数据和模型如何与目标函数相关。如果你在优化业务指标,将其映射到一个合适的数学目标函数上。
示例:F1 分数通常用于评估分类模型。我们曾经建立过一个分类模型,其成功与否取决于模型的准确率。F1 分数具有误导性,因为它显示模型的正确率约为 60%,而实际上模型的正确率只有 40%。
f1 0.571 accuracy 0.4
数据科学家通常想要构建“模型”。他们听说 XGBoost 和随机森林效果最好,所以就使用这些。他们阅读有关深度学习的资料,也许这会进一步改善结果。他们在没有查看数据、没有形成假设哪个模型最有可能捕捉数据特征的情况下,将模型扔向问题。这也使得解释你的工作变得非常困难,因为你只是随意地将模型应用到数据上。
解决方案:查看数据!了解数据的特征,并形成一个假设,哪个模型可能最能捕捉这些特征。
示例:在没有运行任何模型的情况下,仅通过绘制这个样本数据,你可以清楚地看到 x1 与 y 之间是线性相关的,而 x2 与 y 的关系不大。
另一个没有查看数据的问题是,你的结果可能会受到离群值或其他伪影的严重影响。这对于最小化平方和的模型尤其如此。即使没有离群值,你也可能会遇到不平衡的数据集、剪辑或缺失值以及各种你在课堂上未曾见过的真实数据伪影问题。
解决方案:非常重要,以至于值得重复:查看数据!了解数据的性质如何影响模型结果。
示例:在存在离群值的情况下,x1 的斜率从 0.906 改变为 -0.375!
现代机器学习库几乎让这一切变得太简单了……只需更改一行代码,你就可以运行一个新的模型。再来一个。再来一个。误差指标在降低,调整参数——太棒了——误差指标进一步降低……有了所有这些模型的华丽功能,你可以忘记那些笨拙的数据预测方法。没有那个天真的基准,你就没有一个好的绝对比较来评估你的模型的好坏,它们可能在绝对意义上都是糟糕的。
解决方案:你能用什么最傻的方法预测一个值?使用最后已知的值、(滚动)均值或某个常量(例如 0)构建一个“模型”。将你的模型表现与零智商预测猴子的表现进行比较!
示例:在这个时间序列数据集上,model1 的 MSE 为 0.21,model2 的 MSE 为 0.45,因此 model1 应该优于 model2。但等等!只用最后已知的值,MSE 下降到 0.003!
ols CV mse 0.215
rf CV mse 0.428
last out-sample mse 0.003
这可能会毁掉你的职业生涯!你构建的模型在研发阶段表现出色,但在生产环境中却表现极差。你所说的会带来奇迹的模型正在导致非常糟糕的业务结果,可能让公司损失超过百万美元。所有剩下的错误,除了最后一个,都需要集中在这个问题上。
解决方案:确保你在现实的外样本条件下运行模型,并理解它何时表现良好,何时表现不佳。
示例:在样本内,随机森林的表现远优于线性回归,均方误差为 0.048 vs 0.183,但在样本外表现却远差,均方误差为 0.259 vs 0.187。随机森林过度训练,不能在生产环境中表现良好!
in-sample
rf mse 0.04 ols mse 0.183
out-sample
rf mse 0.261 ols mse 0.187
你可能知道强大的机器学习模型可能会过度训练。过度训练意味着模型在训练样本中表现良好,但在测试样本中表现差。因此,你需要注意训练数据是否泄漏到测试数据中。如果不小心,每次进行特征工程或交叉验证时,训练数据可能会渗入测试数据,从而夸大模型的表现。
解决方案:确保你有一个真正的测试集,不包含任何来自训练集的泄漏。尤其要注意生产使用中可能出现的任何时间依赖关系。
示例:这很常见。预处理应用于整个数据集,然后再进行训练和测试拆分,这意味着你没有真正的测试集。预处理需要在数据拆分为训练集和测试集后单独应用,以确保它成为一个真正的测试集。在这种情况下,两种方法的均方误差(混合外样本 CV mse 0.187 vs 真实外样本 CV mse 0.181)差别不大,因为训练和测试之间的分布属性差异不大,但这可能并不总是如此。
mixed out-sample CV mse 0.187 true out-sample CV mse 0.181
你被教导说交叉验证是你所需要的一切。sklearn 甚至为你提供了一些便利函数,所以你认为你已经完成了所有的步骤。但大多数交叉验证方法进行随机抽样,因此你可能会在测试集中得到训练数据,从而夸大性能。
解决方案:生成测试数据,使其准确反映你在实时生产使用中进行预测时的数据。尤其是在时间序列和面板数据中,你可能需要生成自定义的交叉验证数据或进行滚动测试。
示例:这里你有两个不同实体(如公司)的面板数据,这些数据在横截面上高度相关。如果你随机拆分数据,你会使用实际测试中没有的数据做出准确的预测,从而夸大模型性能。你认为通过使用交叉验证避免了第 5 个错误,并发现随机森林在交叉验证中表现远优于线性回归。但进行滚动前向测试以防止未来数据泄漏到测试中,结果表现反而更差!(随机森林的均方误差从 0.047 升高到 0.211,高于线性回归!)
normal CV
ols 0.203 rf 0.051
true out-sample error
ols 0.166 rf 0.229
当你在生产中运行一个模型时,它会接收到在你运行模型时可用的数据。这些数据可能与训练时假设的数据不同。例如,数据可能会有延迟发布,因此当你运行模型时,其他输入已发生变化,你可能正在使用错误的数据进行预测,或者你的真实 y 变量是不正确的。
解决方案:进行滚动的外部样本前向测试。如果我在生产中使用了这个模型,我的训练数据会是什么样的,即你有什么数据来进行预测?这就是你用来进行真实外部样本生产测试的训练数据。此外,考虑一下如果你根据预测采取了行动,这将在决策时产生什么结果?
你在数据集上花费的时间越多,你过度训练的可能性就越大。你不断调整特征和优化模型参数。你使用了交叉验证,所以一切都应该很好。
解决方案:在你完成模型构建后,尝试寻找另一种“版本”的数据集,这可以作为真正的外部样本数据集的替代。如果你是经理,有意地保留一些数据,使其不用于训练。
例子:将训练于数据集 1 的模型应用于数据集 2 显示 MSE(均方误差)翻了一倍多。它们仍然可以接受吗...? 这是一个判断问题,但你在#4 中的结果可能会帮助你决定。
first dataset
rf mse 0.261 ols mse 0.187
new dataset
rf mse 0.681 ols mse 0.495
反直觉的是,通常开始分析数据的最佳方法是从一个具有代表性的数据样本入手。这使你能够熟悉数据并建立数据管道,而无需等待数据处理和模型训练。但数据科学家似乎不喜欢这样——更多的数据更好。
解决方案:从一个小的代表性样本开始工作,看看你能从中获得什么有用的东西。将其交还给最终用户,他们能使用它吗?它解决了真正的痛点吗?如果没有,问题可能不在于你数据太少,而在于你的方法。
简历:Norman Niemer 是一家大型资产管理公司的首席数据科学家,他提供数据驱动的投资见解。他拥有哥伦比亚大学的金融工程硕士学位和伦敦 Cass 商学院的银行与金融学士学位。
原文。已获许可转载。
相关:
-
数据科学家犯的十大编码错误
-
即使是科学家也会犯的统计错误
-
你从未学过的关键统计数据……因为它们从未被教授