You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:45:10