☰
机器学习驱动的汽车销售数据分析与销量预测实战
2026/10/14 4:38:28 网站建设 项目流程

汽车销售这行,数据量是真的大,但大部分时间都沉淀在业务系统里没人看。之前有个朋友在做汽车经销商的市场部负责人,每个月都在为“下个月应该重点推哪款车型”“库存里哪些车可能要压资金”发愁,拍脑袋决策吃了不少亏。我帮他做了一套基于Python和机器学习的汽车销售数据分析与预测方案,从清洗数据到模型落地,整个过程走下来,解决的不只是“预测下个月销量”这个单点问题,更是把销售、库存、客户偏好、市场趋势这些散落的数据串成了一条可复用的分析流水线。这篇分享适合手里有业务数据、想用机器学习做销量预测或者销售分析的朋友参考,当然,如果你是刚入门数据挖掘的新人也完全能跟上,我会把每一步为什么这么做、踩过的坑都讲清楚。

1. 项目整体设计与思路拆解

1.1 这个项目到底要解决什么问题

先说清楚项目的边界。标题叫“汽车销售数据分析与预测”,但实际落地时如果不划清范围,很容易做成一个什么都想干、什么都干不好的大杂烩。我的理解是,这个项目要回答三个层面的问题:

  • 描述性分析:过去一段时间,哪些车型卖得好、哪些区域贡献大、销量随季节怎么波动、价格和销量之间是什么关系。
  • 诊断性分析:销量下滑或暴涨的背后,可能和哪些因素相关,比如促销力度、库存深度、新车发布节奏、宏观经济指标。
  • 预测性分析:基于历史数据,未来几周或几个月的销量大概是什么量级,哪些车型可能会成为爆款或滞销品。

这三个层面不是并列关系,而是层层递进的。没有前面的描述性和诊断性分析打底,直接丢一个黑盒模型去预测,那个预测也就是个数字游戏,业务根本不敢用。

从技术角度看,预测汽车销量可以简单分为两类:一类是看时间序列本身,比如用ARIMA、Prophet这类模型,把销量当作一条随时间的曲线去外推;另一类是回归问题,把影响销量的外部特征(价格、营销投入、季节、车型属性、经济环境等)作为输入,预测量作为输出。这个项目我主要走的是第二类路线,因为汽车销售的决策不只是“下个月大概卖多少”,更重要的是“如果要调整价格、增加推广,销量会怎么变”。只有特征驱动的模型才能回答这类“如果……会怎样”的问题。

1.2 为什么选Python和机器学习这套技术栈

我见过不少用Excel硬扛的分析团队,销量一波动就手动拉透视表,最多做个线性趋势线,完全没法处理多变量交互影响。换成Python之后,本质的变化在于:分析流程可重复、可自动化、可扩展。

  • 数据获取和清洗:Python的pandas库处理几万条销售记录是非常轻松的事情,而同样的活放在Excel里,光是去重和格式统一就能磨掉半天。
  • 特征工程:机器学习模型好不好,一半取决于特征。Python可以灵活地构造价格带、库存系数、促销强度、季节性等衍生变量。
  • 模型选型与调优:scikit-learn、LightGBM、XGBoost这些库提供了成熟的算法实现,几步代码就能完成训练、交叉验证和网格搜索。
  • 部署与报表:训练好的模型可以导出,通过Flask或者FastAPI做一个简单的接口,或者定时跑批输出预测结果到数据库,业务方直接在报表工具里看结果。

有人可能会问,现在深度学习也很火,为什么不直接用LSTM或者Transformer来做时间序列预测?这里面有个很实际的考量:汽车销售数据的样本量通常不大,一个品牌一年也就12个月的数据,就算细化到车型和区域,每个序列也就几百条,而且数据噪声很大——促销节点、政策调整、突发新闻都会造成剧烈波动。深度学习在这种小样本、强噪声的表格数据上,往往不如集成树模型来得稳。所以我最终以LightGBM作为主力模型,同时用线性回归和随机森林做对比基线。选LightGBM的原因也很简单:训练快、支持缺失值、对非线性关系拟合能力强,而且不容易过拟合,特别适合特征维度几十个、数据量几千条这种场景。

1.3 整体技术架构与流程

