[数据竞赛] 基于人工智能的分子筛选竞赛思路,a榜十一,b榜第十

任务:
2014年,一种未知的疾病在全球肆虐,让人类束手无策。致病蛋白质很多,它们的结构序列都藏在df_protein.csv 数据集中(Sequence特征)。经过科学家的不懈努力,能与这些致病蛋白相结合的小分子(df_molecule.csv中的Fingerprint特征表示了其结构)也被发现,并附上了它们的理化属性。此外,在df_affinity.csv数据集中,包含了蛋白质和小分子之间的亲和力数值(Ki特征)。 时间紧迫!作为算法科学家,你能够仅仅在六周时间里,从测试集(df_affinity_test_toBePredicted.csv)中预测出致病蛋白与小分子的亲和力值,从而找出最有效的药物分子吗?

这次比赛的链接如下:http://www.dcjingsai.com/common/cmpt/%E5%9F%BA%E4%BA%8E%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E7%9A%84%E8%8D%AF%E7%89%A9%E5%88%86%E5%AD%90%E7%AD%9B%E9%80%89_%E8%B5%9B%E4%BD%93%E4%B8%8E%E6%95%B0%E6%8D%AE.html


基于人工智能的分子筛选是一条关于回归类的题目,比赛的评估指标是mse,所以我们可以直接定义为回归问题,数据为小分子表和蛋白质表,这次我着重讲解一下关于蛋白质方面的分析。

蛋白质表每条数据的长度都不一定相等,他是由二十种左右的氨基酸组成的一级序列结构。蛋白质一级结构序列解释如下:
图片: http://third.datacastle.cn//pkbigdata/master.other.img/ee78dbc6-5b10-4e43-a4a0-caaa48bfb42e.jpeg

蛋白质基础特征:
当我们看到中间每个氨基酸的定义的部分,他旁边有各个氨基酸的特性,也就是疏水性,亲水性,酸性,碱性。蛋白质跟小分子作用是跟蛋白质本身的一些特性是息息相关的、这些可以作为我们的统计特征计算计算。代码如下:

def close2water(item):
    close2water = ['G', 'Y', 'N', 'Q', 'S', 'T', 'C']
    return len([i for i in list(item) if i in close2water])

def away2water(item):
    away2water = ['A', 'V', 'L', 'I', 'F', 'W', 'M', 'P']
    return len([i for i in list(item) if i in away2water])

def sx(item):
    sx = ['D', 'E']
    return len([i for i in list(item) if i in sx])

def jx(item):
    jx = ['R', 'K', 'H']
    return len([i for i in list(item) if i in jx])

def fxx(item):
    fxx = ['F', 'W', 'Y', 'H']
    return len([i for i in list(item) if i in fxx])
...

如上是一些基本的蛋白质的基础特征,还有一些相对分子质量,消光系数等特征我在竞赛圈是已经开源的了。有了蛋白质的基本特征,我们就可以开始构建我们的模型试试效果了。首先很感谢小伍哥的开源,我是站在了小伍哥开源的肩膀上做的比赛。所以我的模型就是lgb。lgb的使用有很多,我就不介绍了,大家不太清楚的可以看看网上lgb的使用方法。

数据划分时候遇到的坑:
但是我们加了如上特征的时候,分数是不太稳定的,所以应该是训练集的划分是有问题的
初步,我们随机划分了训练测试集,这就导致了一个问题,我们的分数时好时不好,所以还是训练集的划分跟线上的分布不太一致,因为我用的是sklearn是0.18版本,所以是可以按照回归的y值来进行分层抽样的,如果小伙伴们是0.19的话,可以按照蛋白质的类型去切分你们的数据集,这样就可以把分数稳定下来了。
我花了大概70次左右的提交才发现了数据划分的问题,当完成以上步骤的时候,我们的分数就差不多已经从0.134直接到0.131左右了。

蛋白质进阶特征:
蛋白质进阶特征,蛋白质是一串文本数值,按照常规分割就是3个一切,并且计算氨基酸的一些特性,我们通过w2v来计算每3个 氨基酸的相似性,这样的话我们就可以找出一些近邻的氨基酸的一些基础特性。蛋白质的特性让我们达到了0.128的分数。蛋白质一级结构序列可能含有一些非相似性的一些特征, w2v的计算相似性的,我们通过计算不同切分的氨基酸的词频并且跟了lda模型构造了5个特征,分别以不同的切分方式做了20个特征,这让我们从单模型0.125-0.124迈进。

# 蛋白质按照5切割
texts = [[word for word in re.findall(r'.{5}', document)]
         for document in list(protein_concat['Sequence'])]
cvs = []
for i in range(len(texts)):
    cvs = cvs + texts[i]

# 暂时准备用pca+cv做
from sklearn.feature_extraction.text import CountVectorizer
tfidf=CountVectorizer()
weight=tfidf.fit_transform(cvs)
print weight.shape[0], len(cvs)
del cvs
from sklearn.decomposition import LatentDirichletAllocation
lda = LatentDirichletAllocation(n_topics=5)
from sklearn.decomposition import PCA, NMF, TruncatedSVD
# nmf = NMF(n_components=3)
# pca = TruncatedSVD(n_components=5)
td = pd.DataFrame(lda.fit_transform(weight))
td.columns=["lda_{0}".format(i) for i in range(5)]
td["Protein_ID"] = pd.Series(protein_concat["Protein_ID"].values)
result1 = []
aa = list(protein_concat['Protein_ID'])
for i in range(len(texts)):
    result2 = []
    for w in range(len(texts[i])):
        result2.append(aa[i])
    result1.extend(result2)
td['Protein_ID'] = result1
del result1, result2

name = ["lda_{0}".format(i) for i in range(5)]
feat = pd.DataFrame(td.groupby(['Protein_ID'])[name].agg('mean')).reset_index()
print feat.shape
data = data.merge(feat, on='Protein_ID', how='left')
del td, weight
print "增加weight特征"
print data.shape

小分子特征:
小分子特征我做的比较少,主要还是做了一些过滤筛选,fingerpoint这个特征切分之后大概有128个特征,但是有几列特征为全0或者绝大多数是0的情况,这些的特征给模型带来了不好的影响,所以还对其中128列特征做了过滤,代码如下;

# 如果每列的和小于2000的话,那么删除这一列
drop = []for i in feat.columns:
    if np.sum(feat[i]) < 2000:
        drop.append(i)

然后就分别训练了xgb和lgb的两个模型,对两个模型产生的结果做了一个加权平均,我们线上的成绩就从0.124到0.123。

总结:
这次比赛最后2周决策失误了,花了太多时间在stacking上面,但是stacking最终的效果没有达到我的预期,可能是我的使用方式有些不太对,stacking还得加强一些看看。如果单模型能到123的话,应该还可以在提升一些名次。虽然这次比赛的前三名全部变了,但是不算问题太大,蛋白质的一些处理方式我觉得还可以在提升提升,比如计算tfidf,然后走pca。因为这样的话每个主要的蛋白质可能也会有提升,但是我没有做尝试,时间上面来不及,就放弃了。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值