到这一章,我们已经从“能不能做出来”,走到了一个更现实的问题:
能不能长期跑得动。
很多预测系统在早期都很顺利:
数据不多模型不大每天跑一次也很轻松
但随着时间推移,你会发现几个变化:
数据越来越多特征计算越来越慢训练时间越来越长
如果不做优化,系统迟早会遇到一个瓶颈:
不是预测不准,而是跑不动了。
这一章,我们就讲一个很多技术文章不太愿意讲,但在真实项目里非常关键的话题:
工程性能优化。
第十六章:性能与工程优化——当数据越来越多,如何让系统依然高效稳定运行?在系统运行的第一年,我几乎没有考虑过性能问题。
那时候:
历史数据只有几万场特征计算几秒完成模型训练几十秒
一切都很顺。
但当数据量上升到十万级之后,问题开始出现:
特征计算变慢数据库查询变慢训练时间越来越长
这时候我才意识到一个现实:
预测系统是长期工程,不是一次性实验。
如果结构不优化,数据规模本身就会成为负担。
16.1 最大的性能消耗在哪里?很多人第一反应是:
是不是模型太复杂?
但实际分析后发现:
模型训练时间,占比并不高。真正耗时的,是:
特征计算。
原因很简单。
每一场比赛的特征,可能需要:
查询球队过去N场数据计算滚动平均汇总多个公司赔率计算各种统计指标如果每场比赛都单独查询数据库,效率会非常低。
所以优化的第一原则是:
尽量减少重复计算。
16.2 特征缓存:最有效的优化方法后来我做的一个关键优化是:
把球队能力单独缓存下来。
比如:
每天更新一次:
某球队的进攻能力防守能力主场能力客场能力
这样,在生成比赛特征时,只需要直接读取结果,而不是重新计算。
这一步带来的效果非常明显:
特征生成速度提升数倍以上。
工程上的经验往往是这样:
不是算法变快,而是避免重复工作。
16.3 批量计算,而不是逐场计算另一个常见的性能问题,是按比赛逐条处理。
例如:
一场比赛查询一次数据库下一场再查一次
这种方式在数据量大时,会极大拖慢系统。
更好的方式是:
一次性加载某时间段的全部数据在内存中批量计算
数据库负责存储,计算尽量在内存中完成。
这个改动,在数据量较大时,性能差距会非常明显。
16.4 训练数据管理:不要无限增长很多人有一个直觉:
数据越多越好。
但在实际系统中,如果训练数据无限增长,会带来两个问题:
训练时间变长历史信息权重过高
前面第十五章提到过滚动窗口,这里再强调一次:
只保留最近2~3年的数据,通常已经足够。
这样既保证模型反映当前环境,又能控制训练规模。
这是一个同时提升效果和性能的优化。
16.5 并行计算:让系统利用多核当特征计算或模型训练仍然较慢时,可以考虑并行处理。
例如:
不同比赛同时计算特征不同联赛分开处理模型训练使用多线程参数
LightGBM本身支持多线程,在数据量较大时,性能提升明显。
但这里有一个原则:
先优化逻辑结构,再考虑并行。
如果算法本身效率很低,多线程只是把低效放大。
16.6 数据库优化:一个经常被忽略的点在长期系统中,数据库性能也很关键。
几个简单但有效的原则:
关键字段建立索引(比赛时间、球队ID)避免复杂嵌套查询历史数据按时间分区存储
这样可以保证随着数据量增长,查询速度不会明显下降。
否则,系统会越来越慢,而且很难定位问题。
16.7 为什么性能优化不仅仅是速度问题?很多人觉得,慢一点也没关系。
但在长期系统中,性能问题会带来三个风险:
第一,更新延迟,影响预测时效第二,系统复杂度上升,维护困难第三,运行失败概率增加
而一旦系统开始不稳定,模型效果再好,也无法长期使用。
所以工程优化的目标,不只是更快,而是:
可长期稳定运行。
这一章最重要的一句话是:
一个优秀的预测系统,不只是准确,还要能够长期、稳定、高效地运行。
当系统在数据量增长的情况下仍然保持稳定,你就真正拥有了一个“可以长期工作的预测引擎”。
接下来,我们进入整本书的一个重要转折部分。
前面讲的是技术和工程,后面开始进入:
如何真正把这些能力,用在实际决策中。
下一章:
第十七章:总进球实战思路——为什么2/3球区间,往往是最稳定的选择?
因为从这一章开始,我们要把前面的模型能力,真正落到实战逻辑上。
转载请注明来自海坡下载,本文标题:《性能与优化(第十六章性能与工程优化如何让系统依然高效稳定运行)》
京公网安备11000000000001号
京ICP备11000001号
还没有评论,来说两句吧...