pychembldbで活性値付きのSDFをつくる

次回のMishima.sykまで2週間を切りました。そろそろハンズオンの準備を開始しています。

尚、ハンズオンでは作業環境を揃えるために事前準備が必要なのでよろしくお願いします。一応cloud9でもいけるように用意しているそうなのでネットに繋げさえすればOKみたいですが。

さて、ハンズオンのためにサンプルデータを選ばなきゃいけないんだけど、ChEMBLからアッセイ系選んで含まれている全ての化合物情報をsdfでダウンロードしたけど属性に活性値が付いてなかった。

アレレのレですよ。

なんかやり方あると思うんだけど、とりあえずはpychembldbで活性値付きのsdfを出力するようなものを作った。しかも自分の中で最近ブームが来まくり100%中の100%なclickを使ってコマンドにしてみた。

from rdkit import Chem
from pychembldb import *
import click

@click.command()
@click.argument("chembl_id")
def chemblid2sdf(chembl_id):
    assay = chembldb.query(Assay).filter_by(chembl_id=chembl_id).first()
    w = Chem.SDWriter("{}.sdf".format(chembl_id))
    for activity in assay.activities:
        m = Chem.MolFromMolBlock(activity.compound.molecule.structure.molfile)
        act = activity.standard_value
        m.SetProp("ACTIVITY", str(act))
        w.write(m)

if __name__ == '__main__':
    chemblid2sdf()

尚、幽遊白書コラボでモンストに戻ってみたけど、持てる(無料)オーブの全てをつぎ込んだけど、ガチャは飛影しか出ないし戸愚呂100%中の100%は3ステージくらいまでしか進めないしで心が折れた。

心が折れたといえば、ポケモンGoも寒すぎて歩く気力も削がれた上にレベル31で飽きが来た。メタモンは取ったけど…

次回のMishima.sykは1210@沼津(前回と同じ場所)です

次回の日程と内容が大体決まりました。

今回はみんな大好きディープラーニングライブラリのTensorflowとkerasのハンズオンをすることにしました。

尚、お昼ガイドに載っている店ですが、朝早くこれるなら山正がおすすめです。一度くらいは並んでも食べに行く価値はあるかと思う。

僕は会場予約のついでに、リストの中で行ったことのない千楽北口に行ってみた。

1476092766

カレーは洋食のカレーって感じで甘酸っぱ目のドロッとしたカレーです。でもカツが恐ろしい量なのであった。カレーが650円でカツカレーが1350円なのが納得というか、トンカツ厚すぎ… 満腹になるので気をつけたほうがいいかも。

あと、カレーの味から判断するに、カツハヤシのほうが満足感が高いかもしれない。

京都で研究室出身者の講演会

土曜日は研究室出身者の集いみたいなのがあって参加してきた。下っ端なので気疲れはするけど楽しいし非常に勉強になった。皆さん活躍されているようで、スゲーって言うような仕事をしている方が何人もいて話していて刺激を受けた。僕も頑張らないとなーと思った。

Kさんのディープラーニング系の話で「ニューラルネットワークは結局脳の模倣だから、脳の理解つまり人間のシミュレーションの方向に進んでるとも言える。だから精度の良し悪しだけじゃなくそういった点も踏み込んでいくべき」みたいなことをおっしゃっていて、なるほどと思った。

機械学習ばかりやっている身だと精度のほうに気持ちが行っちゃうけど、もっと本質を追いかける必要はあるよなぁと改めて感じた。そして画像認識なんかは確かに人間の視覚情報処理の模倣とシステムの理解ということになるんだけど、僕が取り組んでいる創薬系でのDLは分子認識というタンパク質が低分子化合物を認識するというシステムの理解だからやっぱり、CNNとはまた違ったアーキテクチャを考え出すのと同時に、入力をどうするか(化合物の正しい入力表現)を考え出す必要はあるよなぁと感じたわけです。

あとは相変わらずN先生は頭良すぎて、さっぱり理解できんかったが、曰く「MO法は行き過ぎた理論」は名言だと思った。あんなに遠くまでデローカライズするようなMOというモデルは化学に沿っていないみたいなことを言っていて、ほうほうと思いながら聞いていた。隣の先輩に「僕もFMOを製薬業界に根付かせたいんですよねー」みたいなことをぼそっと言ったら「お前、そんな危険なチャレンジするのか!怒られるかもよ!!!」と返されたw N先生、何故かFMO大嫌いなんだよねー。FMOなんてMOがデローカライズそんなにしないからっていう経験則で分子を細切れにする方法論だから、「MO法は行き過ぎた理論」っていう考え方を取り入れて実務的に上手くやっている方法だと思うんだけどなぁ。今度どこが問題なのか聞いてみたい。

