数据集的划分方法

留出法

留出法:将已知数据集分成两个互斥的部分,其中一部分用来训练模型,另一部分用来测试模型,评估其误差,作为泛化误差的估计

通常,训练集:测试集=7:3(按照分层采样的方式)

交叉验证法

k折交叉验证法:将数据集D划分K个大小相似的互斥的数据子集,子集数据尽可能保证数据分布的一致性(分层采样),每次从中选取一个数据集作为测试集,其余用作训练集,可以进行k次训练和测试,得到评估均值。也叫k折交叉验证。重复p次,就是p次k折交叉验证。K的取值会影响到结果的稳定性和保真性,通常k取10。

常用于分类

实现代码

from sklearn.model_selection import train_test_split, KFold
import torch
from torch.utils.data import DataLoader, TensorDataset

# 假设我们有一些数据
X = torch.randn(1000, 20) #创建一个形状为(1000,20)的张量
y = torch.randint(0, 2, (1000,))
#创建了一个长度为1000的一维张量,
#其中每个元素都是从[0, 2)区间内随机抽取的整数。

# 留出法
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

train_dataset = TensorDataset(X_train, y_train)
test_dataset = TensorDataset(X_test, y_test)
#接受两个张量作为输入,分别表示特征数据和标签数据。
#TensorDataset对象可以将这两个张量打包在一起,方便后续的数据加载。
trainloader = DataLoader(train_dataset, batch_size=100)
testloader = DataLoader(test_dataset, batch_size=50)
#DataLoader类可以从数据集中批量抽取数据,并将其封装成一个迭代器
#,方便后续的数据加载。
# k折交叉验证
kfold = KFold(n_splits=5)
for fold, (train_index, test_index) in enumerate(kfold.split(X)):
X_train_fold = X[train_index]
y_train_fold = y[train_index]
X_test_fold = X[test_index]
y_test_fold = y[test_index]
#kfold.split(X)函数会返回两个索引数组,
#分别表示训练集和测试集中的样本索引。
train_dataset_fold = TensorDataset(X_train_fold, y_train_fold)
test_dataset_fold = TensorDataset(X_test_fold, y_test_fold)

trainloader_fold = DataLoader(train_dataset_fold, batch_size=100)
testloader_fold = DataLoader(test_dataset_fold, batch_size=50)

自助法

自助法:是一种产生样本的抽样方法,其实质是有放回的随机抽样。在给定的m个样本的数据集中随机抽取一条记录,然后将该记录放入训练集同时放回原数据集(该记录在下一次仍有可能被采到),继续下一次抽样,该操作执行m次后,就得到了所需训练集。

样本在m次不被取到的概率为$(1-\frac{1}{m})^m$,取极限得0.368,所以测试集大约占36.8%。

常用于数据集小,难以有效划分数据集时。

一般使用交叉验证法和留出法居多。

解释一下批次,批量大小以及迭代次数

批次(epoch)指的是在训练过程中,遍历整个训练集的次数。

批量大小(batch_size)指的是在每次迭代中,从训练集中抽取的样本数量。

迭代次数(iteration)是指 训练集数量/批量大小

假设批量大小为100,批次为10,训练集量为10000个样本,那么需要训练10次,每一次有100次迭代,每一次迭代包括100个样本