【发布时间】:2021-05-29 10:08:57
【问题描述】:
我是机器学习的新手,我对 K-fold 交叉验证感到困惑。当我写一个 fold for 循环时,我应该在哪里定义 sklearn 模型(而不是 PyTorch 模型)。我看过一些教程,他们在 fold for 循环中定义模型并使用相同的模型预测 X_validation。但随后我们将在 for 循环中定义 k 不同模型,最终模型将是仅在最后一个折叠上训练的模型,它与之前的任何折叠都没有任何链接。
- 在我看来,我们应该在 Kfold 交叉验证之外定义一个 Scikitlearn 模型,如果我的想法正确,或者是否存在与此方法相关的任何数据泄漏问题,请向我解释一下?
以下是我在项目中使用的实现,这里我在 kfold for loop 中定义了 sklearn-model。
import pandas as pd
from sklearn import linear_model
from sklearn import metrics
import config
from lr_pipeline import lr_pipe
def run_training(fold):
# load a single fold here
df = pd.read_csv(config.TRAIN_FOLDS)
df_train = df[df.kfold != fold].reset_index(drop=True)
df_val = df[df.kfold == fold].reset_index(drop=True)
# get X_train, X_val, y_train and y_val
X_train = df_train.drop(['id','target_class','kfold'],axis=1)
y_train = df_train['target_class']
X_val = df_val.drop(['id','target_class','kfold'],axis=1)
y_val = df_val['target_class']
# preprocessing pipeline here
X_train = lr_pipe.fit_transform(X_train)
X_val = lr_pipe.transform(X_val)
# train clf
clf = linear_model.LogisticRegression()
clf.fit(X_train,y_train)
# metric
pred = clf.predict_proba(X_val)[:,1]
auc = metrics.roc_auc_score(y_val,pred)
print(f"fold={fold}, auc={auc}")
df_val.loc[:,"lr_pred"] = pred
return df_val[["id","kfold","target_class","lr_pred"]]
if __name__ == '__main__':
dfs = []
for i in range(5):
temp_df = run_training(i)
dfs.append(temp_df)
fin_valid_df = pd.concat(dfs)
print(fin_valid_df.shape)
fin_valid_df.to_csv(config.LR_MODEL_PRED,index=False)
【问题讨论】:
标签: python scikit-learn k-fold