行きの新幹線の中で読んだ瀬尾まいこ

1475480217

お昼は、高倉二条で蕎麦っぽいラーメンを食べてきた。酸味強め。つけ麺のほうが正解だったのか? わからん。

1475480219 1475480221

同窓会の懇親会。色々出てきて軽食をイメージしてたから面食らった。量も多くて途中でギブしたw

1475480224 1475480226

尚、楽友会館は学生時代住んでいたとこの近所だったので、懐かしさ倍増w

1475480228

帰りに三条をぶらっと歩いてたら立ち飲みっぽいところがあったので入った。

1475480233

ねぎ焼きってほんとにネギしか入ってなくてつまみにちょうどいい。生ビールも自分で入れる方式で外人の旅行者には受けるらしい。二階が民泊になっているらしく外人率が高かったが、フレンドリーな雰囲気の店で楽しかった。

それから、店員さんが高速バスの運転手もやっているらしく、御殿場の方まで行くことがあったらしく。地元ネタとかバスネタが聞けて楽しかった。

1475480231

二日目は京都産ポケモンが少し欲しくて(今のバージョンはどこで取ったかが記録されるので、京都産10Kたまごが欲しかったw)祇園に鯖寿司を調達しに行くついでにイワークの巣となっているらしい丸山公園で一狩りしてきた。

が、暑すぎてとっとと退散w ハガネールに進化できるようになってから改めてイワーク狩りすればいいやw

疲れたので、おかるであんかけうどん。

とろみが葛かな? うまい、最高。

1475480235 1475480238

なんとなくよさげなラベルの日本酒を抱えて帰宅。

1475480240

楽しかったのもあるけど、やはりすごく勉強になったなぁと思う。

Bag of Fragments(BoF)を超えろ

先日Deep Learning創薬の駄文をのせてみたが、

深いニューラルネットワークで特徴抽出っていうのが、chemoinformaticsの文脈だと「フラグメントからファーマコフフォア構築」というのはその通りだと思うんだけど、それがBoW的なECFP4みたいなフィンガープリントでいいのだろうか?pharmacophoreとかCoMFA,CoMSIAみたいな表現に向かうような記述子で出発しないといけないんじゃないかなーと思う

以前@iwatobipenが触れていたNeuralFingerPrintもECFPの特徴抽出プロセスと類似の方法で距離を考慮してないからファーマコフォアにはいたらないと思う。精度がいいのは分散表現のところではないかなぁと思っている(つまり以下の説明)。

Standard fingerprints encode each possible fragment completely distinctly, with no notion of similarity between fragments. In contrast, each feature of a neural graph fingerprint can be activated by similar but distinct molecular fragments, making the feature representation more meaningful.

実際溶解性みたいな分子全体の特徴が重要な場合の予測は非常に改善されているが、薬理活性みたいな分子認識が重要なファクターになっているものはあんまり改善してないように思う。GitHubに実装があるし、精度もいいから予測モデル作る場合にはこれを使うけどね。

ここらへんも似た感じだと思う。如何にもトキシコフォアとかファーマコフォアが学習されるようなFigureが載ってるけど、Catalystとか使ってファーマコフォアモデルを組み立てたり、ドッキングシミュレーションをやりまくった経験からはこれは誤解されそうな説明だなぁと思った。

で本題。最近Molecular Graph Convolutions: Moving Beyond Fingerprintsという意欲作を読んで感動した。

ここまで書いたら中身の説明を書くのに疲れちゃったので興味のある方は是非読みましょう。著者もGoogleとStanfordの人だし、pubmedで出てこなかったらノーマークだったわ。

化合物(グラフとしての)の不変性を獲得するようなCNNのやり方参考になったがプーリングがsumっていうのがそれでいいのかなぁと思った。

f is a learned linear operator with a rectified linear activation function and g is a sum.

ファーマコフォアが記述できるようなDNNの方法ができれば、精度上がるだろうから、測定データさえ増やせるのなら有望じゃないかと思う。

