Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kaggle系列-Mechanisms of Action (MoA) Prediction[表格数据多标签]第一名方案

Kaggle系列-Mechanisms of Action (MoA) Prediction[表格数据多标签]第一名方案

作者头像
致Great
发布于 2021-01-18 13:17:55
发布于 2021-01-18 13:17:55
1.6K00
代码可运行
举报
文章被收录于专栏:自然语言处理自然语言处理
运行总次数:0
代码可运行

比赛链接:https://www.kaggle.com/c/lish-moa/overview

赛题背景

连接图是麻省理工学院和哈佛大学广泛研究所、哈佛大学创新科学实验室(LISH)和美国国立卫生研究院共同基金综合网络细胞特征库(LINCS)的一个项目,它提出了这一挑战,目标是通过改进MoA预测算法来推进药物开发。

药物的作用机制是什么?为什么它很重要? 过去,科学家是从天然产物中提取药物或受到传统疗法的启发。在人们认识到驱动其药理活性的生物学机制之前,非常常见的药物,例如扑热息痛(在美国称为对乙酰氨基酚)已投入临床使用数十年。

如今,随着功能更强大的技术的出现,药物发现已经从过去的偶然方法变成了基于对疾病潜在生物学机制的了解而更具针对性的模型。在这个新的框架中,科学家寻求鉴定与疾病相关的蛋白质靶标,并开发出可以调节该蛋白质靶标的分子。作为描述给定分子生物学活性的简写,科学家们将其标记为作用机理或简称MoA。

赛题任务

如何确定新药的MoAs?

基于MoA批注,将根据应用于每个药物MoA批注对的对数损失函数的平均值来评估溶液的准确性。如果成功,你可以开发一种算法,从而根据化合物的细胞特征预测化合物的MoA,从而帮助科学家推进药物发现过程。

在这场比赛中,你将获得一个独特的数据集,结合基因表达和细胞活力的数据。这项数据是基于一项新技术,在100种不同细胞类型的细胞池中同时(在相同的样本中)测量人类细胞对药物的反应(从而解决了事先确定哪些细胞类型更适合某一特定药物的问题)。此外,您还可以访问此数据集中5000多种药物的MoA注释。 按照惯例,数据集被分为测试和训练子集。因此,您的任务是使用训练数据集来开发一个算法,该算法自动将测试集中的每个案例标记为一个或多个MoA类。注意,由于药物可以有多个MoA注释,因此这项任务在形式上是一个多标签分类问题。 如何评估解决方案的准确性? 基于MoA注释,将根据应用于每个药物MoA注释对的对数损失函数的平均值来评估溶液的准确性。 如果成功,你将帮助开发一种算法,根据化合物的细胞特征预测其MoA,从而帮助科学家推进药物发现过程。

赛题数据

在这个比赛中,你将预测不同样本(sig_id)的作用机制(MoA)反应的多个靶标概率,给出各种输入,如基因表达数据和细胞活力数据。

  • train_features.csv:训练集对应的特征数据。特征g-表示基因表达数据,c-表示细胞活力数据。cp_type表示使用化合物(cp_vehicle)或控制扰动(ctrl_vehicle)处理的样品;控制扰动无moa;cp_time和cp_dose表示治疗时间(24、48、72小时)和剂量(高、低)。
  • train_drug.csv 训练集样本的sig_id和drug_id对应关系
  • train_targets_scored.csv:MOA的二分类标签数据
  • train_targets_nonscored.csv:额外没有带有标签的MOA数据
  • test_features.csv:测试数据的特征。需要选手预测测试数据中每一行的每个MoA得分的概率。
  • sample_submission.csv:提交文件

数据分析

https://www.kaggle.com/isaienkov/mechanisms-of-action-moa-prediction-eda

特征数据

训练集和测试集中的特征个数为876个

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Number of rows in training set: 23814
Number of columns in training set: 876
Number of rows in test set: 3982
Number of columns in test set: 876

