全文共3475字,预计学习时长7分钟git
图片来源:unsplash.com/@mattyfoursgithub
数据科学家比软件工程师更加擅长统计学,也比统计学家更加擅长软件工程。若是能有效避免在编码过程当中的错误,你必定成为一个优秀的数据科学家!算法
文中每一个示例的详细输出和代码能够在github和交互式笔记本中找到。该代码使用数据工做流管理库d6tflow,数据与数据集管理库d6tpipe共享。微信
传送门:函数
http://tiny.cc/top10-mistakes-stats-code性能
http://tiny.cc/top10-mistakes-stats-bind学习
https://github.com/d6t/d6tflow测试
https://github.com/d6t/d6tpipe优化
1. 没有彻底理解目标函数编码
数据科学家想要创建“最佳”模型。然而美是我的的主观感觉。若是不了解目标和目标函数,以及它的行为模式,就很难构建出“最佳”模型。更况且,目标甚至可能不是数学函数,而是提升业务指标。
对策:大多数人花费大量时间来理解目标函数以及数据和模型跟目标函数之间的联系。若是须要优化业务指标,则应该将它标示在正确的数学目标函数上。
案例:F1分数一般用于评估分类模型。分类模型的成功取决于正确的发生率。F1分数是具备误导性的,由于它代表模型在60%的时间内是正确的,而实际上它只有在40%的时间内是正确的。
f1 0.571 accuracy 0.4
2. 没有创建某物为什么起做用的假说
数据科学家一般但愿创建“模型”——听说xgboost和随机森林的效果是最好的,因此就使用它吧。很多人在没有查看数据的状况下抛出问题的模型,而且没有造成一个假设——即哪一个模型最有可能最好地捕获数据的特征。这也使得解释的工做很是困难,由于人们只是随机地向数据扔模型。
对策:多研究数据,理解它的特征,并造成哪一个模型最有可能捕捉到特征的假设。
案例:不须要运行任何模型,只需绘制这个样本数据,就能够清楚地看到x1与y线性相关,而2与y没有太大关系。
3. 在分析结果以前没有看数据
不查看数据的另外一个问题是,结果可能严重受异常值或其余构件的影响。最小化平方和的模型尤为如此,即便不受异常值的影响,也可能会遇到数据集不平衡、值被剪切或丢失,以及在课堂上看不到的各类真实数据的奇怪构件。
对策:查看研究数据是很是重要的。了解数据的性质,以及它们如何影响模型结果。
案例:在异常值的影响下,x1斜率从0.906变为-0.375!
4. 没有一个简单的基线模型
如今,ML变得十分简单,只需更改一行代码,就能够运行一个又一个新模型。从调整参数到偏差指标进一步减小,有了这么完美的模型,过去那些愚蠢的预测数据的方法均可以被摒弃了。若是没有这个基本的基准,就不要对模型有好的绝对比较 ,由于在绝对意义上它们都有多是很差的。
对策:预测一个值的最愚蠢的方法是什么?使用最后一个已知值、滚动平均值或某个常量(如0)创建“模型”。将模型性能与没有智力的猴子进行比较。
案例:在此时间序列数据集中,Model1必须比MSE分别为0.21和0.45的Model2更好。可是,只要取最后一个已知值,均方偏差就降低到0.003!
ols CV mse 0.215
rf CV mse 0.428
last out-sample mse 0.003
图片来源:unsplash.com/@neonbrand
5. 样本外测试不正确
这个错误可能会令事业脱轨!创建的模型在研发方面看起来很好,但在生产方面表现糟糕。
你所说的“能创造奇迹”的模式会致使很是糟糕的业务结果,可能会让公司损失逾100万美圆。重要的是,除了最后一个错误,其他的错误都要注意。
对策:确保你已经在实际的超样条件下运行了你的模型,并理解它何时会表现好,何时不会。
案例:在样本中,随机森林的MSE为0.048比OLS为0.183的线性回归要好得多,而在样本外,MSE为0.259比线性回归MSE为0.187的线性回归差得多。随机森林过分训练,在生产中表现不佳!
in-sample
rf mse 0.04 ols mse 0.183
out-sample
rf mse 0.261 ols mse 0.187
6. 样本外测试不正确:对整个数据集应用预处理
强大的模型可能会过分训练。过分训练意味着它在样本内表现良好,但在样本外表现不佳。所以,你须要意识到训练数据会泄漏到测试数据中。若是不当心,不管什么时候进行特征工程或交叉验证,训练数据均可能渗入测试数据,并提升模型性能。
对策:确保有一个没有任何来自训练套件的泄漏的测试套件,特别要注意生产使用中可能出现的任何依赖时间的关系。
案例:这种状况常常发生。预处理将应用于完整的数据集,而后将其拆分为训练和测试,这意味着你没有真正的测试集。在将数据分红训练集和测试集后,预处理须要单独应用,以使其成为真正的测试集。
在这种状况下,两种方法之间的均方偏差(混合样本外变异系数均方偏差0.187与真实样本外变异系数均方偏差0.181)并没有太大差别,由于训练和测试之间的分布特性并没有太大差别,但状况可能并不是老是如此。
mixed out-sample CV mse 0.187 true out-sample CV mse 0.181
7. 错误的样品外测试:横截面数据和面板数据
你只须要学会交叉验证。sklearn甚至提供了一些能够检测全部数据箱的的便利功能。可是大多数交叉验证方法都是随机抽样的,因此你可能会在测试集中获得提升性能的训练数据。
对策:生成测试数据,以便它准确地反映实际生产中进行预测的数据。尤为是对于时间序列和面板数据,可能须要生成自定义交叉验证数据或进行提早滚动测试。
案例:这里有两个不一样实体(如公司)的面板数据,它们在横截面上高度相关。若是随机分割数据,则使用测试期间实际上不可用的数据进行精确预测,从而夸大模型性能。你认为经过使用交叉验证能够避免错误5,而且发现随机林在交叉验证中的性能比线性回归好得多。可是,运行一个前滚样本测试,以防止未来的数据泄漏到测试中,它会再次表现得更糟!(随机森林MSE从0.047变为0.211,高于线性回归!)
normal CV
ols 0.203 rf 0.051
true out-sample error
ols 0.166 rf 0.229
8. 不考虑决策时有哪些数据可用
在生产中运行模型时,会获得运行模型时可用的数据。这些数据可能与训练时中假设的数据不一样。例如,数据可能会延迟发布,所以在运行模型时,其余输入已经更改而且用了错误的数据进行预测,或者真实的y变量不正确。
对策:作一个滚动样本前向测试。若是在生产中使用过这个模型,训练数据会是什么样的,即有什么数据能够作出预测?这是用于进行真正的样本外生产测试的训练数据。此外,考虑一下是否对预测采起了行动,在决策时又会产生什么结果?
9. 微妙的过分训练
花在数据集上的时间越多,则越有可能过分使用它。由于一直在修改特性和优化模型参数。因为使用了交叉验证,因此结果必然是好的。
对策:完成模型的构建以后,请尝试找到另外一个数据集的“版本”,该版本能够替代真正的输出示例数据集。若是你是经理,故意保留数据,这样它们就不会被用于训练。
案例:将在数据集1上训练的模型应用到数据集2上,MSE则增长了一倍多。它们仍然能够被接受吗?这是一个判断的机会,可是从第四点获得的结果可能会帮助作出决定。
first dataset
rf mse 0.261 ols mse 0.187
new dataset
rf mse 0.681 ols mse 0.495
10. “须要更多数据”的谬论
图片来源:unsplash.com/@franki
与直觉相反,开始分析数据的最佳方式一般是对数据的表明性样本进行处理。这使你够熟悉数据并构建数据管道,而无需等待数据处理和模型培训。可是数据科学家彷佛不喜欢这个观点——越多数据越好。
对策:从一个小的具备表明性样本开始,看看你能不能从中获得一些有用的东西。若是把它还给最终用户,他们会用吗?它能解决真正的痛点吗?若是没有,问题可能不是数据太少,而是方法不对。
github传送门:https://github.com/d6tdev/top10-mistakes-statistics-binder
交互式笔记本:https://gke.mybinder.org/v2/gh/d6tdev/top10-mistakes-statistics-binder/master?filepath=visualize.ipynb
留言 点赞 关注
咱们一块儿分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”
(添加小编微信:dxsxbb,加入读者圈,一块儿讨论最新鲜的人工智能科技哦~)