さらにその結果からドッキングシミュレーションの評価関数を作れるだろうから、それを使ってリードホッピングにトライしてもいいから夢が広がる。

ドッキングの精度が高ければモデルでFMO実行してもそれなりに正しそうな結果が出るだろうから、結晶に頼らなくてもモデリングでいけそうだしな。

PyData2016で Deep Learning for QSARという発表があった

slideもあったけど肝心な部分が抜けているので動画を見たほうが面白いです。

10分ぐらい

部分構造の高次表現としてpharmacophoreとして記述されるみたいな感じのスライドがあったけどpharmacophoreは特徴間の距離が非常に重要なのでBoW的な特徴ベクトルでは表現出来ないと思う。n-gram的な考え方を取り入れないと難しいと思っている。でもそれって5-10word離れている単語の関係を評価していくってことだからコスト高なんだよね

22分くらい

chemoinformaticsで目玉焼き


深いニューラルネットワークで特徴抽出っていうのが、chemoinformaticsの文脈だと「フラグメントからファーマコフフォア構築」というのはその通りだと思うんだけど、それがBoW的なECFP4みたいなフィンガープリントでいいのだろうか?pharmacophoreとかCoMFA,CoMSIAみたいな表現に向かうような記述子で出発しないといけないんじゃないかなーと思う。

あとタンパク質とリガンドの相互作用、特に電荷の移動という特徴を持たせられないのも今の記述子の問題ではあると思う。

画像認識と分子認識は色々違うからね。

Mishima.syk #8やりました

発表者のみなさん、参加者のみなさんお疲れ様でした。そして急遽幹事を引き受けてくださった@no85jさんありがとうございました。

今回は日程決定後に僕の都合が悪くなってしまったり、前日にハンズオンの発表者が入院したりとバタバタでしたがw 次回はハンズオンの続きをやる予定です。

懇親会はバルイベントに。もともとのサイトが失効して怪しいサイトになってたり、バルといいつつ、チケットで下着(74)とかサンダル(67)が買えたりと「パンツを肴に飲めっていう深いメッセージか?」みたいなごちゃごちゃ感のあるバルだったけど。かなり楽しめたので良しとしよう。

途中ご当地アイドルとそれに群がるファンみたいなのが居て、ほうこれがヲタ芸ってやつかと感心していたら、あれは動きが全然足らないからヲタ芸未満だと詳しいヒトがバッサリ切り捨てていた。ご当地ヲタ芸が認められるようにヲタの人達もっと頑張ってくださいと思った(余談)。

参加したお店

一軒目 とりう(69)

とり天とビール。美味しかった

1464481110

二軒目 Vanzo

なかなか洒落た店内。ワインと肉

1464481111 1464481113

三軒目 半蔵2

白隠ハイボールと海豚ベーコン。海豚は本当に癖のある匂いだった。これは好き嫌い激しいと思う。海豚刺しはもっと強烈に臭いらしい。二次会のネタになったので良しとしよう。もう一回食べるかと言われたら遠慮する。

みりん干しとかちゃんと匂い消しをしたものは美味しいらしいです。三島に住んでた頃はスーパーによく並んでたけど、富士の方ではみかけないなぁ。

1464481114

二次会はうさぎの木

一次会の感想戦とか色々楽しくおしゃべり出来て満足。

1464481115 1464481117

ここでも肉とかアヒージョを堪能した。

1464481118 1464481119

1464481120

肉の流れで反省会は鈴木屋に決定しましたw

次回のMishima.syk(5/28)の演題が決まりました

タイムテーブルが決定しました。

メインは久しぶりのハンズオン、しかもScikit-learnなのでデータサイエンティストにちょっと興味ある方にはおすすめでしょう。講師は最近ヒットを飛ばした@y_samaです。

他には@iwatobipenによる、実践的なケモインフォマティクスの話と@bonohuの塩基配列DB事情で、EBIあたりの現状がどうなっているかとかのフレッシュ情報をゲットできると思います。

懇親会は、ぬまづ港の街barでぶらっと繰り出した後、みんなで集まってワイガヤする予定です。

参加お待ちしています

Mishima.syk #8やります

今回はScikit-learnのハンズオンをメインにやります。

ついでにGitHub Organizationアカウントを用意してGitHub Pagesの用意もした。

