学习
实践
活动
工具
TVP
写文章

零基础开始做一个数据比赛-Python

最近DC平台正在进行一个数据,题目是《基于人工智能的药物分子筛选》,主要预测蛋白质和小分子的亲和值,链接如下(http://www.pkbigdata.com/static_page/cmpList.html),对于有兴趣的同学,可以作为数据比赛的开头,这个比赛数据比较简单,方便学习。提供一个基础版本的代码如下,直接可以得出结果提交,成绩大概1.34左右。(比赛时间2018年4月9日-2018年5月21日)

######################################################################

题目任务

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

题目数据

1、蛋白质信息 df_protein.csv

数据共两列,分别是蛋白质id和蛋白质的一级结构序列的矢量化结果。(关于结构序列是什么形式,可参考wiki链接https://zh.wikipedia.org/wiki/%E8%9B%8B%E7%99%BD%E8%B3%AA%E4%B8%80%E7%B4%9A%E7%B5%90%E6%A7%8B,或点击此处查看)

例如: Protein_ID, Sequence

4,MEPVPSARAELQFSLLANVSDTFPSAFPSASANASGSPGARSASSLALAIAITALYSAVCAVGLLGNVLVMFGIVRYTKLKTATNIYIFNLALADALATSTLPFQSAKYLMETWPFGELLCKAVLSIDYYNMFTSIFTLTMMSVDRYIAVCHPVKALDFRTPAKAKLINICIWVLASGVGVPIMVMAVTQPRDGAVVCTLQFPSPSWYWDTVTKICVFLFAFVVPILIITVCYGLMLLRLRSVRLLSGSKEKD

2.蛋白质小分子亲和力值信息 df_affinity.csv

数据共三列, 分别是蛋白质id, 小分子id,亲和力值Ki(是经过函数变换后的值) 例如: Protein_ID, Molecule_ID, Ki

3.小分子信息 df_molecule.csv(会存在缺失值)

数据共二十列,其中每个特征的含义如下: Molecule_ID:小分子id, Fingerprint:分子指纹; cyp_sc9, cyp_sa4, cyp_2d6 :三种cyp酶; Ames_toxicity: ames毒性测试 Fathead_minnow_toxicity:黑头呆鱼毒性测试 Tetrahymena_pyriformis_toxicity:梨型四膜虫毒性测试 Honey_bee_toxicity:蜜蜂毒性测试 Cell_permeability: 细胞渗透性 LogP:油水分配数 Renal_organic_cation_transporter: 肾脏阳离子运输性 CLtotal: 血浆清除率 Hia: 人体肠道吸收水平 Biodegradation:生物降解水平 Vdd:表观分布容积 P_glycoprotein_inhibition: p糖蛋白抑制物 NOAEL:无可见有害作用剂量 Solubility:药物溶解度 Bbb:血脑屏障 Half-life:药物半衰期

######################################################################

#代码

######################################################################

1、加载所需的库

import gc

import re

import sys

import time

import jieba

import os.path

import os

import datetime

import numpy as np

import pandas as pd

import lightgbm as lgb

import gensim

from gensim.models import Word2Vec

2、设置工作空间&读取数据

#工作空间设置-注意斜线方向

data_path = 'C:/Users/wuzhengxiang/Desktop/晶泰科技比赛数据/'

os.chdir(data_path)#设置当前工作空间

print (os.getcwd())#获得当前工作目录

3、数据读取

df_protein_train = pd.read_csv('df_protein_train.csv')#1653

df_protein_test = pd.read_csv('df_protein_test.csv')#414

protein_concat = pd.concat([df_protein_train,df_protein_test])

df_molecule = pd.read_csv('df_molecule.csv')#111216

df_affinity_train = pd.read_csv('df_affinity_train.csv')#165084

df_affinity_test = pd.read_csv('df_affinity_test_toBePredicted.csv')#41383

df_affinity_test['Ki'] = -11

data = pd.concat([df_affinity_train,df_affinity_test])

3、特征工程

1)Fingerprint分子指纹处理展开

feat = []

for i in range(0,len(df_molecule)):

feat.append(df_molecule['Fingerprint'][i].split(','))

feat = pd.DataFrame(feat)

feat = feat.astype('int')

feat.columns=["Fingerprint_".format(i) for i in range(0,167)]

feat["Molecule_ID"] = df_molecule['Molecule_ID']

data = data.merge(feat, on='Molecule_ID', how='left')

2)df_molecule其他特征处理,直接删除指纹就行

