我有一些代码来验证一个模型,在这个模型中,我希望每年在我的数据中使用它作为支撑集.因此,我使用的是sklearn LeaveOneGroupOut:
log_loss_data = []
acc_data = []
years = np.arange(df.year.min(),df.year.max()+1)[::-1]
groups = df['year']
X = df[[__my_features__]]
y = df[__my_target__]
logo = LeaveOneGroupOut()
logo.get_n_splits(X, y, groups)
logo.get_n_splits(groups=groups)
for year, (train_index, test_index) in zip(years, logo.split(X, y, groups)):
print(f'Leaving out {year}...')
X_train, X_test = X.iloc[train_index].copy(), X.iloc[test_index].copy()
y_train, y_test = y.iloc[train_index].copy(), y.iloc[test_index].copy()
model = LGBMClassifier()
model.fit(X_train, y_train)
X_test["make_pred"] = (pd.
DataFrame(model.predict_proba(X_test),index=X_test.index,columns=[0,"pred"])[["pred"]]
)
log_loss_data.append(log_loss(y_test,X_test["pred"]))
acc_data.append(accuracy_score(y_test,np.round(X_test["pred"])))
完成后,我会列出每组的日志(log)丢失和准确性分数.上面的代码假设组的顺序是从大到小,但我不确定是否是这样.我想将我的简历分数与他们相应的组别年份联系起来,看看是否有任何年份(或几组年份/季节性)会导致不同/更差的分数.在文档中,似乎只有两种方法.get_n_splits()
和.split()
.我认为在每次简历迭代中肯定有一种方法可以访问组值...我的假设是错误的吗?
EDIT:我做了一些测试,结果表明,数字组可能按照从最小到最大的顺序进行迭代.为了验证这一点,我创建了两个不同的模型.一个使用我数据中最早的年份作为测试集,另一个使用最新的年份.这些模型的相应分数分别与第一组和最后一组cv迭代分数相匹配.虽然没有官方文件(我遇到过)证实这一点,但考虑到这个测试,我非常确信它们确实是按从最小到最大的顺序迭代的.