先这样,还没弄清楚怎么写,等我完善
siRNA数据集的深度学习模型训练框架
1. 依赖库的导入
2. 基因组分词器类
代码解读
- 类初始化:
__init__
方法接受两个参数ngram
和stride
,用于设置分词器的 n-gram 长度和步幅。 - 分词方法:
tokenize
方法将输入的序列转换为大写,并根据ngram
和stride
对序列进行分词。 n-gram
长度为 1 的处理:如果ngram
为 1,直接将序列转换为字符列表。n-gram
长度大于 1 的处理:按步幅进行分词,并确保每个分词的长度等于ngram
。- 最后一个分词的处理:如果最后一个分词长度小于
ngram
,将其移除。 - 返回分词结果:返回处理后的分词结果列表。
3. 基因组词汇类
该类用于创建一个词汇表,用于将基因组片段映射为索引。
代码解读
-
类初始化:
__init__
方法接受一个参数itos
,它是一个词汇表列表。itos
:从索引到词汇的映射。stoi
:从词汇到索引的映射,由itos
列表生成。
-
类方法
create
:创建词汇表的类方法,用于生成GenomicVocab
类的实例。- 参数:
tokens
:所有token的列表。max_vocab
:词汇表的最大容量。min_freq
:词汇在被包含到词汇表中的最低频率。
- 步骤:
- 统计
tokens
中每个token出现的频率。 - 按照频率从高到低排序,并选择出现频率大于等于
min_freq
的token,最多保留max_vocab
个。 - 在词汇表中添加一个特殊的
<pad>
token,用于填充序列。 - 返回包含生成的
itos
列表的GenomicVocab
实例。
- 统计
- 参数:
4. siRNA数据集类
该类用于加载siRNA数据,并将序列数据转换为模型可以处理的格式。
代码解读
-
初始化:
__init__
方法初始化数据集的必要参数:df
:包含数据的Pandas数据框。columns
:包含序列的列名列表。vocab
:词汇表对象,用于将token转换为索引。tokenizer
:分词器对象,用于将序列分割为token。max_len
:序列的最大长度,所有序列将被填充或截断到这个长度。is_train
:布尔值,指示数据集是否用于训练(默认为False)。
-
获取数据集长度:
__len__
方法返回数据集的样本数量。 -
获取样本:getitem 方法获取数据集中指定索引的样本:
- 获取指定行的数据。
- 对每个包含序列的列进行分词和编码。
- 获取目标值(mRNA_remaining_pct),并将其转换为张量。
- 返回编码后的序列和目标值。
-
分词和编码:
tokenize_and_encode
方法对输入序列进行分词和编码:- 如果序列中包含空格,按空格分词(表示序列已经被修改)。
- 否则,使用分词器对序列进行分词。
- 将分词结果转换为索引,未知
token
用0(<pad>)
表示。 - 对序列进行填充,使其长度等于最大长度
max_len
。 - 返回张量格式的填充序列。
5. siRNA Model
这是一个基于GRU的神经网络模型,用于处理siRNA序列。
代码解读
-
初始化方法
__init__
:vocab_size
:词汇表大小,用于嵌入层。embed_dim
:嵌入维度,嵌入层将词汇映射为embed_dim
维向量。hidden_dim
:隐藏层维度,GRU的隐藏状态维度。n_layers
:GRU的层数。dropout
:Dropout
层的丢弃率,用于防止过拟合。
该方法初始化了模型的各层,包括嵌入层
、GRU层
、全连接层
和Dropout层
。
-
前向传播方法
forward
:- 将输入序列传入嵌入层进行词汇嵌入。
- 对每个嵌入的序列进行
GRU
处理,提取最后一个隐藏状态并进行Dropout
处理。 - 将所有处理后的序列输出拼接起来,并传入全连接层。
- 返回经过全连接层后的结果。
6. 评估指标计算函数
该函数用于计算模型的各项评估指标,包括精确度、召回率、F1值和评分。
代码解读
-
计算平均绝对误差 (MAE):
mae = np.mean(np.abs(y_true - y_pred))
:计算实际值和预测值之间的平均绝对误差
。
-
将实际值和预测值转换为二进制分类:
y_true_binary = (y_true < threshold).astype(int)
:如果实际值
小于阈值
,设为1
,否则设为0
。y_pred_binary = (y_pred < threshold).astype(int)
:如果预测值
小于阈值
,设为1
,否则设为0
。
-
创建掩码:
mask = (y_pred >= 0) & (y_pred <= threshold)
:筛选预测值
在0
和阈值
之间的样本。range_mae = mean_absolute_error(y_true[mask], y_pred[mask]) if mask.sum() > 0 else 100
:计算这些样本的平均绝对误差
,如果没有
符合条件的样本,设为100
。
-
计算精确度、召回率和F1得分:
precision = precision_score(y_true_binary, y_pred_binary, average='binary')
:计算精确度。recall = recall_score(y_true_binary, y_pred_binary, average='binary')
:计算召回率。f1 = 2 * precision * recall / (precision + recall)
:计算F1得分。
-
计算综合评分:
score = (1 - mae / 100) * 0.5 + (1 - range_mae / 100) * f1 * 0.5
:综合MAE、范围内的MAE和F1得分,计算最终评分。
-
返回评分:
return score
:返回综合评分。
7. 模型评估函数
该函数用于在测试集上评估模型性能。
8. 模型训练函数
函数用于训练模型,并在每个epoch后评估模型的性能,保存最佳模型。
9. 训练主程序