学习日记-1

最近在学校学习DNA甲基化和深度学习的知识论文github地址,学习深度学习的时候发现机器学习许多知识都有很多遗忘,写这个系列文章主要为了留一个笔记。

前言

DNA甲基化(DNA methylation)为DNA化学修饰的一种形式,能够在不改变DNA序列的前提下,改变遗传表现。所谓DNA甲基化是指在DNA甲基化转移酶的作用下,在基因组CpG二核苷酸的胞嘧啶5号碳位共价键结合一个甲基基团。简单来说就是在CpG位点中的C碱基上添加一个甲基基团。CpG位点就是在单链上C碱基p磷酸基团和G碱基构成一个位点


一、划分数据集的选择

  • 留出法
  • 交叉验证
  • 自助法

二、原理

1.留出法

留出法就是简单的将数据集划分成两个互斥的集合,在划分的时候我们需要保证划分的集合数据分布的一致性,一般采用分层采样,并且多次随机划分,返回多次结果的平均。

2.交叉验证

我们将数据集 D D D划分成 k k k个大小相同的互斥子集,每个子集尽可能的保证数据分布的一致性,然后使用 k − 1 k-1 k1个子集的并集作为训练集将余下的子集作为测试集,从而这样就可以获得 k k k次训练结果。当 k k k等于样本数时,我们变得到留一法,这样往往更贴近真实结果,但时间开销较大。

3.自助法

我们从数据集 D D D中随机的挑选一个样本,放入 D t e s t D^{test} Dtest中,再将样本放入回 D D D中,这个过程重复 m m m次,这样一部分数据会在 D t e s t D^{test} Dtest重复出现,而有一些样本并不会出现。这个方法主要用于数据集较小,难以划分训练集和测试集时用到。


3.代码

导入相关库

from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.utils import resample
import pandas as pd
import h5py as h5
import numpy as np
import random

读取数据文件,并获得数据的名字

source_data = h5.File(r"C:\Users\***\Desktop\c1_000000-001000.h5", 'r')
names = list(source_data['inputs']['cpg'].keys())

构造存放数据的容器

column = []
for i in range(50):
    name = 'state%s' % i
    column.append(name)

for i in range(50):
    name = 'dist%s' % i
    column.append(name)

df_empty = data_all = pd.DataFrame(np.random.randn(5000, len(column)), columns=column)

读取数据

features = ['dist', 'state']
for i, j in enumerate(names):
    features1 = np.array(source_data['inputs']['cpg'][j]['state'])
    features2 = np.array(source_data['inputs']['cpg'][j]['dist'])
    row = list(range(i*1000, i*1000+1000))
    df_empty.loc[row, column[0:50]] = np.array(features1)
    df_empty.loc[row, column[50:100]] = np.array(features2)

读取标签

df_empty_label = data_all = pd.DataFrame()

for i, j in enumerate(names):
    laebl = source_data['outputs']['cpg'][j]
    df_empty_label[j] = laebl

使用随机的甲基化状态填充缺失值

for i in range(len(df_empty_label.values)):
    for j in range(len(df_empty_label.values[i])):
        if df_empty_label.values[i][j] == -1:
            df_empty_label.values[i][j] = random.choice([0, 1]) 

留出法划分数据集

train_test_split()
Parameters
  • X:待被划分的数据
  • y:数据所对应的标签
  • test_size:测试集所占的比重
  • train_size:训练集所占的比重
  • random_state:随机种子
x = list(df_empty_label)
y = []
for i in x:
    y.extend(df_empty_label[i].values.tolist())
X = df_empty.values
X_train,X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, shuffle=True)
print(len(X_train) / (len(X_test) + len(X_train)))
<<< 0.7
KFold
Parameters
  • n_splits:K折交叉验证的K的值
  • shuffle:是否混洗
  • random_state:随机种子

同上使用交叉验证划分数据集

kf = KFold(n_splits=10)
y = np.array(y)
count = 0
for train_index, test_index in kf.split(X):
    print('第{}次交叉验证'.format(count + 1))
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    count = count + 1
    <<<1次交叉验证
	<<<2次交叉验证
	<<<3次交叉验证
	<<<4次交叉验证
	<<<5次交叉验证
	<<<6次交叉验证
	<<<7次交叉验证
	<<<8次交叉验证
	<<<9次交叉验证
	<<<10次交叉验证
自助法
D1_train = []
y1_train = []
for i in range(1000):
    X1, y1 = resample(X, y, n_samples=1)
    D1_train.append(X1)
    y1_train.append(y1)
    np.unique(D1_train)
    np.unique(y1_train)

总结

如果发现问题希望大家可以帮我指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值