Datawhale AI夏令营(AI+生命科学)深度学习-Task2学习笔记

进阶代码及解析

        1、导入必要的库和数据

%pip install pandas
%pip install lightgbm
import pandas as pd

df_original = pd.read_csv("train_data.csv")
n_original = df_original.shape[0]
df_submit = pd.read_csv("sample_submission.csv")
df = pd.concat([df_original, df_submit], axis=0).reset_index(drop=True) # 数据合并

        2、siRNA_feat_builder 函数

def siRNA_feat_builder(s: pd.Series, anti: bool = False):
    name = "anti" if anti else "sense" # 如果anti为True,则name为"anti",否则为"sense"
    df = s.to_frame() # 将输入的Series转换为DataFrame
    df[f"feat_siRNA_{name}_seq_len"] = s.str.len() # 计算序列长度并创建特征列

    # 遍历序列的开头和结尾
    for pos in [0, -1]:
        # 遍历"AUGC"四种碱基
        for c in list("AUGC"):
            # 创建特征列,判断序列开头或结尾是否为特定碱基
            df[f"feat_siRNA_{name}_seq_{c}_{'front' if pos == 0 else 'back'}"] = (s.str[pos] == c)

    # 创建特定序列模式的特征列
    df[f"feat_siRNA_{name}_seq_pattern_1"] = s.str.startswith("AA") & s.str.endswith("UU")
    df[f"feat_siRNA_{name}_seq_pattern_2"] = s.str.startswith("GA") & s.str.endswith("UU")
    df[f"feat_siRNA_{name}_seq_pattern_3"] = s.str.startswith("CA") & s.str.endswith("UU")
    df[f"feat_siRNA_{name}_seq_pattern_4"] = s.str.startswith("UA") & s.str.endswith("UU")
    df[f"feat_siRNA_{name}_seq_pattern_5"] = s.str.startswith("UU") & s.str.endswith("AA")
    df[f"feat_siRNA_{name}_seq_pattern_6"] = s.str.startswith("UU") & s.str.endswith("GA")
    df[f"feat_siRNA_{name}_seq_pattern_7"] = s.str.startswith("UU") & s.str.endswith("CA")
    df[f"feat_siRNA_{name}_seq_pattern_8"] = s.str.startswith("UU") & s.str.endswith("UA")

    # 创建额外的序列模式特征列
    df[f"feat_siRNA_{name}_seq_pattern_9"] = s.str[1] == "A"
    df[f"feat_siRNA_{name}_seq_pattern_10"] = s.str[-2] == "A"

    # 计算GC含量的比例作为特征列
    df[f"feat_siRNA_{name}_seq_pattern_GC_frac"] = (s.str.contains("G") + s.str.contains("C")) / s.str.len()

    # 返回除了第一列(原始序列)外的所有列作为特征
    return df.iloc[:, 1:]
  • 函数目的:根据输入的 pd.Series 对象 s,生成与 siRNA 序列相关的特征。
  • 特征生成:根据 siRNA 序列的长度、特定位置的碱基、以及特定的序列模式(如特定的起始和末尾序列)来生成特征列。
  • 反义链处理:根据 anti 参数的布尔值,决定生成 "anti" 或 "sense" 特征列名,并相应处理 siRNA 的反义链。

        3、对分类特征进行独热编码

df_publication_id = pd.get_dummies(df.publication_id)
df_publication_id.columns = [
    f"feat_publication_id_{c}" for c in df_publication_id.columns
]
df_gene_target_symbol_name = pd.get_dummies(df.gene_target_symbol_name)
df_gene_target_symbol_name.columns = [
    f"feat_gene_target_symbol_name_{c}" for c in df_gene_target_symbol_name.columns
]
df_gene_target_ncbi_id = pd.get_dummies(df.gene_target_ncbi_id)
df_gene_target_ncbi_id.columns = [
    f"feat_gene_target_ncbi_id_{c}" for c in df_gene_target_ncbi_id.columns
]
df_gene_target_species = pd.get_dummies(df.gene_target_species)
df_gene_target_species.columns = [
    f"feat_gene_target_species_{c}" for c in df_gene_target_species.columns
]
  • 独热编码:使用 pd.get_dummies 函数将分类特征(如 publication_idgene_target_symbol_name 等)转换为独热编码形式。
  • 列名重命名:将生成的独热编码列重新命名为 feat_ 开头的格式,便于后续的特征组合和模型输入。

        4、处理 siRNA_duplex_id

