为 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
我有一个高度不平衡的数据集,我想按月为我的观察分配权重。
例如,如果我的观测时间是 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