基因填补交叉验证

在研究缺失基因填补的项目中,导师要求对其他算法的效果进行五次五折交叉验证,每次需要将数据划分为五份,每份数据将待填补的数据集的非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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值