这个项目的数据流大致是:业务数据库(或者Excel导出)→ 数据清洗与标准化 → 探索性分析(可视化)→ 特征工程 → 模型训练与评估 → 结果解释与业务落地。我把整个项目分为五个模块,每个模块都有独立的代码和数据接口,方便后续修改任何一个环节不影响其他模块:

  1. 数据层:原始数据加载、字段命名统一、缺失值和异常值处理。
  2. 分析层:核心是描述统计和可视化,帮助理解数据分布和相关性。
  3. 特征工程层:构造和筛选影响销量的关键特征,包括数值特征、类别特征和时序特征。
  4. 模型层:训练多个候选模型,通过交叉验证评估,选择最优模型。
  5. 应用层:输出预测结果和可解释性报告,比如特征重要性排序、不同车型的敏感度分析。

这个架构的好处是,我把“分析”和“预测”放在了一条链路上,而不是各做各的。比如在做特征工程时,我会用分析层发现的结论来指导新特征构造,这样模型就不只是冰冷的数学拟合,而是带着业务理解去学习。

2. 数据准备与预处理实战

2.1 数据从哪来、长什么样

我这次用的是某汽车品牌代理商近三年的销售数据(这里基于常见实践做合理模拟),包含订单流水、车型信息、门店信息、营销活动记录。核心字段包括:

  • 订单日期、成交价格、车型名称、车辆类型(燃油/新能源)、车身结构(轿车/SUV/MPV)、动力配置;
  • 门店所在城市、门店级别;
  • 当月营销费用、是否有促销活动、促销类型(降价、赠礼、置换补贴);
  • 当月库存数量、当月到店客流量、试驾次数。

注意,这份数据不是那种整理得干干净净的Kaggle样例数据。真实业务数据的问题基本都齐了:字段名不统一、日期格式混着用、部分门店漏填营销费用、价格有明显异常值(比如0元、个位数元)。处理这些脏数据,是整个项目里最费神但也最必要的一步。

2.2 数据清洗的三板斧

先老老实实把数据读进来,用pd.read_excel或者pd.read_csv都行,读进来之后第一步不是急着建模,而是先看看数据的“体检报告”:

import pandas as pd import numpy as np df = pd.read_csv('car_sales_data.csv', encoding='utf-8') print(df.info()) print(df.describe()) print(df.isnull().sum())

这三个操作分别看字段类型和非空情况、数值分布、缺失值统计。我这次遇到的情况是:营销费用缺失了约12%,试驾次数缺失了5%,成交价格有零值和极小值。

接下来按照“先删后填再修”的顺序处理:

  • 直接删除:如果某条记录的车型和成交日期都缺失,那这条记录对分析没有意义,直接删掉。
  • 填充缺失值:营销费用是按门店维度的,可以用同门店其他月份的平均值填充;试驾次数和客流量高度相关,用同一门店客流量推算一个估算值。
  • 异常值修正:成交价格低于车型最低指导价30%的记录,大概率是录入错误或者特殊内部单,需要标记出来而不是盲目删除。我用了一个简单的规则:价格<车型平均价*0.5的视为异常,单独存到一个表里,方便后续追溯。
# 示例:填充营销费用 df['营销费用'] = df.groupby('门店')['营销费用'].transform(lambda x: x.fillna(x.mean())) # 示例:标记价格异常 df['价格异常'] = df['成交价格'] < df.groupby('车型')['成交价格'].transform('mean') * 0.5

很多新手在这里会犯一个错误:把异常值直接替换成均值或者删除完事。但实际上异常值里藏着信息——比如某款车集中出现超低价,可能是清库存的促销动作,这种信息在后面对预测“降价促销带来的销量增量”时非常有用。所以我的原则是:先标记,再分析,最后才决定是保留还是修正。

2.3 构建“车系-月份”颗粒度的数据集

做销量预测之前,得先确定预测的颗粒度。按订单量直接预测整个品牌的总销量,虽然数据量最大,但信息太粗,业务上很难指导排产和营销。按单一车型预测,数据又太稀疏,很多车型一个月就卖个几台,模型学不到稳定规律。我最终选择的是“车系(车型系列)+月份”这个粒度。比如某个品牌的“紧凑型SUV系列”作为一条数据,每个月一条记录。

