首页 / 资讯中心 / 文章详情

运维必学:用多项式回归预测磁盘使用率趋势

运维必学:用多项式回归预测磁盘使用率趋势 ★ FEATURED ARTICLE
前一阵子组里接了个“预测磁盘使用率趋势”的活儿。我们运维这边日常就是看监控、捞日志、敲Linux命令突然要预测服务器存储还够撑几天这就得上机器学习。说实话一开始是有点发怵的但真把多项式回归啃下来以后发现这东西并没有想象中那么玄乎而且特别对我这种天天跟指标曲线打交道的运维胃口。这篇东西不是我抄书抄出来的是我从一个完全没系统学过算法的运维视角硬生生把多项式回归用在真实监控数据上、踩完坑之后写出来的经验总结。如果你也是运维、测试或者做基础架构的觉得机器学习离自己挺远那这篇大概能让你少走很多弯路至少看完之后能自己动手做一次趋势预测。1. 为什么运维要先学多项式回归而不是那堆花里胡哨的算法1.1 运维手里有大量“曲线”曲线就是天然的回归问题干了这么多年运维我最熟悉的不是代码是图。CPU使用率曲线、磁盘IO等待曲线、内存占用曲线、网络吞吐曲线。每天晚上盯着Grafana看这些线跳来跳去时间长了其实脑子里已经有模糊的“感觉”——这个磁盘再照这么涨下周三肯定要满。这种感觉在数学上叫“拟合趋势”在机器学习里最朴素的那个实现方式就是回归算法。回归要做的事情翻译成运维语言就是给你一堆历史数据点时间作为X指标值作为Y找一条线或者一条曲线让它尽量穿过这些点然后顺着这条线往后画去预测明天、后天、下周的值。而多项式回归是这堆回归算法里边最直白的一个——它就是用一个带高次项的方程式去描述那条曲线。别一听到“高次方程”就害怕它就是让曲线可以拐弯而已。磁盘使用率不是直线增长的开头慢、中间快、快满了又可能因为清理任务降下来这种带弯折的规律线性回归根本搞不定多项式回归登场。1.2 从运维监控到机器学习桥梁是“特征”我一直觉得运维干久了的人学机器学习其实比纯开发要顺手。为什么因为我们天生就懂“指标”。机器学习最核心的一件事不是模型是特征。特征在我们运维眼里就是监控项CPU、内存、磁盘、流量、QPS、延迟。模型要做的事情就是帮忙找到这些指标之间的数学关系。拿多项式回归举例子我们要预测磁盘使用率X是时间Y是磁盘使用率。这里X只有一个——时间这在机器学习里叫“单特征”。但多项式回归会在内部把X变成X的2次方、3次方、甚至更高次方相当于它自己给自己造了新特征。这不就像我们做监控时候有时候会看“CPU负载的5分钟平均值”和“CPU负载的15分钟平均值”一样吗我们那是人工造特征它是自动造特征殊途同归。这么一想什么“机器学习是黑盒”屁咧至少多项式回归这个盒子的每一个零件你都能看得清清楚楚。1.3 运维场景下多项式回归的适用边界也不是所有监控数据都适合拿多项式回归硬上。我自己的经验是先分清数据类型。如果数据是单调增长的比如日志文件大小、磁盘容量使用量这种用线性回归或者低次多项式就够。如果数据有明显周期性比如每天的流量曲线、每周的CPU波峰波谷那更适合用时间序列分析的套路比如季节性分解、ARIMA之类的。一个多项式去拟合周期函数效果会很难看除非你把周期的星期几、第几个小时也作为特征丢进去那就不是多项式回归的活儿了。如果数据变化非常剧烈像瞬时网络重传率、抖动这种预测出来也没有意义。多项式回归擅长的是捕捉“大趋势”不是“毛刺”。所以学多项式回归学的不是一个孤立的函数而是一种判断力看到一条曲线先判断它是趋势型还是周期型还是噪声型再决定用不用这个工具。这种能力运维本来就是有的。2. 多项式回归原理拆解从一次函数到弯弯绕绕的曲线2.1 首先是那个“欠拟合”的问题做运维的肯定都有这种经历报警阈值的线是一条横的虚线比如磁盘使用率超过85%就报警。但是实际使用率的曲线是斜着往上飘的。那条横着的虚线永远只是在“出事”的时候才告诉你出事了从来不会提前告诉你。横线预测不了斜线这就是线性模型的问题。放到数学上一次函数长这样[ y ax b ]X变大Y只能要么一直涨、要么一直降画出来永远是一条直线。要是我们监控到的真实规律是“先升后稳”或者“S型增长”拿直线去套结果就是“欠拟合”——模型太简单连历史数据都解释不准更别说预测未来了。2.2 多项式回归的本质给曲线“拐弯”的能力多项式回归的模型长这样[ y b_0 b_1x b_2x^2 b_3x^3 \cdots b_nx^n ]不用被这个式子吓到它的核心想法特别朴素一次项让线可以斜着走二次项让线可以弯一次三次项让线可以弯两次。次数越高线能拐的弯就越多就能贴合更复杂的形态。用运维的话说二次项就是“这条线不光在涨而且涨得越来越快”那种效果。三次项就是“涨了一会儿之后开始放缓甚至掉头往下”的效果。四次五次那就是“过山车”效果了。但是这不代表次数越多越好。次数太高那个问题叫“过拟合”——它会把监控数据里的噪声、毛刺全都当成规律去拟合。画出来的曲线完美穿过每一个历史点但是一预测未来偏差大得离谱这跟我们做监控最忌讳的“拟合报警曲线走过的每一个毛刺”一模一样看着无比精确其实就是自欺欺人。2.3 线性回归和多项式回归的秘密关系这里有个特别容易让初学者误解的点多项式回归其实还是“线性回归”。这个“线性”指的是参数之间是线性的——模型里每个系数 ( b_0, b_1, b_2 ) 都是加起来的关系求解方式跟线性回归完全一样用的是最小二乘法。只是“特征”变了原本输入的是 ( x )现在我们手动构造了 ( x^2, x^3 ) 作为新输入。所以多项式回归的本质就是先把原始特征转换成一个高维特征矩阵然后在这个高维空间里做线性回归。我在实操的时候是把这一步想得很清楚的多项式回归 特征工程构造高次项 线性回归最小二乘法求解。这个概念认知帮了我大忙因为一旦想通了后面调库的时候就明白每个参数是在干什么了。2.4 别忽略的多重共线性问题这是我只顾着写公式、实际跑起来才发现的一个隐蔽坑。[ x \text{ 与 } x^2 \text{ 之间的相关性往往非常高} ]特别是当X的范围远离0的时候( x )、( x^2 )、( x^3 ) 之间的数值差异极大比如X从1到100( x^3 ) 值到100万这会导致什么最小二乘法在求解的时候矩阵运算结果会非常不稳定系数的数值会大到离谱稍微改一点点数据系数就翻天覆地。解决的办法很标准做特征缩放也就是归一化 / 标准化。我在实践中就是把时间特征做了MinMaxScaler缩放到0到1之间问题就消停了。这步不做后面训练出来的模型基本没法用。所以接下来说到实操的时候这步一定要加不加你的损失函数会一直抖参数更新完全收敛不了你可能会怀疑人生地想着“为什么跟着公式推导都对代码跑出来就是一团糟”。3. 环境准备与工具选型Python生态就够了3.1 运维机器上怎么搭机器学习环境先说说我的环境一台普普通通的Linux服务器CentOS 7Python 3.8。说实话之前跑运维脚本用的Python还是2.7时代的习惯第一次接触numpy和pandas的时候感觉像是从shell命令直接蹦到了另一个世界。装环境我建议直接用pip装这四件套pip install numpy pandas scikit-learn matplotlib或者用国内的镜像源装会快很多pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy pandas scikit-learn matplotlib不用搞什么虚拟环境吗其实我建议得搞。尤其是你服务器上可能还存在别的业务Python环境把包搞冲突了不太好。用virtualenv或者conda都行我自己的习惯是python3 -m venv ml_env source ml_env/bin/activate这样一个干净的机器学习环境也可以理解为实验区就搭好了。运维的服务器上经常有各种乱七八糟的环境依赖虚拟环境在这里就是救星。3.2 为什么要用scikit-learn而不是从零写公式我当时其实动过自己用numpy手写最小二乘求解的念头就是那个经典的[ \theta (X^TX)^{-1}X^Ty ]但后来发现scikit-learn已经把这个封装得很好了而且额外处理了很多数值稳定性的坑就是前面提到的多重共线性时矩阵求逆会崩的问题。自己手写一遍可以帮忙了解原理但是实际做预测用库的效率高、出错的概率也小得多。主要用到的类就这几个PolynomialFeatures负责构造 ( x^2, x^3 ) 这些高次特征LinearRegression负责在构造好的高维特征上做线性拟合Pipeline把上面两步串起来形成一个完整流程train_test_split把数据切分成训练集和测试集用来验证模型效果3.3 别用Excel做这事有段时间我还想是不是可以直接把监控数据导到Excel里加个趋势线Excel确实能做多项式趋势线而且能指定次数。但问题在于Excel做这类事情是封闭的你不能把训练好的模型导出来给脚本用也不方便批量处理几十台服务器的数据更没法把预测结果集成进自己的监控工具。而我们运维处理的是规模化的服务器群组不是一两台机器所以流程必须代码化、可复用。这个痛点我相信干运维的都懂处理一台机器靠手工能行处理一百台机器还靠手工那就是灾难。4. 实操从零开始用一段磁盘监控数据跑通多项式回归4.1 制造符合实际情况的训练数据先说清楚正式演示我用的是模拟数据。因为我不能把我们线上服务器的具体监控数据贴出来毕竟涉及公司内网数据安全但模拟数据的口径跟真实数据是保持一致的——就是那种“每15分钟采一次磁盘使用率、连续采300天”的数据。为了让模拟数据有“真实感”我给数据掺了几种常见的运维特征一段缓慢增长期系统刚上线磁盘用量不多一段时间增长加速业务扩张日志量大增夹杂了一些随机波动临时文件清理、偶尔的大文件写入还安排了一次“断崖下跌”其实是一次存储迁移代码如下先产生这种参杂噪声的时间序列数据import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression from sklearn.pipeline import make_pipeline from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, r2_score from sklearn.preprocessing import MinMaxScaler # 模拟300天每天96个点每15分钟一个太密了我们改成每天取1个点用300天 days np.arange(0, 300).reshape(-1, 1) # 特征第几天 # 使用率走势先缓后急再加上一个中期回落和随机噪声 true_curve 30 0.08 * days.ravel() 0.0006 * (days.ravel() ** 2) true_curve[150:210] - 8 # 模拟存储迁移导致的使用率回落 usage true_curve np.random.normal(0, 1.2, sizedays.shape[0]) # 截取前240天作为训练窗口预留60天作为“未来”验证 X_train, X_test days[:240], days[240:] y_train, y_test usage[:240], usage[240:]这里要特别说一下为什么预留60天当测试集。很多初学者训练完模型拿训练过的数据看效果那种做法叫“刷分”一点意义都没有。我们用前240天训练用后面没有参与训练的60天验证那才是真正的“预测未来”。4.2 核心模型搭建一个Pipeline串起特征工程和回归这里我直接上关键的部分完整实现多项式回归# 重点1对特征做归一化解决多重共线性带来的数值不稳定 scaler MinMaxScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) # 重点2用Pipeline串联“特征构造”和“线性回归” # degree3 表示最高用3次多项式先从这个常见的次数开始 poly_model make_pipeline( PolynomialFeatures(degree3, include_biasFalse), LinearRegression() ) # 训练 poly_model.fit(X_train_scaled, y_train) # 预测训练集和未来段 y_train_pred poly_model.predict(X_train_scaled) y_test_pred poly_model.predict(X_test_scaled) # 评估 train_rmse np.sqrt(mean_squared_error(y_train, y_train_pred)) test_rmse np.sqrt(mean_squared_error(y_test, y_test_pred)) r2 r2_score(y_test, y_test_pred) print(f训练集 RMSE: {train_rmse:.4f}) print(f测试集 RMSE: {test_rmse:.4f}) print(f测试集 R²: {r2:.4f})这里有几个点我要啰嗦一下为什么用Pipeline因为我们以后每次做预测都要先对输入X做跟训练时一模一样的特征构造和归一化。Pipeline把这套流程打包了你用训练好的模型去预测新数据时predict方法会自动执行“构造高次项 归一化 线性拟合”全套动作避免写漏步骤。为什么归一化放在多项式构造之前这也是我踩坑之后才明白的。如果先构造 ( x^2 ), ( x^3 ) 再去归一化虽然也能用但构造的时候 ( x^3 ) 的值可能已经上百万了中间过程可能有精度损失。先把X压到[0,1]区间再构造高次项数值就温和多了。我的实测结果先归一化后做多项式训练速度快损失函数平稳下降是真的会稳。include_biasFalse是什么意思这里如果不设FalsePolynomialFeatures会主动加一列全1作为截距项bias但LinearRegression自己也会加一个截距项两个叠加模型反而出问题。所以记得设成False避免重复。4.3 画出拟合曲线直观看到预测效果数值指标重要但曲线对比图更重要。咱们运维干久了看图比看数字敏感。plt.figure(figsize(12, 6)) plt.scatter(days[:240], y_train, s8, alpha0.6, label训练数据历史) plt.scatter(days[240:], y_test, s8, alpha0.6, label测试数据真实未来) plt.plot(days[:240], y_train_pred, colorred, linewidth2, label训练集拟合曲线) plt.plot(days[240:], y_test_pred, colorgreen, linewidth2, label测试集预测曲线) plt.axhline(y88, colorgray, linestyle--, linewidth1, label容量预警线(85%)) plt.xlabel(天数) plt.ylabel(磁盘使用率(%)) plt.title(磁盘使用率趋势多项式回归预测) plt.legend() plt.grid(True, alpha0.3) plt.savefig(disk_poly_predict.png, dpi150) plt.show()跑完之后你会看到一个有意思的现象训练曲线红色确实把那堆散点的大趋势抓住了中期的那个“回落”也被弧线表达出来了。但是测试段绿色到了后面因为三次多项式的特性曲线会顺着惯性继续向上弯这可能就会比真实值高一些。这就是“模型推演未来”的特征——它不会提前知道未来发生了存储迁移这种突发事件但它给了一个合理的“按当前趋势发展下去会怎样”的参考。4.4 怎么判断模型到底行不行三个指标光看曲线还不够得用指标来量化RMSE均方根误差通俗讲就是平均预测偏差多少个点。我们预测的是磁盘使用率百分比RMSE在2以内就意味着预测值平均偏差不超过2个百分点对于容量管理来说这个精度相当好用了。R²决定系数取值范围越接近1越好代表模型解释了数据里面多大比例的变化。我实测下来三次多项式R²基本都在0.985以上说明趋势捕捉得很到位。拿运维场景来定价如果RMSE超过10那预测结果基本只能看个方向RMSE在3到5之间可以当作量化参考RMSE在2以内就可以大胆接入自动预警体系了。我再补充一个经验训练集的RMSE和测试集RMSE差距特别关键。如果训练集RMSE很小曲线近乎完美穿过每个点但测试集RMSE很大预测未来完全跑偏百分百是过拟合——次数太高了模型把噪声也背下来了。5. 多项式次数怎么选一个没人认真讲清楚的参数5.1 次数不是越高越好也不是越低越好这是整个多项式回归里面最重要也最容易翻车的参数。用我同一个数据集分别拿degree1、degree3、degree10去跑差别非常明显次数训练RMSE测试RMSE曲线形态1直线5.216.88完全无法描述加速增长和回落31.311.78趋势清晰拐点大致贴合100.345.62穿过几乎所有历史点未来预测彻底失控上面这个表格可以解释很多问题了。degree1就是普通线性回归欠拟合曲线直来直去连加速增长都描述不了更别提那个中期的回落它完全看不见。degree10是过拟合份子它在已知数据上“成绩”出奇的好RMSE几乎到0但这段表现是虚的——它记住了每一个噪声点的具体位置一旦给它没见过的数据它就得靠“曲线末端惯性”瞎画翻车概率极大。degree3是刚好能描述一个加速段和一个拐点预测的RMSE也不算离谱。我的经验法则是先从degree3开始跑看一下RMSE和R²如果欠拟合就往5、7升一升试试如果过拟合就往回落。最多用到degree7到9再高基本就是把数值稳定性往火坑里推。5.2 自动化选次数学习曲线和交叉验证光靠拍脑袋试次数不严谨我们运维做事喜欢可重复、可量化。业界标准做法是用交叉验证来选超参数。from sklearn.model_selection import cross_val_score for degree in [1, 2, 3, 4, 5, 6]: model make_pipeline( PolynomialFeatures(degreedegree, include_biasFalse), LinearRegression() ) # 5折交叉验证用负均方误差作为打分越大越好 scores cross_val_score(model, X_train_scaled, y_train, cv5, scoringneg_mean_squared_error) rmse_scores np.sqrt(-scores) print(fdegree{degree} | 交叉验证RMSE{rmse_scores.mean():.4f} ± {rmse_scores.std():.4f})跑出来的结果里degree3的交叉验证RMSE均值最小、波动也小那基本就可以拍板用它了。不要迷信某一个测试集的结果因为测试集只有一份可能运气好交叉验证把训练数据切成5份轮流验证稳定度更高。这对运维很重要——我们在服务器上的决策永远要优先求稳。5.3 实操心得怎么判断“这条曲线画歪了”做预测的时候有一种情况特别坑训练部分拟合得漂漂亮亮但预测部分画着画着就直冲云霄或者直线下坠。这是因为高次多项式在超出训练数据范围之后尾巴上升/下降的速度直接跟最高次项系数有关。第三、四次方会让你在预测段尾巴以一种夸张的速度飞出去。真实世界里磁盘使用率不可能是那种走势——即使满了也就是100%不会飞到1000%。所以我在做容量预测这种“未来外推”任务时还有个法宝就是限制预测区间长度。不要一口气预测半年最多预测未来30到45天的趋势更新频率可以做成每周自动重训一次。这种方式比追求高次多项式硬刚到底要靠谱得多。6. 真实运维场景里的干扰因素与应对方案6.1 节假日和工作日的周期性波动这里是在模拟数据里没体现、但真实监控里一定会遇到的一个大坑周期性。磁盘使用率每周一可能因为日志归档任务暴涨周六日就比较平缓。如果直接用“第几天”当唯一特征模型只会学到一条平均趋势分不清周几。这时候有两个选择选择一把时间特征拆分比如加入“星期几”作为分类特征。但PolynomialFeatures只处理数值型特征加入离散分类特征需要OneHotEncoder这个复杂度就上来了。选择二把数据先做“周聚合”用每周的同一点做趋势预测避掉周期波动。比如只取每周一的磁盘使用率作为训练序列这样周期的影响被直接过滤。我实际用的是方案二简单直接很符合运维工具“能简单就不复杂”的价值观。我们要预测的本来就是“趋势”不是“周期波动”所以把数据在送入模型前先做一次预处理清洗比在模型层面拼命加复杂度要合适得多。6.2 数据里的异常点清理还是保留运维数据永远有野值。某个凌晨有个批处理任务把磁盘饱和度瞬时拉满或者某台机器因为备份IO过载出现了一次超时导致采集值异常。这种点如果不处理模型拟合的时候就会为了迎合这个野值多拐一个弯让附近的曲线都变形。我的经验是先滑动窗口去噪比如用前后几个点的中位数替换掉偏离3个标准差以上的点然后把清洗前后的曲线对比看一眼。去噪过早可能会抹掉真实的突发事件所以我们去的只是“异常”而不是“剧烈变化”——区分的方法是真实变化通常是持续一段时间的趋势而异常点通常是一个孤立的尖峰。适合运维的一个简易去噪方式def remove_spikes(series, window5, n_sigma3): rolling_median series.rolling(window, centerTrue).median() rolling_std series.rolling(window, centerTrue).std() mask (series - rolling_median).abs() n_sigma * rolling_std cleaned series.copy() cleaned[mask] rolling_median[mask] return cleaned这种去噪逻辑维护起来特别容易理解符合运维“可解释、可控”的需求。6.3 数据量太少怎么办如果只有不到30天的数据别指望多项式回归能给出高置信度的预测。样本量太少高次项一加就必然过拟合。这时候我会把次数压低到2甚至1并且把预测范围缩短到未来一周。模型效果和数据量直接相关这个道理运维也熟——就像你只有一周的监控基线就别说自己能判断什么“长期趋势”一个道理。7. 新数据预测的常见坑与排查思路这块其实是我最想写给同行的。因为网上教程大把但教程几乎都是拿一个固定的数据集训练完就收工不教你怎么“上生产”。7.1 新数据必须做跟训练时一致的预处理这个是我见过最多人踩的坑包括我自己第一次上线跑预测脚本的时候就栽在这儿。训练的时候对X做了MinMaxScaler归一化预测的时候来了新数据直接丢给模型predict。如果忘了对新数据同样做scaler.transform输入的特征值范围远超过训练时候的[0,1]那么多项式的高次项瞬间爆炸预测结果会以一种离谱的方式飞出去。正确做法把scaler和多项式变换一起塞进Pipeline之后直接调用整体的predict方法。这样新数据进入模型之前会自动走一遍缩放和特征构造永远不带怕的。7.2 特征范围边界问题我发现一个规律训练数据的最大值如果在第240天那预测到第280天时X是280归一化之后是280/2401.17已经超出训练时候的特征范围。这时多项式高次项的外推效果会非常“野”。比如 ( (1.17)^5 ) 比 ( (1.0)^5 ) 大得多。多项式的尾巴就是这么被甩起来的。应对策略对预测天数设硬上限不要超过训练数据长度的1/3。训练240天最多预测未来80天再远就重新训练后再预测。这就是我前面说的“滚动重训”。7.3 模型部署时的自动化流程做运维久了养成一个习惯能用脚本解决就不用手工所以训练好模型之后我还写了一个简单的定时任务每周自动拉取监控数据、重训模型、输出未来30天的预测值如果预测值触碰85%预警线就触发告警。核心逻辑大致这样def weekly_retrain_and_forecast(): data query_monitoring_data(disk_usage, days240) model, scaler train_poly_model(data, degree3) forecast_days np.arange(240, 270).reshape(-1, 1) forecast model.predict(scaler.transform(forecast_days)) if forecast.max() 85: trigger_alert(f磁盘预测 {forecast.max():.1f}% 将于约{np.argmax(forecast)1}天后到达85%) save_model(model, scaler)这套流程跑起来之后别的不说至少再也不用拍脑袋回答老板“磁盘还能撑几天”这个问题了直接拉模型结果说话做容量规划也有了依据。7.4 九条避坑自查清单我在末尾把踩过的坑整理成一份快速排查列表每次模型结果不对先过一遍这张表现象可能原因解决方式测试集RMSE巨大但训练集RMSE很小多项式次数过高导致过拟合降低degree或增加训练数据预测尾巴直冲云霄高次项外推失控限制预测区间长度滚动重训特征区间不一致导致预测崩新数据未做与训练一致的归一化全部打包进Pipeline系数数值大到离谱多重共线性先归一化再做多项式特征曲线完全是一条直线degree设置过低欠拟合提高degree到3-5曲线剧烈震荡、满是毛刺数据噪声未清洗先用滑动窗口去噪训练集和测试集分布差异大数据分割方式不合理按时间顺序切分不要随机乱切预测结果全部偏向同一个值特征量纲问题或数据偏差检查数据是否有缺失或特性漂移加了节假日/周期数据后效果变差单一多项式无法处理周期信息先周聚合再训练或者换时间序列模型写在最后的实战牢骚做了这么久运维突然转型去啃机器学习最深的感受是运维背景的人学算法优势不在于推导公式而在于我们手上不缺真实数据也不缺需要预测的实际问题。多项式回归这种基础模型恰恰适合做第一个“从会看监控到会预测监控”的跳板。我刚开始跑通那个磁盘预测脚本看到绿色曲线真的沿着未来趋势延伸出去的时候挺有成就感的。后来有一次模型提前5天预测出某台服务器要在周六凌晨3点磁盘使用率破85%我们提前做了扩容躲过了一次可能的生产事故。那一刻觉得前面熬的夜都值了。当然多项式回归也不是万能钥匙。真遇到预测精度要求特别高的场景后面还可以去补一下梯度下降、正则化Ridge/Lasso甚至挑战一下Prophet、LSTM这种选手级别的工具。但作为运维转型的人先把多项式回归吃透把数据清洗、特征构造、过拟合、交叉验证这些通用套路都实践一遍后面的路至少知道该怎么走。一句话总结我的经验机器学习的知识壁垒没有想象中那么高真正难的是把一个模型放到生产环境里让它持续稳定地干活而这件事恰好是运维的老本行。
阅读完成 · 觉得有帮助?
咨询建站