在研究缺失基因填补的项目中,导师要求对其他算法的效果进行五次五折交叉验证,每次需要将数据划分为五份,每份数据将待填补的数据集的非0部分随机掩五分之一,生成五份数据作为训练集输入算法,与输出结果的掩码部分进行评估。
import numpy as np
import pandas as pd
from sklearn.model_selection import KFold
seed=[np.random.RandomState(123),np.random.RandomState(456),np.random.RandomState(135),np.random.RandomState(666),np.random.RandomState(777)]
data = pd.read_csv('G:/split_data/1/Usoskin.csv')
a=np.where(data>0)#取非0索引,结果包含两个array,一个行位置,一个列位置
index=np.array(list(zip(a[0],a[1])))#行列array组合,生成非0数据的索引
for i in range(5):#五次
kf = KFold(n_splits=5,shuffle=True,random_state=seed[i])#
j=1
for train_index , test_index in kf.split(index):#对非0索引五折划分
print('train_index:%s , test_index: %s ' %(train_index,test_index))
print(len(test_index),len(train_index))
idx=index[test_index,:]
data=np.array(data)
data[idx[:,0],idx[:,1]]=0#对掩码部分标0
save_index=np.zeros((255,1000))#生成与基因矩阵同大小的掩码矩阵
save_index[idx[:,0],idx[:,1]]=True#对掩码部分标记
save_index=pd.DataFrame(save_index)#保存
data=pd.DataFrame(data)
data.to_csv('G://split_data/{}/fold{}.csv'.format(i+1,j),index=False,header=False)
save_index.to_csv('G://split_data/{}/fold_mask{}.csv'.format(i+1,j),index=False,header=False)
j+=1
结果生成五个文件夹,每个文件夹包括五个掩码矩阵和五个掩码后的数据,将掩码后的数据输入的不同算法,将输出结果的掩码位置取出,与源数据掩码位置比较,算出MSE、MAE、NMSE
import numpy as np
import pandas as pd
import os
from sklearn.metrics import mean_squared_error,mean_absolute_error
import magic
raw_data = pd.read_csv('G:/split_data/1/Usoskin.csv')#数据集
MSE_list = [];MAE_list = [];NMSE_list = []
with open('Usoskin_Magic_record.txt','w') as f:#txt文件记录
f.write('Usoskin数据集输入Magic\n')
for i in range(1, 6):
os.chdir('G://split_data/{}/'.format(i))
MSE = 0
MAE = 0
NMSE = 0
for j in range(1, 6):
mask = pd.read_csv('fold_mask{}.csv'.format(j), header=None)
mask=(mask==1)#生成布尔矩阵,可直接索引
array1=raw_data.values[mask.values]#取出原矩阵掩码位置数据,生成一个行array
train_data = pd.read_csv('fold{}.csv'.format(j), header=None)
magic_operator = magic.MAGIC()
result_data = magic_operator.fit_transform(train_data)#训练
array2=result_data.values[mask.values]#输出矩阵掩码位置数据
mse=mean_squared_error(array1,array2)
mae=mean_absolute_error(array1,array2)
nmse= np.linalg.norm(array1-array2)/np.linalg.norm(array1)
f.write('第{}次第{}折数据训练后的MSE:{}\tMAE:{}\tNMSE:{}\n'.format(i,j,mse,mae,nmse))
print('第{}次第{}折数据训练后的MSE:{} MAE:{} NMSE:{}'.format(i,j,mse,mae,nmse))
MSE += mse
MAE += mae
NMSE += nmse
MSE /= 5;MAE /= 5;NMSE /=5
MSE_list.append(MSE)
MAE_list.append(MAE)
NMSE_list.append(nmse)
print('MSE={}'.format(np.mean(MSE_list)))
print('MAE={}'.format(np.mean(MAE_list)))
print('NMSE={}'.format(np.mean(NMSE_list)))
f.write('MSE:{}\tMAE:{}\tNMSE:{}'.format(np.mean(MSE_list),np.mean(MAE_list),np.mean(NMSE_list)))
f.close()