在pytorch中实现十折交叉验证

本文介绍了如何在PyTorch中利用sklearn库实现10折交叉验证。通过示例代码展示了如何划分训练集和验证集,并对每一折进行训练和评估,记录关键指标。同时,强调了在每一轮交叉验证中需要实例化新模型以避免数据泄露。最后,对所有折的评估结果取平均得到交叉验证的最终结果。
摘要由CSDN通过智能技术生成

本想在网上找个代码,看到大部分写的代码有点乱,有些直接自己把交叉验证代码撸了出来😄,也不知道对不对,我不敢用。然后我还是自己结合sklearn库的交叉验证接口来应用到torch中进行交叉验证。
关于各种交叉验证方式介绍可看这里:Sklearn中不同的数据抽样验证方式

下面以10折交叉验证为例,结合sklearn库。给出一个在pytorch中进行10折交叉验证的模板:

def train_():
	pass
def eval_():
	pass

import collections
history = collections.defaultdict(list) # 记录每一折的各种指标

from sklearn.model_selection import KFold, StratifiedShuffleSplit, StratifiedKFold
skf = KFold(n_splits=10,shuffle=True,random_state=42)
#skf = StratifiedShuffleSplit(n_splits=10,test_size=0.1,random_state=42)
#skf = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)

for fold, (train_idx, val_idx) in enumerate(skf.split(x,y])):
	print('**'*10,'第', fold+1, '折','ing....', '**'*10)
	# for循环得到每一折的训练索引和验证索引,就可以对数据集进行抽取了。
	# 抽取完之后,我们得到了训练数据和验证数据,那就分别转成torch的Dataset形式
	# 然后再分别加载进torch的Dataloader里即可。
	
	# 假设原数据集df存在Dataframe里,这里取出训练集和验证集
	df_train = df.iloc[train_idx]
    df_train.index = range(len(df_train)) # 重置索引
	df_val = df.iloc[val_idx]
    df_val.index = range(len(df_val)) # 重置索引
	
	# 假设我们已经得到了训练数据的loader和验证数据的loader
	train_data_loader = ~
	val_data_loader = ~
	
	# 记住:每一折都要实例化新的模型,不然模型会学到测试集的东西
	model = Model()
	for epoch in range(Epoch):
		print('——'*10, f'Epoch {epoch + 1}/{EPOCHS}', '——'*10)
		train_(model, train_data_loader,...)
	
	metrics1, metrics2, ... = eval_(model, val_data_loader,...)
	history['metrics1'].append(metrics1)
	history['metrics2'].append(metrics2)
	.
	.
	.
	剩下就是按你自己的逻辑写即可。

# 最后对每一折的结果取平均即可作为10折交叉验证的结果。
m1 = np.mean(history['metrics1'])
m2 = np.mean(history['metrics2'])
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#苦行僧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值