最近在学校学习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 k−1个子集的并集作为训练集将余下的子集作为测试集,从而这样就可以获得 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)
总结
如果发现问题希望大家可以帮我指出。