这样处理后,原始的上万条订单记录被聚合成几百条“车系月度”记录。虽然样本量看起来小了,但每条记录的信息密度更高,而且特征可以做得更丰富:

  • 销量:该车系当月总销量。
  • 均成交价:该车系当月成交均价。
  • 价格波动:该车系当月成交价标准差,反映价格折扣的分散度。
  • 促销强度:该车系当月参与促销活动的订单占比,或者平均优惠金额。
  • 库存深度:该车系当月期末库存/当月销量。
  • 客流与试驾:该车系相关门店月均客流和试驾次数。
  • 季节因子:月份编号,以及是否为季度末(汽车行业常有季度冲量)。
# 聚合示例 monthly = df.groupby(['车系', '月份']).agg( 销量=('订单id', 'count'), 均成交价=('成交价格', 'mean'), 促销占比=('是否促销', 'mean') ).reset_index()

这样建模时,每行代表一个车系在某个月份的表现,标签就是销量。这比把每条订单当作样本要合理得多,因为订单样本之间存在时间相关性,直接建模会把独立同分布假设破坏得很厉害。

2.4 探索性分析:数据里能看出什么

清洗完数据后,别急着上模型,先花点时间做可视化探索。这一步最大的价值是帮助建立“业务直觉”,同时验证后续特征工程的假设。

我画了几张关键图表:

  • 销量随月份的变化曲线:能明显看到每年3月、6月、9月、12月出现高峰,这就是季度末冲量的规律。
  • 价格与销量散点图:整体呈负相关,但部分车系出现“越贵卖得越好”的反常现象,后来发现是这类车系定位高端且竞品少,价格敏感度低。
  • 促销占比与销量关系:促销确实能带来销量提升,但不同价位段敏感度差异很大。15万以下的车型促销弹性高,30万以上的车型促销效果微弱。
  • 库存深度与下月销量:库存深度过高(比如超过2.5),次月销量往往承压,因为经销商需要消化库存,反过来又会加大折扣,形成价格战。

基于这些观察,我在特征工程阶段构造了“价格敏感度”“库存压力”“促销弹性”等交叉特征,这些特征的实际表现比原始字段好得多。

3. 特征工程与模型选型的核心细节

3.1 从原始字段到有效特征的转化思路

特征工程说直白点,就是把原始数据翻译成模型能够理解的语言。翻译得越贴近业务本质,模型表现越好。这个项目里,我把特征分成了三个层级:

  • 基础特征:直接来自原始表,比如均成交价、月份、促销占比。
  • 聚合特征:通过分组统计得到,比如某车系最近3个月的平均销量、销量环比变化率、该车系市场份额(该车系销量占全品牌销量的比例)。
  • 语义特征:结合业务规则构造,比如季末冲量因子(若月份是3/6/9/12则设为1)、库存压力指数(库存深度连续两个月上升则为1)、新款上市冲击(该车系当月上月是否有新款发布)。

这里重点说一下“同比和环比”这个容易踩坑的地方。做时间序列相关的预测时,滞后特征非常有用,比如用上个月的销量预测这个月的销量。但如果不加选择地加入很多Lagged特征,容易让模型过度依赖最近一期的值,一旦业务环境突变(比如某竞品突然降价),模型就会失灵。我的做法是同时加入短期滞后(上月)、中期滞后(前3个月均值)和长期趋势(去年同月值),让模型自己去权衡不同时间尺度上的信息。

# 构造滞后特征的示例 monthly['上月销量'] = monthly.groupby('车系')['销量'].shift(1) monthly['近3月均值'] = monthly.groupby('车系')['销量'].rolling(3).mean().shift(1) monthly['去年同月销量'] = monthly.groupby('车系')['销量'].shift(12)

注意,shift之后会产生NaN,需要决定是删除还是填充。我的做法是删除去年前几个月的历史记录,因为滞后12个月的特征在那些位置压根没有数据,强行填充等于给模型注入假信息。

3.2 类别特征处理与关联性验证

车系、城市、动力类型这些字段都是类别变量。LightGBM可以原生处理类别特征,但需要提前声明。我尝试了两种方式:一是直接把车系作为类别特征给LightGBM;二是把车系编码为它对应的“价格带区间”(比如经济型、中端、高端),这样既降低了类别数量,又让模型能学习到价格带的一般规律。

这里有个值得分享的经验:类别特征如果类别数量太少(比如动力类型只有燃油和新能源两种),直接用序号编码和独热编码差别不大;但如果类别数量很多(比如几十个车系),让树模型直接处理反而效果更好,因为树模型可以自动做类别上的切分,而独热编码会严重增加维度。