feat = df_molecule.drop('Fingerprint',axis=1)

data = data.merge(feat, on='Molecule_ID', how='left')

3)protein 蛋白质 词向量训练

n = 128#设置词向量的维度

#分词,蛋白质序列为一串字母,可作为文本进行处理,按每3个长度进行分割,并每个蛋白质存储为一个列表

texts = [[word for word in re.findall(r'.',document)]

for document in list(protein_concat['Sequence'])]

#分好的词进行词向量训练

model = Word2Vec(texts,size=n,window=4,min_count=1,negative=3,

sg=1,sample=0.001,hs=1,workers=4)

#取出每个词的向量

vectors.columns= ["vec_".format(i) for i in range(0,n)]+["Word"]

#把每个词的向量匹配到序列中去,由于每个序列分割成很多词,需要进行聚合,求平均值即可

wide_vec = pd.DataFrame()

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)

wide_vec['Id'] = result1

result1=[]

for i in range(len(texts)):

result2=[]

for w in range(len(texts[i])):

result2.append(texts[i][w])

result1.extend(result2)

wide_vec['Word'] = result1

del result1,result2

wide_vec = wide_vec.merge(vectors,on='Word', how='left')

wide_vec = wide_vec.drop('Word',axis=1)

wide_vec.columns = ['Protein_ID']+["vec_".format(i) for i in range(0,n)]

del vectors

name = ["vec_".format(i) for i in range(0,n)]

feat = pd.DataFrame(wide_vec.groupby(['Protein_ID'])[name].agg('mean')).reset_index()

feat.columns=["Protein_ID"]+["mean_ci_".format(i) for i in range(0,n)]

data = data.merge(feat, on='Protein_ID', how='left')

4、模型训练

#使用的是lgb 模型,题目回归

train_feat = data[data['Ki']> -11].fillna(0)

testt_feat = data[data['Ki']

label_x = train_feat['Ki']

label_y = testt_feat['Ki']

submission = testt_feat[['Protein_ID','Molecule_ID']]

#删除不参与训练的列以及标签

train_feat = train_feat.drop('Ki',axis=1)

testt_feat = testt_feat.drop('Ki',axis=1)

train_feat = train_feat.drop('Protein_ID',axis=1)

testt_feat = testt_feat.drop('Protein_ID',axis=1)

train_feat = train_feat.drop('Molecule_ID',axis=1)

testt_feat = testt_feat.drop('Molecule_ID',axis=1)

#数据类型转换

train = lgb.Dataset(train_feat, label=label_x)

test = lgb.Dataset(testt_feat, label=label_y,reference=train)

#参数设置

params = {

'boosting_type': 'gbdt',

'objective': 'regression_l2',

'metric': 'l2',

#'objective': 'multiclass',

#'metric': 'multi_error',

#'num_class':5,

'min_child_weight': 3,

'num_leaves': 2 ** 5,

'lambda_l2': 10,

'subsample': 0.7,

'colsample_bytree': 0.7,

'colsample_bylevel': 0.7,

'learning_rate': 0.05,

'tree_method': 'exact',

'seed': 2017,

'nthread': 12,

'silent': True

}

#训练开始,3000轮

num_round = 3000

gbm = lgb.train(params,

train,

num_round,

verbose_eval=50,

valid_sets=[train,test]

)

#结果预测

preds_sub = gbm.predict(testt_feat)

#结果保存

name='lgb_'+nowTime+'.csv'

submission['Ki'] = preds_sub

submission.to_csv(name, index=False)

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180413G1SA1J00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券