如何基于不参与训练的ID实现StratifiedGroupKFold交叉验证?
解决StratifiedGroupKFold分组ID被当作特征训练的问题
完全可以放心移除X_train_df中的ID列,分组拆分不会失效——StratifiedGroupKFold的分组逻辑只依赖于fit方法传入的groups参数,和X中的特征无关。
具体修改步骤如下:
- 先从训练特征中剔除ID列,得到纯特征矩阵:
# 移除ID列,保留用于模型训练的特征 X_train_features = X_train_df.drop('ID', axis=1) - 保持分组ID列表
id_ls不变,它仅用于交叉验证的分组拆分,不参与模型训练 - 修改
GridSearchCV的fit调用,传入剔除ID后的特征矩阵:grid={'C':np.logspace(-3,3,7)} grkf_cv = StratifiedGroupKFold(n_splits=10) id_ls = X_train_df['ID'].to_list() log_reg = LogisticRegression(max_iter=100, random_state=42) logreg_cv = GridSearchCV(log_reg, grid, cv=grkf_cv, scoring='roc_auc') # 这里传入X_train_features而非原X_train_df logreg_cv.fit(X_train_features, y_train_df, groups=id_ls)
原理说明
StratifiedGroupKFold做交叉验证拆分时,只会根据groups参数里每个样本对应的分组ID来划分训练集和验证集,确保同一组的样本不会同时出现在训练和验证集中。这个过程和X中的特征完全独立,所以只要groups参数正确传递,即使X里没有ID列,拆分逻辑也能正常工作。而模型训练时用的是剔除ID后的特征矩阵,就不会把ID当作特征参与训练了。
内容的提问来源于stack exchange,提问作者Vishnu
相关产品推荐
相关产品推荐