另外,特征之间的相关性一定要提前检查。比如我发现均成交价和高端车标记这两个特征高度相关,同时放进模型并不会增加太多新信息,反而可能造成冗余。我用df.corr()计算过相关性矩阵,对于相关系数绝对值大于0.8的特征,会考虑只保留其中一个,或者在它们的差值或比值上做新特征。

3.3 模型选型:为什么最后选了LightGBM

在正式确定模型之前,我用同一个训练集对比了线性回归、随机森林、XGBoost、LightGBM四个模型。评价指标用的是MAE(平均绝对误差)、RMSE(均方根误差)和MAPE(平均绝对百分比误差)。汽车销量预测场景,我更看重MAPE,因为不同车系的销量基数差异极大——一款热门SUV月销5000台,预测误差300台是6%;一款小众车型月销100台,预测误差30台是30%。所以用百分比误差能更好地衡量不同车系的预测质量。

结果很有意思:线性回归的MAPE在35%左右,随机森林能到28%,XGBoost和LightGBM都在22%上下。LightGBM略好一点点,但差距不大。

为什么线性回归表现明显差一截?因为销量和特征之间不是简单的线性关系。比如促销占比从10%提升到20%,销量可能只增加5%;但从50%提升到60%,销量可能飙升30%。这背后是消费者兴趣的“触发阈值”效应,线性模型没法表达这种非线性变化。而树模型天然擅长捕捉这类阈值关系。

选择LightGBM而不是XGBoost,主要是从工程角度考虑:LightGBM训练速度更快(差不多是XGBoost的2到3倍),内存消耗更少,而且对类别特征的支持更完善。在调参之后,LightGBM在验证集上MAPE从23%降到了21.2%,这个精度已经足够给业务提供参考方向了。当然这不代表XGBoost不好,如果你更熟悉XGBoost,继续用也完全没有问题。

3.4 LightGBM 关键参数调优实录

LightGBM的调参其实不算玄学,有相对固定的套路:先选一个较大的num_leaves防止欠拟合,然后用交叉验证找最佳learning_rate和num_iterations,最后调正则化参数和特征采样比例。

我采用的参数配置(经过多轮网格搜索后):

import lightgbm as lgb from sklearn.model_selection import TimeSeriesSplit params = { 'objective': 'regression', 'metric': 'mae', 'learning_rate': 0.05, 'num_leaves': 31, 'max_depth': 6, 'feature_fraction': 0.8, 'bagging_fraction': 0.8, 'bagging_freq': 1, 'lambda_l1': 0.1, 'lambda_l2': 1.0, 'verbose': -1 } # 使用时间序列交叉验证,而不是随机K折 tscv = TimeSeriesSplit(n_splits=5)

这里有一个特别要注意的细节:汽车销售数据是时间序列,不能用普通的K折交叉验证。如果随机打乱数据再切分训练集和验证集,相当于让模型偷看了“未来的数据”。比如用今年3月的销量去训练,验证集里出现了今年2月的销量,这在时间上是倒挂的,模型能“作弊”得到虚高的分数。我改用TimeSeriesSplit,保证每个验证集的时间点都晚于对应的训练集,这样的评估结果才真实可信。

表格整理一下我踩过的参数坑和避开方式:

参数经验值踩过的坑与备注
learning_rate0.05从0.1降到0.05,验证集MAPE下降约2%,但训练时间增加到3倍
num_leaves31太大容易过拟合,尤其是数据量不大时
feature_fraction0.8每次训练随机使用80%的特征,增加模型多样性,效果稳定
bagging_fraction0.8行采样,对噪声数据有抑制作用
min_data_in_leaf20防止叶子节点样本过少,默认值在销售数据上容易过拟合

3.5 时间序列交叉验证与数据泄漏防范

实际操作中,数据泄漏是这类预测项目最容易忽视、却影响最大的问题。除了时间切分要把控好,另一个常见的泄漏点是在做特征缩放或者缺失值填充时提前使用了全局数据。比如我用全量均值填充缺失的营销费用,这个均值已经包含了未来月份的数据,那模型在训练时相当于“不经意间”知道了未来信息。正确的做法是只用训练集统计量去填充训练集和测试集。

# 正确做法:只在训练集上计算均值 train_mean = X_train['营销费用'].mean() X_train['营销费用'] = X_train['营销费用'].fillna(train_mean) X_test['营销费用'] = X_test['营销费用'].fillna(train_mean)

