以下是一个不使用sklearn库创建K折交叉验证集的示例代码:
import numpy as np
def kfold_cross_validation(data, labels, k):
# 将数据和标签合并为一个数组
dataset = np.c_[data, labels]
# 打乱数据集
np.random.shuffle(dataset)
# 计算每个折的大小
fold_size = len(dataset) // k
# 初始化交叉验证结果列表
cv_results = []
# 分割数据集为K折
for i in range(k):
fold_start = i * fold_size
fold_end = (i + 1) * fold_size
# 获取验证集
validation_data = dataset[fold_start:fold_end, :-1]
validation_labels = dataset[fold_start:fold_end, -1]
# 获取训练集
if i == 0:
train_data = dataset[fold_end:, :-1]
train_labels = dataset[fold_end:, -1]
elif i == k - 1:
train_data = dataset[:fold_start, :-1]
train_labels = dataset[:fold_start, -1]
else:
train_data = np.concatenate((dataset[:fold_start, :-1], dataset[fold_end:, :-1]))
train_labels = np.concatenate((dataset[:fold_start, -1], dataset[fold_end:, -1]))
# 将训练集和验证集添加到交叉验证结果列表中
cv_results.append((train_data, train_labels, validation_data, validation_labels))
return cv_results
# 测试代码
data = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
labels = np.array([0, 1, 0, 1, 0])
k = 3
cv_results = kfold_cross_validation(data, labels, k)
for i, (train_data, train_labels, validation_data, validation_labels) in enumerate(cv_results):
print(f"Fold {i+1}:")
print("Training data:")
print(train_data)
print("Training labels:")
print(train_labels)
print("Validation data:")
print(validation_data)
print("Validation labels:")
print(validation_labels)
print("---------")
此代码中,kfold_cross_validation
函数接受数据集和标签作为输入,以及所需的折数k
。它首先将数据和标签合并为一个数组,并打乱数据集。然后,它根据每个折的大小将数据集分割为K个折。在每个折中,它将验证集作为当前折的数据和标签,并从其余数据中获取训练集。最后,它将训练集和验证集添加到交叉验证结果列表中,并返回该列表。
在测试代码中,我们创建了一个简单的数据集和标签,并将其传递给kfold_cross_validation
函数以进行3折交叉验证。然后,我们遍历交叉验证结果列表,并打印每个折的训练集和验证集。