如何在Pandas DataFrame中基于购买间隔天数序列预测用户-产品对的下一次购买日期
预测用户-产品对的下一次购买日期:从间隔序列到最终结果
嘿,作为机器学习新手能想到用购买间隔天数序列来推导下一次购买日期,这个思路非常贴合问题场景!我来一步步帮你落地这个任务:
一、先把数据预处理做扎实
你已经拆分出days test(历史间隔序列)和target(下一个间隔),但还有几个细节要处理:
- 过滤无效样本:如果某个用户-产品对只有1次购买,根本没有间隔数据,这类样本没法用来训练模型,建议先过滤掉;后续可以单独处理这类样本(比如用产品/用户的全局平均间隔填充)。
- 清洗异常值:检查
days test里有没有负数(可能是日期排序错误)、过大的异常值(比如间隔超过365天,可能是用户流失),可以根据业务规则剔除或修正。 - 衍生额外特征:除了原始的间隔序列,你还可以加一些辅助特征提升模型效果:
- 该用户-产品对的平均购买间隔、最近3次间隔的平均值
- 用户购买该产品的总次数、首次购买距今的天数
- 产品的全局平均购买间隔(所有用户买这个产品的间隔均值)
- 用户的全局购买频率(用户买所有产品的平均间隔)
举个简单的Pandas处理代码示例:
import pandas as pd # 过滤至少有2次购买的用户-产品对 df = df.groupby(['user id', 'product id']).filter(lambda x: len(x) >= 2) # 衍生特征 df['purchase_count'] = df.groupby(['user id', 'product id'])['user id'].transform('count') df['avg_interval'] = df.groupby(['user id', 'product id'])['days test'].transform('mean') df['last_3_interval_avg'] = df.groupby(['user id', 'product id'])['days test'].rolling(3).mean().reset_index(level=0, drop=True)
二、选择适合新手的模型(从简单到复杂)
因为是序列回归预测任务,建议从简单模型开始练手,再逐步升级:
1. 基准模型(必做!用来对比效果)
先做一个最简单的基准线,比如:
- 用该用户-产品对的平均间隔作为预测值
- 用该用户-产品对的最近一次间隔作为预测值
这个基准模型的效果是你后续所有模型的参照,只有比它好,复杂模型才有意义。
2. 传统机器学习回归模型
如果你加入了前面说的衍生特征,用常规的回归模型就能很好地拟合:
- 随机森林/XGBoost回归:对非线性关系、特征交互的拟合能力强,而且不容易过拟合,新手容易上手
- 线性回归:作为入门理解回归任务的基础,适合先跑通流程
3. 时间序列专属模型
如果想专注于间隔序列本身的规律,可以试试:
- ARIMA:经典的单变量时间序列模型,适合捕捉序列的趋势和季节性,但需要先检查序列的平稳性(新手可以用
pmdarima库自动选参数) - LSTM:深度学习模型,适合长序列数据,但需要足够的数据量,新手可以等前面的模型跑通后再尝试
三、训练与验证:避免时间序列的数据泄露
时间序列的验证不能像普通回归那样随机拆分数据!一定要按时间顺序拆分:
- 对每个用户-产品对,把前80%的购买间隔作为训练集,后20%作为验证集
- 或者固定用每个用户-产品对的前n-1个间隔训练,最后一个间隔作为测试
举个随机森林的训练示例:
from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error # 准备特征和目标 X = df[['purchase_count', 'avg_interval', 'last_3_interval_avg']] y = df['target'] # 按时间顺序拆分训练/测试集(用购买日期的排名) train_mask = df.groupby(['user id', 'product id'])['date of purchase'].rank(pct=True) < 0.8 X_train, X_test = X[train_mask], X[~train_mask] y_train, y_test = y[train_mask], y[~train_mask] # 训练模型 rf_model = RandomForestRegressor(n_estimators=100, random_state=42) rf_model.fit(X_train, y_train) # 评估效果 y_pred = rf_model.predict(X_test) print(f"模型MAE(平均绝对误差):{mean_absolute_error(y_test, y_pred)}")
四、生成最终的下一次购买日期
模型训练好后,按以下步骤得到结果:
- 对每个用户-产品对,用模型预测出下一个间隔天数
- 找到该用户-产品对的最后一次购买日期
- 把最后一次购买日期加上预测的间隔天数,就是下一次购买日期
- 对于之前过滤掉的“只有1次购买”的用户-产品对,可以用:
- 该产品所有用户的平均购买间隔
- 该用户购买所有产品的平均间隔
来生成预测日期,或者标记为“无法预测”
五、后续优化方向
等你跑通基础流程后,可以试试这些进阶操作:
- 加入时间特征:比如购买日期的月份、季度,捕捉季节性购买规律
- 先做流失预测:先训练一个分类模型,预测用户是否会继续购买该产品,只对“会购买”的用户做间隔预测
- 尝试序列到序列模型:比如用LSTM直接输入历史间隔序列,输出下一个间隔
内容的提问来源于stack exchange,提问作者Masih mir
相关产品推荐
相关产品推荐