当初Hydeを使おうと色々いじってみたんだけど、ドキュメントが少なすぎてハマった時にめんどくさそうなのでおとなしくJekyllを使うことにした。(個人的にはHakyllいじるのが楽しいと思うけど)

最近Homebrewをリフレッシュしたのでrbenvも入れなおした

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
vim ~/.bash_profile
# add
# export PATH="$HOME/.rbenv/bin:$PATH"
# eval "$(rbenv init -)"

source .bash_profile
rbenv install -l
rbenv install 2.3.0
rbenv global 2.3.0
gem install jekyll

これでjekyllコマンドが使えるようになる。

GitHub Pagesのほうは最初にコミットしちゃうとjekyll new .がこけるのでjekyll new . --forceしないといけない。あとはpushすれば勝手に静的ページを作ってくれるので楽かも。

次回のMishima.sykは5/28の予定です

昨晩の(遅すぎる)新年会できまりました。

内容はscikit-learnのハンズオンがメインですので、予測モデルとか作ってみたいヒトは参加するといいと思います。

尚、静岡のPythonの機運が高まってきたのでShizuoka.pyも近々予定していますので皆さんネタのほうよろしくお願いします。

さて、昨日行ったお店は三島のBeerバーでBeer Windでした。

居心地は良くて楽しかったです。

ゆずホワイト、美味い

1457774309

ミルクスタウト、超美味い。香りが良すぎ

1457774310

プリムス、無難

1457774312

ジェットスターインペリアル、そこそこ美味い

1457774313

今日はちょっと車をディーラーに見せにいったついでに、昔住んでた家めぐりをしてきましたw 徒歩圏内を3箇所くらい移り住んだので(ペット可マンションに移りたくて数百メートル移動したこともあるw)

娘とワンコを連れてよく遊びに行った公園。何もないけどw

1457774314

帰りに弥栄に寄って手火山式の塩ラーメンを食べた。

1457774316

最近色々と思うことのある日々を過ごしている。

MMPを効率的に格納するためのデータ構造

今まではMMPはIDのペアと活性値の差分だけ持っていれば良かったので適当なスキーマのデータベースに放り込んでいたんだけど、Monitoring the Progression of Structure–Activity Relationship Information during Lead Optimizationというアッツい論文を読んでから、うちでもMMSとかSARM_disc_scoreとか出したいと思っていたが、やる気が無いので放置していた。

最近データベースを作りなおす機会があったので構造も新しく考えてみた。

MMPはCore(共通骨格)とペアのそれぞれのフラグメントに分けられるのでone-to-manyで割とシンプルにかけるんだけど、それぞれのFragmentからのbackrefをmmpsにしちゃうとエラーが出るので変なナンバリングしないといけなかった。

from sqlalchemy import Column, String, DateTime, Float, Integer, ForeignKey
from sqlalchemy.orm import relationship
from MMP.database import Base

class MMP(Base):
    __tablename__ = "mmps"
    id = Column(Integer, primary_key=True)
    core_id = Column(Integer, ForeignKey('cores.id'))
    fragment1_id = Column(Integer, ForeignKey('fragments.id'))
    fragment2_id = Column(Integer, ForeignKey('fragments.id'))
    activity_id = Column(Integer, ForeignKey('activities.id'))
    compound1_id = Column(String(6))
    compound2_id = Column(String(6))
    fragment1 = relationship("Fragment", foreign_keys='MMP.fragment1_id', backref="mmps1")
    fragment2 = relationship("Fragment", foreign_keys='MMP.fragment2_id', backref="mmps2")

    def __init__(self, **kargs):
        self.compound1_id = kargs["compound1_id"]
        self.compound2_id = kargs["compound2_id"]

    @property
    def mmp_id(self):
        return "{}-{}".format(self.compound1_id, self.compund2_id)

class Core(Base):
    __tablename__ = "cores"
    id = Column(Integer, primary_key=True)
    mmps = relationship("MMP", uselist=True, backref="core")
    smiles_string = Column(String(255), unique=True)

    def __init__(self, **kargs):
        self.smiles_string = kargs["smi"]

class Fragment(Base):
    __tablename__ = "fragments"
    id = Column(Integer, primary_key=True)
    smiles_string = Column(String(255), unique=True)

    def __init__(self, **kargs):
        self.smiles_string = kargs["smi"]

実際のデータはMMPクラスと活性クラスをひも付けてあるのでSARM_disc_scoreとかMMSの抽出とか簡単になるはず。