我们在写文章时,总是怕自己结果不能得到足够的可信度,及时设定了seed但也经常复现失败,于是我们会采用交叉验证的方法,是自己的结果可信度更高,一般以5折十折居多,这篇文章主要介绍实现的方法,以图像处理、信号识别等深度学习为基础背景进行介绍。
首先,像之前一样,读取出训练集,测试集并进行预处理(按自己的项目)
之后,融合训练集、测试集,以便后续重新划分,进行交叉验证。
X = np.append(train_set.X,test_set.X,axis=0) # 训练集和测试集拼接起来
y = np.append(train_set.y,test_set.y,axis=0) # 标签拼接
在之后采用指标寻址的方式,只需划分指标位置,即可。
i = 1
KF = KFold(n_splits=6, shuffle=True, random_state=100)
for train_index, test_index in KF.split(dataset.X):
np.save("F:/脑电信号分类所用资料/SSVEP/SSVEP_Classify/k_fold_index/subject_{}/train_index_{}".format(subject_id, i), train_index)
np.save("F:/脑电信号分类所用资料/SSVEP/SSVEP_Classify/k_fold_index/subject_{}/test_index_{}".format(subject_id, i), test_index)
i=i+1
这是6折的例子,shuffle代表是否打乱数据进行划分,random_state是用于复现划分的,类似于seed
之后循环保存到指定位置(程序段是一个例子,采用时按照自己的项目地址更改)
划分结束后,为检查是否划分完成或者划分是否正确,可以进行读取。
index = [1, 2, 3, 4, 5, 6]
for i in index:
print('*' * 25, '第', i, '折', '*' * 25)
train_index = np.load("F:/脑电信号分类所用资料/SSVEP/SSVEP_Classify/k_fold_index/subject_{}/train_index_{}.npy".format(subject_id, i))
test_index = np.load("F:/脑电信号分类所用资料/SSVEP/SSVEP_Classify/k_fold_index/subject_{}/test_index_{}.npy".format(subject_id, i))
print("train_index:{},test_index:{}".format(train_index, test_index))
之后,进行按刚才划分的指标分配数据
train_set_X = dataset.X[train_index] # 训练集
train_set_y = dataset.y[train_index] # 测试集
test_set_X = dataset.X[test_index] # 训练集label
test_set_y = dataset.y[test_index] # 测试集label
后续工作设定在以循环形式进行的,比如我是6折,那就设为
index = [1, 2, 3, 4, 5, 6]
for i in index:
之后进行和之前未使用交叉验证时一样的运行工作