siRNA_duplex_id_values = df.siRNA_duplex_id.str[3:-2].str.strip(".").astype("int")
siRNA_duplex_id_values = (siRNA_duplex_id_values - siRNA_duplex_id_values.min()) / (
    siRNA_duplex_id_values.max() - siRNA_duplex_id_values.min()
)
df_siRNA_duplex_id = pd.DataFrame(siRNA_duplex_id_values)
  • 数据清洗和归一化:对 siRNA_duplex_id 列进行数据清洗,提取有效的数值部分,并进行归一化处理。
  • 创建 DataFrame:将处理后的数据存储在新的 DataFrame df_siRNA_duplex_id 中,以便后续特征组合使用。

        5、定义其他特定的特征处理

df_cell_line_donor = pd.get_dummies(df.cell_line_donor)
df_cell_line_donor.columns = [
    f"feat_cell_line_donor_{c}" for c in df_cell_line_donor.columns
]
df_cell_line_donor["feat_cell_line_donor_hepatocytes"] = (
    (df.cell_line_donor.str.contains("Hepatocytes")).fillna(False).astype("int")
)
df_cell_line_donor["feat_cell_line_donor_cells"] = (
    df.cell_line_donor.str.contains("Cells").fillna(False).astype("int")
)
df_siRNA_concentration = df.siRNA_concentration.to_frame()
df_Transfection_method = pd.get_dummies(df.Transfection_method)
df_Transfection_method.columns = [
    f"feat_Transfection_method_{c}" for c in df_Transfection_method.columns
]
df_Duration_after_transfection_h = pd.get_dummies(df.Duration_after_transfection_h)
df_Duration_after_transfection_h.columns = [
    f"feat_Duration_after_transfection_h_{c}"
    for c in df_Duration_after_transfection_h.columns
]
feats = pd.concat(
    [
        df_publication_id,
        df_gene_target_symbol_name,
        df_gene_target_ncbi_id,
        df_gene_target_species,
        df_siRNA_duplex_id,
        df_cell_line_donor,
        df_siRNA_concentration,
        df_Transfection_method,
        df_Duration_after_transfection_h,
        siRNA_feat_builder(df.siRNA_sense_seq, False),
        siRNA_feat_builder(df.siRNA_antisense_seq, True),
        df.iloc[:, -1].to_frame(), # 将 df 的最后一列(假设是目标变量或标签)转换为 DataFrame,并将其加入到 feats 中。
    ],
    axis=1,
)
  • 其他分类特征处理:对于 cell_line_donorsiRNA_concentrationTransfection_method 等列,进行类似的特征处理,包括独热编码和生成新的特征列。

        6、模型训练

import lightgbm as lgb
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    feats.iloc[:n_original, :-1], # 特征矩阵,去掉最后一列作为特征
    feats.iloc[:n_original, -1], # 目标变量或标签
    test_size=0.2, # 测试集大小比例为 20%
    random_state=42, # 随机种子,确保可复现性
)

train_data = lgb.Dataset(X_train, label=y_train)
test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)

params = {
    "boosting_type": "gbdt", # 使用的 boosting 方法,这里是梯度提升决策树(Gradient Boosting Decision Tree
    "objective": "regression", # 模型的损失函数类型,这里是回归任务
    "metric": "root_mean_squared_error", # 评估指标,这里是均方根误差(RMSE)
    "max_depth": 7, # 每棵树的最大深度
    "learning_rate": 0.02, # 学习率,控制每一步迭代的步长
    "verbose": 0, # 是否显示训练过程中的详细信息,这里设为0表示不显示
}
gbm = lgb.train(
    params, # 模型的参数字典
    train_data,
    num_boost_round=15000, # 迭代次数,即 boosting 轮数
    valid_sets=[test_data], # 验证集数据
    callbacks=[print_validation_result], # 回调函数列表,这里包含了之前定义的 print_validation_result 函数,用于打印验证集的结果
)
  • 模型训练准备:导入 LightGBM 库,分割数据为训练集和测试集,并使用 train_test_split 函数进行划分。
  • 数据集封装:使用 lgb.Dataset 封装训练数据集和测试数据集,准备给 LightGBM 模型使用。
  • 模型参数:定义了 LightGBM 模型的参数,包括 boosting 类型、优化目标(回归任务)、评估指标(RMSE)、树的最大深度、学习率等。
  • 模型训练:使用 lgb.train 函数进行模型训练,设置了迭代轮数 num_boost_round,验证集 valid_sets,以及回调函数 callbacks 用于打印验证结果。

        7、预测并生成提交文件