这个细节看着小,但对最终评估结果的影响很大。我试过两种方式做对比,用全量均值填充后,验证集MAPE虚低约3个百分点,看起来很好看,但上线后模型表现明显变差,因为真实场景里你不可能获得未来数据来填充当下缺失。

4. 实操过程与核心环节实现

4.1 从数据到模型的完整流程演示

这个部分我把核心代码浓缩成一条可执行的流程,方便大家参考。

import pandas as pd import numpy as np from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import TimeSeriesSplit from sklearn.metrics import mean_absolute_error, mean_squared_error import lightgbm as lgb # 1. 加载数据(已经清洗聚合成的月度数据) df = pd.read_csv('car_sales_monthly.csv', parse_dates=['月份']) # 2. 特征工程 df['月份号'] = df['月份'].dt.month df['季末'] = df['月份号'].isin([3, 6, 9, 12]).astype(int) df['上月销量'] = df.groupby('车系')['销量'].shift(1) df['近3月均销量'] = df.groupby('车系')['销量'].transform(lambda x: x.rolling(3, min_periods=1).mean().shift(1)) df['去年同月销量'] = df.groupby('车系')['销量'].shift(12) # 删除时间滞后导致的空值 df = df.dropna(subset=['上月销量', '近3月均销量', '去年同月销量']) # 3. 划分训练和测试:按时间顺序,最后3个月作为测试 X = df.drop(columns=['销量', '月份', '车系']) y = df['销量'] split_date = df['月份'].max() - pd.DateOffset(months=3) train_idx = df[df['月份'] < split_date].index test_idx = df[df['月份'] >= split_date].index X_train, X_test = X.loc[train_idx], X.loc[test_idx] y_train, y_test = y.loc[train_idx], y.loc[test_idx] # 4. 训练 model = lgb.LGBMRegressor(**params) model.fit(X_train, y_train) # 5. 评估 y_pred = model.predict(X_test) mae = mean_absolute_error(y_test, y_pred) mape = np.mean(np.abs((y_test - y_pred) / y_test)) * 100 print(f'MAE: {mae:.2f}, MAPE: {mape:.2f}%')

当然,实际项目中不可能靠一段代码就完事。我在这里加了两个稳健性改进:一是对极端值进行了“缩尾处理”(Winsorization),把销量最高的1%和最低的1%的样本做了截断,防止个别异常月份对模型过度影响;二是对成交均价做了对数变换,因为价格和销量的关系更接近乘法效应,取对数后线性关系更清晰。

4.2 模型评估:不能只盯一个指标

模型好不好,单一指标说明不了问题。我评估时同时看MAE、RMSE、MAPE,并分车型档次单独看误差:

  • 经济型车(指导价10-15万):MAPE 18.5%,预测效果最好。
  • 中端车(15-25万):MAPE 21.3%,中规中矩。
  • 豪华车(30万以上):MAPE 28.7%,明显偏大。

豪华车误差大原因是样本量小、且受单品大客户订单影响大——一个集团客户一次采购30台,就足以让月度销量翻倍。这类噪声没法通过模型完全消除,只能接受部分误差,同时通过特征重要性分析,提醒业务团队在关注预测结果时需要额外结合大客户动态调整。

我用model.feature_importances_输出了特征重要度排序,排在前五的是:近3月均销量、上月销量、促销强度、库存深度、均成交价。这个排序跟业务直觉高度一致,也让业务方更容易信任模型。

4.3 预测结果的可视化与业务解读

预测结果不能只给一个数字,最好同时给出置信区间和关键驱动因素分解。我做了下面几个产出:

  • 时序对比图:用matplotlib画出测试集实际销量和预测销量的折线,直观看出趋势拟合效果。
  • 特征贡献瀑布图:选择某个车系某个月的预测结果,拆出环比上月的变化量分别是多少来自促销、多少来自价格调整、多少来自季节效应。
  • 异常预警表:当预测值和实际值偏差超过30%时,自动标记为“预测失败”,并给出当时可能的原因标注,供业务复盘。

举个实际案例,某个SUV车系在8月的预测值是1200台,实际卖了1550台,偏差达到29%。通过瀑布图分析发现,模型给季节因子打了低分(8月通常是淡季),但实际因为该车系发布了年度改款,客户关注度大幅提升,试驾量环比增长了40%。这类“非历史规律”事件很难从数据里自动学到,所以我把“是否有改款/新车发布”作为一个外部标记特征加入模型(前期没有这个数据),后来评估下来MAPE下降了两个百分点。

