为 ML 模型的最近一个月的观察分配更高的权重

Assigning higher weigth to recent month observations for ML model

我有一个高度不平衡的数据集,我想按月为我的观察分配权重。
例如,如果我的观测时间是 2022 年 1 月,我会给出 1/5,如果是 2022 年 3 月,我会给出 1/3 等等。

feature_1    date     weights
117       2016-11-12   0.015
...          ...        ...
123       2022-01-01    0.2
234       2022-01-02    0.2
...          ...  
345       2022-05-31    1.0


我正在使用 CatboostClassifier,我想我可以将所有数据的权重列表传递给 weight 参数。所以它看起来像这样

model.fit(Pool(X_train,y_train,weight=train_weight))

问题是我想不出形成权重的优雅解决方案column/list
现在,我按月频率拆分我的数据框:

g = X_train.groupby(pd.Grouper(key='date', freq='M'))
dfs = [group for _,group in g]

并制作了这样的权重列:

for i, df in enumerate(dfs):
    weight = []
    for val in dfs[i].iterrows():
        weight.append(1 / (len(dfs)+2 - i))
    dfs[i]['weight'] = weight

给定以下玩具数据框:

from datetime import datetime

import pandas as pd

df = pd.DataFrame(
    {
        "feature_1": [117, 123, 234, 345],
        "date": ["2016-11-12", "2022-01-01", "2022-01-02", "2022-05-31"],
    }
)

df["date"] = pd.to_datetime(df["date"])

定义一个辅助函数来计算权重:

def weight(current_date, previous_date):
    try:
        wgt = round(
            1
            / (
                (current_date.year - previous_date.year) * 12
                + current_date.month
                - previous_date.month
            ),
            3,
        )
    except ZeroDivisionError:
        wgt = 1
    return wgt

因此,假设最近的日期是 2022 年 5 月 31 日:

df["weight"] = df["date"].apply(lambda x: weight(datetime(2022, 5, 31), x))

print(df)
# Output
   feature_1       date  weight
0        117 2016-11-12   0.015
1        123 2022-01-01   0.250
2        234 2022-01-02   0.250
3        345 2022-05-31   1.000