y_pred = gbm.predict(feats.iloc[n_original:, :-1])
df_submit["mRNA_remaining_pct"] = y_pred
df_submit.to_csv("./result/submission.csv", index=False)
  • 预测结果:使用训练好的 LightGBM 模型对测试数据进行预测,得到预测结果 y_pred
  • 生成提交文件:将预测结果 y_pred 添加到提交样本数据 df_submit 中的 mRNA_remaining_pct 列,并将结果保存到 CSV 文件中,用于提交竞赛或项目的最终结果。 

        最终的运行分数如下:

略微的改进

        1、增加特征列

# 碱基组成比例特征列
    df[f"feat_siRNA_{name}_freq_A"] = s.str.count("A") / s.str.len()
    df[f"feat_siRNA_{name}_freq_U"] = s.str.count("U") / s.str.len()
    df[f"feat_siRNA_{name}_freq_G"] = s.str.count("G") / s.str.len()
    df[f"feat_siRNA_{name}_freq_C"] = s.str.count("C") / s.str.len()

    # 序列熵特征列
    def calculate_entropy(seq):
        p = [seq.count(base) / len(seq) for base in "AUGC"]
        return scipy.stats.entropy(p)

    df[f"feat_siRNA_{name}_seq_entropy"] = s.apply(calculate_entropy)

    # 二核苷酸频率
    for dinuc in ["AA", "AU", "UA", "UU", "AG", "GA", "GC", "CG", "GU", "UG", "CC", "CU", "UC"]:
        df[f"feat_siRNA_{name}_freq_{dinuc}"] = s.str.count(dinuc) / (s.str.len() - 1)

        2、改进参数

params = {
    "boosting_type": "gbdt",
    "objective": "regression",
    "metric": "root_mean_squared_error",
    "max_depth": 8,
    "learning_rate": 0.025,
    "verbose": 0,
}
gbm = lgb.train(
    params,
    train_data,
    num_boost_round=14000,
    valid_sets=[test_data],
    callbacks=[print_validation_result],
)

        改进后的分数如下:

辨析:机器学习和深度学习

        1、定义

  • 机器学习(Machine Learning, ML): 机器学习是一种通过数据和经验来改进和优化算法性能的技术。它包括一系列算法和方法,用于从数据中提取模式和进行预测或决策。机器学习的任务包括分类、回归、聚类等。

  • 深度学习(Deep Learning, DL): 深度学习是机器学习的一个子集,它基于人工神经网络特别是深层神经网络。深度学习通过多个层级的网络结构(即深度网络)来自动提取特征和表示,从而解决复杂的任务。深度学习在处理高维数据(如图像、语音)时尤其有效。

        2、算法和模型

  • 机器学习

    • 算法:包括线性回归、逻辑回归、支持向量机(SVM)、决策树、随机森林、K近邻算法(KNN)、朴素贝叶斯等。
    • 特征工程:通常需要人工设计和选择特征,以提高模型的表现。
  • 深度学习

    • 模型:主要包括各种神经网络架构,如前馈神经网络、卷积神经网络(CNN)、循环神经网络(RNN)、长短期记忆网络(LSTM)等。
    • 特征提取:通过层次化的方式自动提取和学习特征,通常不需要手动设计特征。

        3、数据需求

  • 机器学习:对数据量的要求相对较低,可以在较小的数据集上表现良好,但性能会受到数据量的影响。对于传统机器学习算法,数据量的增加可以带来性能的提升,但并不总是显著。

  • 深度学习:对数据量的需求较大。深度学习模型通常需要大量的数据来进行训练,以避免过拟合并提高模型的泛化能力。大数据集能使深度学习模型表现得更好。

        4、计算资源

  • 机器学习:对计算资源的需求相对较低,通常可以在普通的计算机上运行。

  • 深度学习:对计算资源的需求较高,尤其是深度神经网络的训练需要强大的GPU或TPU支持。深度学习模型的训练和推理速度也受到计算资源的影响。

        5、应用领域

  • 机器学习:适用于各种领域,如金融预测、推荐系统、医学诊断、营销分析等。适用于结构化数据和一些简单的模式识别任务。

  • 深度学习:在处理复杂的非结构化数据(如图像、视频、语音)和任务(如计算机视觉、自然语言处理)方面表现突出。广泛应用于图像识别、语音识别、自然语言处理等领域。

        总结

        机器学习是一个更广泛的概念,涵盖了许多算法和方法,通过数据改进模型性能。而深度学习是机器学习中的一个特定领域,利用多层神经网络自动从数据中学习特征,处理复杂的任务时具有显著优势。


hahaha都看到这里了,要是觉得有用的话就辛苦动动小手点个赞吧!

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pluses

喜欢就给颗糖果吧╰(*°▽°*

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值