N6-甲基腺苷(m6A)是真核生物中最常见的mRNA修饰类型,参与mRNA剪接、稳定性调控和翻译等关键过程。研究表明,m6A修饰异常与多种疾病密切相关,包括癌症、神经退行性疾病等。传统实验方法鉴定m6A位点成本高且耗时长,而机器学习方法特别是深度学习,为高效预测mRNA修饰位点提供了新思路。
在此系列的前四篇里我们已经系统回顾了很多具有代表性的m6A-SNP预测模型,在接下来几篇我们将深入解析模型原理/代码实现和最新的深度学习研究成果,展示人工智能如何助力RNA修饰功能研究。
本篇将承接上篇继续解析如何构建卷积神经网络(CNN)来预测mRNA序列中的m6A修饰位点,主要涵盖模型性能评估、预测策略。

模型示例结构图

基础评估指标
准确率 (Accuracy):整体预测正确率
查准率 (Precision):预测为正的样本中,多少是真正的正样本
查全率 (Recall):所有正样本中,模型能识别出来多少
F1 值 (F1-score):Precision 和 Recall 的调和平均,更平衡的指标
混淆矩阵:直观展示 TP/TN/FP/FN
ROC 曲线与 AUC:评估整体分类能力
PR 曲线与 AUPRC:在类别不平衡时更敏感,重点反映模型对正类的识别表现

混淆矩阵示例
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
y_pred = (model.predict(X_test) > 0.5).astype(int)
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Precision:", precision_score(y_test, y_pred))
print("Recall:", recall_score(y_test, y_pred))
print("F1:", f1_score(y_test, y_pred))
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
import matplotlib.pyplot as plt
cm = confusion_matrix(y_test, y_pred)
disp = ConfusionMatrixDisplay(confusion_matrix=cm)
disp.plot()
plt.show()
from sklearn.metrics import roc_curve, roc_auc_score
y_prob = model.predict(X_test).ravel()
fpr, tpr, _ = roc_curve(y_test, y_prob)
auc_val = roc_auc_score(y_test, y_prob)
plt.plot(fpr, tpr, label=f"ROC curve (AUC={auc_val:.2f})")
plt.xlabel("False Positive Rate")
plt.ylabel("True Positive Rate")
plt.legend()
plt.show()
from sklearn.metrics import precision_recall_curve, average_precision_score
precision, recall, _ = precision_recall_curve(y_test, y_prob)
ap = average_precision_score(y_test, y_prob)
plt.plot(recall, precision, label=f"PR curve (AP={ap:.2f})")
plt.xlabel("Recall")
plt.ylabel("Precision")
plt.legend()
plt.show()
import seaborn as sns
#可以用于调整阈值
sns.kdeplot(y_prob[y_test==0], label="Negative")
sns.kdeplot(y_prob[y_test==1], label="Positive")
plt.xlabel("Predicted probability")
plt.ylabel("Density")
plt.legend()
plt.show()
为什么选择AUPRC?
传统单阈值问题:
双阈值方案:
def double_threshold_classify(prob, low=..., high=...): #可以自行根据密度图选择
if prob >= high:
return 1 # 高置信度正样本
elif prob <= low:
return 0 # 高置信度负样本
else:
return -1 # 不确定区域
优势:
def predict_snp_effect(model, wt_seq, mt_seq):
""" 预测SNP对m6A修饰的影响 """
# 编码序列
wt_encoded = one_hot_encode_with_position(wt_seq).reshape(1, 101, 6)
mt_encoded = one_hot_encode_with_position(mt_seq).reshape(1, 101, 6)
# 预测概率
wt_prob = model.predict(wt_encoded)[0][0]
mt_prob = model.predict(mt_encoded)[0][0]
# 计算变化量
delta = mt_prob - wt_prob
return wt_prob, mt_prob, delta
# 应用示例
wt_seq = "ACTG...A...TGAC" # 野生型序列(含中心A)
mt_seq = "ACTG...G...TGAC" # 突变型序列(A→G)
wt_prob, mt_prob, delta = predict_snp_effect(model, wt_seq, mt_seq)
1.首先依据模型验证阶段确定的分数阈值筛选出高置信度的m6A预测位点;
2.再对Δscore应用Z-score标准化,筛选出变化幅度显著(Z>2或Z<-2)的样本。
只有同时满足分数阈值和显著性要求的突变,才被认定为真正的gain或loss事件
def classify_snp_effect(wt_prob, mt_prob, delta, z_score):
""" 根据Z-score和双阈值分类SNP效应 """
if delta > 0 and z_score > ... and mt_prob >= ...:
return "Gain" # 获得新修饰位点
elif delta < 0 and z_score < ... and wt_prob >= ...:
return "Loss" # 丢失原有修饰位点
else:
return "Uncertain" # 不确定变化
关键点回顾: 5. 双阈值策略提升预测可靠性