Chapter 3
Algorithm Evaluation Methods
Train and Test Split
# Split a dataset into a train and test set
def train_test_split(dataset,split=0.60):
train = list()
train_size = split * len(dataset) dataset_copy = list(dataset)
while len(train) < train_size:
index = randrange(len(dataset_copy))
train.append(dataset_copy.pop(index)) #移除并且返回元素的值
return train, dataset_copy
k-fold Cross-Validation Split
- 首先将数据分成k组
- 然后训练算法并评估k次
- 通过取平均表现得分来总结表现。
每组数据称为折叠,因此称为k折叠交叉验证。
工作在k-1个数据组上训练算法,并在第k个保持组上对其进行评估作为测试集。
重复此过程,以便k个组中的每一个都有机会举行并用作测试集。
应该为k选择一个值,该值会将数据分成几组,每行有足够的行组仍然代表原始数据集。一个好的默认值是k = 3.对于较大的数据集,k = 10。
如果数据集不能完全除以折叠数,则可能会有余数行,它们将不会在拆分中使用。然后,我们创建具有所需大小的行列表并将它们添加到折叠列表中,然后最后返回:
# Split a dataset into $k$ folds
def cross_validation_split(dataset, folds=3):
dataset_split = list()
dataset_copy = list(dataset)
fold_size = int(len(dataset) / folds)
for i in range(folds):
fold = list()
while len(fold) < fold_size:
index = randrange(len(dataset_copy))
fold.append(dataset_copy.pop(index))
dataset_split.append(fold)
return dataset_split
我们可以在与上述相同的小型人为数据集上测试此重采样方法。每行只有一个列值,但是我们可以想象它如何扩展到一个标准机器学习数据集。下面列出了完整的示例。和以前一样,我们将种子固定为随机数生成器,以确保每次执行代码时,相同的行用于相同的折叠。k值4用于演示目的。我们期望将10行分成4折将导致每折2行,其余2行将不会在拆分中使用。
# Example of Creating a Cross Validation Split
from random import seed
from random import randrange
# Split a dataset into k folds
def cross_validation_split(dataset, folds=3):
dataset_split = list()
dataset_copy = list(dataset)
fold_size = int(len(dataset) / folds)
for _ in range(folds):
fold = list()
while len(fold) < fold_size:
index = randrange(len(dataset_copy))
fold.append(dataset_copy.pop(index))
dataset_split.append(fold)
return dataset_split
# test cross validation split
seed(1)
dataset = [[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]]
folds = cross_validation_split(dataset, 4)
print(folds)
结果
[[[3], [2]], [[7], [1]], [[8], [9]], [[10], [6]]]