Python中scikit分类模型如何优先拟合时间更晚的观测数据
scikit-learn分类模型优先拟合时间更近样本的实现方法
核心实现思路是样本加权:给时间越晚的样本分配越高的训练权重,scikit-learn中绝大多数分类器都原生支持训练时传入样本权重参数,不会丢失早期数据的特征学习能力,刚好匹配你的需求。
具体实现步骤
1. 计算样本权重
首先将日期列转为时间格式,再根据时间先后为每个样本分配权重,常用两种权重计算逻辑:
- 线性加权:权重随时间线性增长,调整范围灵活
- 指数加权:时间越近的样本权重增长越快,更突出最新数据的优先级
示例代码如下:
import pandas as pd import numpy as np from sklearn.linear_model import LogisticRegression # 加载数据集 df = pd.read_csv("your_data_path.csv", sep="\s+") # 转换日期格式 df["date"] = pd.to_datetime(df["date"], format="%d/%m/%Y")
线性加权实现
# 最早日期到当前样本的天数差 df["days_since_start"] = (df["date"] - df["date"].min()).dt.days # 自定义权重范围:最低0.2,最高1,避免完全丢失早期样本信息 min_weight = 0.2 max_weight = 1.0 df["sample_weight"] = min_weight + (max_weight - min_weight) * (df["days_since_start"] / df["days_since_start"].max())
指数加权实现
# 当前样本到最晚日期的天数差 df["days_from_latest"] = (df["date"].max() - df["date"]).dt.days # decay参数控制衰减速度,数值越小越早的样本权重下降越快 decay = 0.99 df["sample_weight"] = np.power(decay, df["days_from_latest"])
2. 训练时传入权重
拆分特征和标签后,直接在fit方法中传入计算好的样本权重即可:
X = df[["f1", "f2", "f3"]] y = df["target"] weights = df["sample_weight"] # 逻辑回归训练示例,随机森林、SVM、决策树等scikit分类器调用方式一致 clf = LogisticRegression() clf.fit(X, y, sample_weight=weights)
注意事项
- 不要把早期样本的权重设为0,会丢失早期数据的有效特征,建议最低权重不低于0.1~0.2
- 交叉验证时要使用时间序列分割(如
TimeSeriesSplit),不要随机打乱数据集,避免数据泄露 - 可以用验证集调整权重参数(线性加权的上下限、指数加权的decay值),找到最优配置
其他可选方案
如果样本量足够,也可以使用滑动时间窗口训练:保留最近N个时间周期的样本作为主训练集,更早的样本作为辅助数据;或者用增量学习的方式按时间顺序喂样本,不过实现复杂度远高于样本加权,没有特殊需求优先选择样本加权方案。
内容的提问来源于stack exchange,提问作者yaron
相关产品推荐
相关产品推荐