类别特征可视化

  • cp_type化合物处理方式
  • cp_time 实验时间
  • cp_dose 试验剂量
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ds = df[df['dataset']=='train']
ds = ds.groupby(['cp_type', 'cp_time', 'cp_dose'])['sig_id'].count().reset_index()

ds.columns = [
    'cp_type', 
    'cp_time', 
    'cp_dose', 
    'count'
]

fig = px.sunburst(
    ds, 
    path=[
        'cp_type',
        'cp_time',
        'cp_dose' 
    ], 
    values='count', 
    title='Sunburst chart for all cp_type/cp_time/cp_dose',
    width=500,
    height=500
)

fig.show()

基因细胞特征分布

g代表gene特征数据,c代表cell特征数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
train_columns = train.columns.to_list()
g_list = [i for i in train_columns if i.startswith('g-')]
c_list = [i for i in train_columns if i.startswith('c-')]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def plot_set_histograms(plot_list, title):
    fig = make_subplots(
        rows=4, 
        cols=3
    )
    
    traces = [
        go.Histogram(
            x=train[col], 
            nbinsx=100, 
            name=col
        ) for col in plot_list
    ]

    for i in range(len(traces)):
        fig.append_trace(
            traces[i], 
            (i // 3) + 1, 
            (i % 3) + 1
        )

    fig.update_layout(
        title_text=title,
        height=1000,
        width=WIDTH
    )
    fig.show()

plot_list = [
    g_list[
        np.random.randint(0, len(g_list)-1)
    ] for i in range(50)
]

plot_list = list(set(plot_list))[:12]
plot_set_histograms(plot_list, 'Randomly selected gene expression features distributions')

特征相关性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
columns = g_list + c_list
for_correlation = random.sample(columns, 50)
data = df[for_correlation]

f = plt.figure(
    figsize=(18, 18)
)

plt.matshow(
    data.corr(), 
    fignum=f.number
)

plt.xticks(
    range(data.shape[1]), 
    data.columns, 
    fontsize=14, 
    rotation=50
)

plt.yticks(
    range(data.shape[1]), 
    data.columns, 
    fontsize=14
)

cb = plt.colorbar()
cb.ax.tick_params(
    labelsize=13
)

目标分析

纵向为特征列,横向为目标列(206个),每个单元为对应特征与目标的相关性系数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
correlation_matrix['train_features'] = columns
correlation_matrix = correlation_matrix.set_index('train_features')

correlation_matrix

与目标列相关性比较高的特征如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
count_features = total_scores['train_best_column'].value_counts().reset_index().sort_values('train_best_column')

count_features.columns = [
    'column', 
    'count'
]

count_features = count_features.tail(33)

fig = px.bar(
    count_features, 
    x='count', 
    y="column", 
    orientation='h', 
    title='Columns from training set with number of high correlations with target columns', 
    width=WIDTH,
    height=700
)

fig.show()

另外也有高阶的相关系系数分析

  • 二阶相关性
  • 三阶相关性

Hungry for Gold 第一名方案

分享链接:https://www.kaggle.com/c/lish-moa/discussion/201510 代码链接:https://www.kaggle.com/markpeng/final-best-lb-cleaned/notebook

模型1 3-Stage NN

半监督学习:该模型为三阶段的NN网络组成,首先是特征工程,主要包括基因特征数据,细胞特征数据以及实验分类特征,然后进行分位数变化以及归一化,之后输入到StageNN1 然后预测得到没有标签数据的预测,之后合并标注数据进行StageNN2训练预测得到第二次没有标签的预测输出,之后合并带有标签的数据得到最后测试集的预测。

模型2 2-Stage NN+TabNet

这里主要用到了Tabnet工具,可以利用神经网络在表格数据上进行大放异彩。使用方法大家可以参照Github链接:

dreamquark-ai/tabnet https://github.com/dreamquark-ai/tabnet

其中2-FC代表简单的两层全连接神经网络,如下图所示

模型3 Simple NN

这里和模型1比较相似,但是进行的监督学习,没有用到半监督学习。同时这里加入了基于K-Means聚类的特征

模型4 2-heads ResNet:基于多输入的残差网络

原始开源开源代码:https://www.kaggle.com/demetrypascal/fork-of-2heads-looper-super-puper-plate

残差网络拓扑图,其中网络用到也是最基本的Dense网络结构:

模型5 DeepInsight CNNs

利用 EfficientNet B3 提取特征

利用ResNeSt提取特征

特征多样性

为了更好地理解模型的多样性,下面是最好的单一模型的平均相关性热图。对每对模型采用Pearson方法计算相关系数。我们以目标相关系数的均值作为每个模型的最终值。

  • 基于线上提交得出的模型相关性热力图
  • 基于线下OOF得出的模型相关性热力图

可以看到模型相关性系数都很低,一般在0.52-0.70,模型具有多样性和差异性,那么融合之后的收益会很大

总结

  • 本方案使用神经网络在白表格数据上做了大量尝试,并取得很大的成效
  • 为了提高模型融合的收益,需要保证模型多样性,所以作者也使用了不同的训练方法和模型结构
  • 使用CNN等预训练模型提取特征图
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python hasattr() 函数 // python中hasattr()、getattr()、setattr()函数的使用
http://www.runoob.com/python/python-func-hasattr.html
用户7886150
2021/01/23
1K0
【Python入门】Python 63个内置函数超级详解
Python内置了一些非常精巧且强大的函数,对初学者来说,一般不怎么用到,但是偶尔会碰到,我也是用了一段时间python之后才发现,卧槽,还有这么好的函数,每个函数都非常经典,而且经过严格测试,使用内置函数,不用自己闭门造车,并且代码简洁易读了很多,真是方便又实用,值得花时间进行体系化研究学习。
黄博的机器学习圈子
2020/05/26
8830
【Python入门】Python 63个内置函数超级详解
Python的内置函数(四十一)、 index()
描述index() 函数用于从列表中找出某个值第一个匹配项的索引位置。语法index()方法语法:list.index(x[, start[, end]])参数x-- 查找的对象。start-- 可选,查找的起始位置。end-- 可选,查找的结束位置。返回值该方法返回查找对象的索引位置,如果没有找到对象则抛出异常。实例以下实例展示了 index()函数的使用方法:#!/usr/bin/python# -*- coding: UTF-8 -*-aList = [123, 'xyz', 'runoob', 'a
狼啸风云
2020/03/31
7540
python初学者必须吃透的这些内置函数
所谓内置函数,就是Python提供的, 可以直接拿来直接用的函数,比如大家熟悉的print,range、input等,也有不是很熟,但是很重要的,如enumerate、zip、join等,Python内置的这些函数非常精巧且强大的,对初学者来说,经常会忽略,但是偶尔会碰到,我也是用了一段时间python之后才发现,还有这么好的函数,每个函数都非常经典,而且经过严格测试,使用内置函数,不用自己闭门造车,并且代码简洁易读了很多,真是方便又实用,值得花时间进行体系化研究学习。
程序员小新
2021/12/20
9050
python初学者必须吃透的这些内置函数
Python的内置函数(三十一)、super()
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
狼啸风云
2020/02/11
9800
Python的内置函数(三十八)、 join()
Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
狼啸风云
2020/03/03
4290
Python的内置函数(二十四)、strip()
Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
狼啸风云
2019/10/22
8470
Python的内置函数(五十)、next()函数
描述next() 返回迭代器的下一个项目。next() 函数要和生成迭代器的iter() 函数一起使用。语法next 语法:next(iterator[, default])参数说明:iterator -- 可迭代对象default -- 可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常。返回值返回对象帮助信息。实例以下实例展示了 next 的使用方法:#!/usr/bin/python# -*- coding: UTF-8 -*- # 首
狼啸风云
2020/06/22
8310
最全Python内置函数
判断真假,  True:真  ,  False:假,   把一个对象转换成bool值
Wyc
2018/09/11
6930
6.python内置函数
1. abs() 获取绝对值 >>> abs(-10) 10 >>> a = -10 >>> a.__abs__() 10 2. all()   参数为可迭代对象,迭代对象为空时,返回True.如果迭代对象的所有元素都为真,那么返回True,否则返回False. all(['python',123]) --->True all([]) --->True all([0]) --->False all(" ") --->True all(1,' ',2,None) --->False 3.a
zhang_derek
2018/04/11
8260
6.python内置函数
Python3内置函数表.md
Q:如何查看内置函数与方法? A:dir(builtins) 或者 dir(模块),以help查询具体方法的说明
全栈工程师修炼指南
2020/10/23
1.5K0
Python3内置函数表.md
Python进阶-内置函数大全
字节数组 字节是计算机的语言,字符串是人类语言,它们之间通过编码表形成一一对应的关系
小团子
2019/07/18
1.2K0
Python进阶-内置函数大全
Python的内置函数(四十九)、pop()函数
pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
狼啸风云
2020/06/11
7800
python类之特殊属性和魔术方法
1 实现 StaticMethod 装饰器,实现staticmethod的部分功能
py3study
2020/01/06
1.9K0
python3 内置函数详解
内置函数详解 abs(x) 返回数字的绝对值,参数可以是整数或浮点数,如果参数是复数,则返回其大小。 # 如果参数是复数,则返回其大小。 >>> abs(-25) 25 >>> abs(25) 25 all(iterable) all()会循环括号内的每一个元素,如果括号内的所有元素都是真的,或者如果iterable为空,则返回True,如果有一个为假的那么就返回False >>> all([]) True >>> all([1,2,3]) True >>> all([1,2,""]) Fa
程序员同行者
2018/06/22
1K0
python3内置函数大全
由于面试的时候有时候会问到python的几个基本内置函数,由于记不太清,就比较难受,于是呕心沥血总结了一下python3的基本内置函数
py3study
2020/01/13
1.2K0
Python Python中的内置函数总结
Python中的内置函数总结 总结python的常用内置函数 常用函数1 函数名 参数 介绍 返回值 举例 abs Number 返回数字绝对值 正数字 abs(-10) all List 判断列表内容是否全是true Bool all(['', '123']) help object 打印对象的用法 无 help(list) enumerate iterable 迭代时记录索引 无 for index, item in enumerate(list) input Str 命令行输入消息 Str input
Zkeq
2022/05/18
4320
盘点Python 63个内置函数
判断对象是否可以被调用,能被调用的对象就是一个callable 对象,比如函数 str, int 等都是可被调用的,但是例子4 中xiaoming这个实例是不可被调用的:
double
2019/10/29
3980
Python 63个内置函数(上篇),你都ok吗?
判断对象是否可以被调用,能被调用的对象就是一个callable 对象,比如函数 str, int 等都是可被调用的,但是例子4 中xiaoming这个实例是不可被调用的:
小草AI
2019/10/29
3740
Python入门:内置函数
可创建一个整数列表,一般用在 for 循环中。 函数语法 range(start, stop[, step]) 参数说明: start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5); end: 计数到 end 结束,但不包括 end。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5 step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1) 示例: >>>range(10) #
听着music睡
2018/05/18
7160
相关推荐
Python hasattr() 函数 // python中hasattr()、getattr()、setattr()函数的使用
更多 >
交个朋友
加入[数据] 腾讯云技术交流站
获取数据实战干货 共享技术经验心得
加入数据技术工作实战群
获取实战干货 交流技术经验
加入[数据库] 腾讯云官方技术交流站
数据库问题秒解答 分享实践经验
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档