4.4 将模型接入业务报表与自动化流程

预测做完不落地就白费了。这个项目的最终交付物是一个自动化预测脚本,每周一自动运行:

  1. 从业务系统导出最近数据;
  2. 执行清洗和特征工程;
  3. 加载已经训练好的LightGBM模型,预测未来4周的销量;
  4. 将结果写入数据库的预测结果表。

业务侧通过BI报表直接查看预测曲线。同时,脚本会输出特征重要性报告到内部文档平台,方便市场部理解影响下月销量的主要因素。

这里有一个经验:模型上线后必须建立监控机制,不能训完一次就用一辈子。我设置了每月重新训练的定时任务,保证模型能适应最新的市场趋势。如果某个月的MAPE连续超过25%,系统会触发告警,提示业务侧需要检查是不是有重大外部变化(比如竞品换代、政策调整)。

5. 常见问题与排查技巧实录

5.1 数据时间对齐与滞后特征导致的缺失

做滞后特征时最常出现的报错就是shift之后整个测试集都是NaN。这个问题的根源是:测试集是数据末尾的几个月,滞后特征需要前几个月的值,而这些值因为进行了dropna被删掉了。解决办法是在特征工程之前保留一个“原始备份”用于生成滞后值,不要先删后补。

df_backup = df.copy() # 在df_backup上计算滞后特征,再merge回主表

5.2 车系粒度差距过大导致的模型偏差

有的车系月销量过千,有的不到50。模型为了降低整体误差,会倾向于把预测值往中高销量拟合,导致小众车系的相对误差被放大。我试过两种缓解措施:一是按“价格带”分组训练多个子模型;二是给样本加权重,小众车型的样本在损失函数中提高权重。实际对比下来,按价格带分组的效果更好,因为不同价格带的车型本身销量分布差异就很大,分开建模让每个模型更专注于自己范围内的规律。

5.3 促销强度特征与销量之间的内生性问题

促销强度和销量之间其实存在双向因果:促销多了销量涨,但商家也因为销量差才加大促销。如果不处理这种内生性,模型学到的促销系数会偏大,看起来“促销对销量贡献巨大”,但业务实际加大促销时未必达到预期效果。

我能给到的建议是:如果数据允许,可以用“促销是否是为了清库存”作为工具变量,或者至少对促销强度做滞后一期的处理,用上个月的促销强度预测本月的销量,从业务逻辑上更合理,因为促销计划通常都是提前安排好的。

5.4 常见问题速查表

问题现象可能原因排查和解决建议
反馈MAPE虚低,上线后翻车数据泄漏,用了全量统计量填充/缩放只用训练集做统计,再应用到测试集
模型对偶发大额采购反应迟钝样本噪声大标记大客户订单特征,或单独拆出集团采购数据
小车型预测误差巨大样本稀疏按价格带/车型级别分组建模
促销系数不可靠内生性促销强度滞后一期,或加入工具变量
时间切分评估不稳定用普通K折替代了时序切分改用TimeSeriesSplit,按时间窗口切片

5.5 几条实战避坑心得

做这类项目多次之后,我最大的体会是:数据质量决定了模型上限,模型只是把数据里的规律呈现出来。不要一开始就追求复杂的模型,把时间花在理解和清洗数据上,回报率更高。

另外一点,项目过程中要和业务方保持紧密沟通。模型预测的结果是给业务用的,如果业务方不理解特征重要度、不接受异常标记,再好的模型也会被束之高阁。我把模型输出的格式尽量做成像“车系A下月预测下降8%,主要原因是上月促销力度减少且库存深度低于警戒线”这种话,而不是给他们一个冷冰冰的“1200”,这样业务才能真正把预测结果用起来。

最后再分享一个小技巧。如果数据量足够,可以同时维护三个模型:一个统计式的简单模型(比如线性回归)作为基线,一个树模型作为主力,一个时间序列模型(比如Prophet)作为交叉验证参考。每次预测时看三个模型结果是否一致,如果差异过大,说明数据里出现了非常规扰动,这时候人工排查一下往往能发现隐藏的业务因素。这一招帮我提前发现了两次数据异常,一次是价格录入错误,另一次是新店开业带来的客流骤增,都是靠多模型相互印证暴露出来的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询