いろいろ倉庫

KNIME、EXCEL、R、Pythonなどの備忘録

【KNIME】化合物のChEMBL IDから構造情報を纏めてとってきたい

・諸般の事情で、化合物のChEMBL IDのリストと活性情報が手に入ったが、構造情報が付与されていなかったとする。

・化合物数が10や20なら個別に構造を検索しても問題ないだろうが、それが数十、数百にもなるといよいよ面倒になってくる。

・そこで、ChEMBLのREST APIとKNIMEを使って情報を引っ張ってくることにした(下図)。

www.ebi.ac.uk

・今回使ったのは、IDからMoleculeを検索するもののうち、Listで一度にたくさん検索できるもの(下図の一番下)。StructureとかCompoundとかいろいろあるが、Moleculeでないと私は構造を釣ってこれなかった。

f:id:choron81:20220401150117p:plain

・中段のものが最もシンプルで、化合物のChEMBL IDを一つ入れれば一つ分の情報が返ってくる。下段のようにIDs_listにすれば、一度にたくさんの化合物の情報を釣ってこれると直感的に感じるが、表記方法が分からず苦労した。

・化合物のChEMBL IDを二つ並べて、表記方法を思いつくだけやってみたところ、セミコロンでID同士を繋げることで、別々のIDとして認識・処理された(半角スペースでもカンマでもPythonのList表記でも駄目だった)。

 

・例えば、以下のように化合物のChEMBL IDが与えられた場合にSMILES列を追加することを考える。

f:id:choron81:20220401151341p:plain

・以下のワークフローを組んでみた。

f:id:choron81:20220401152145p:plain

・工程は以下の通り。

①ChEMBL IDをセミコロン区切りでまとめたい。Column Combinerを使うために、とりあえずChEMBL IDを転置し、Column Combinerでくっつけてセミコロン区切りでまとめた(Column Combinerの出力は下図。右端の列に目的のものができている)。

f:id:choron81:20220401152228p:plain

②①で作成したcombined stringを使って、APIを作成し、Get Requestで情報を引っ張ってくる。APIを作成するためのString Manipulationの設定は以下。https://www.ebi.ac.uk/chembl/api/data/molecule/set/のあとにIDs_listをくっつける。GET RequestのDelayは十分に長くとり、サーバー負荷に配慮する。TimeOutも短すぎるとすぐにオーバーする。

f:id:choron81:20220401152418p:plain

XPathノードを用いて、得られたXMLから必要な情報をTableとして抜き出す。今回はChEMBL IDとSMILESを抜き出す(以下、XPathノードの設定)。

f:id:choron81:20220401152740p:plain

④不要な列を削除する。出力ポートは以下の通り。

f:id:choron81:20220401153015p:plain

・ここまでで構造をとってくることはできる。せっかくなので、Molecular Type CastノードでSMILESの列を構造型に変換し、表示を弄るとそれっぽくなった(下図)。
f:id:choron81:20220401153231p:plain

 

終わり。

 

 

【KNIME】列をセミコロン区切りでくっつけたい

・諸般の事情で、別々のセルに分かれている文字列をセミコロン区切りで一つにまとめ上げたいケースがあった。

・以下の例でいえば、それぞれの行に対して、「A;B;C」と「あ;い;う」という列をまとめた列を作成するイメージ。

f:id:choron81:20220401144551p:plain

・なんとなく、ノード検索で"combine"と調べてみたら、それっぽいノードが見つかった(下図)。Column Combinerノードを先の表にくっつけて実行すると、デフォルトでStringはクオーテーションで囲まれ、カンマ区切りでくっついた。

f:id:choron81:20220401144724p:plain

・Column Combinerノードの設定を少し弄ると、目的の処理を実行できた(以下)。

f:id:choron81:20220401145141p:plain

・何かの役に立つかも。

 

終わり。

 

【KNIME】ParameterをOptimizeしたい。

機械学習のハイパーパラメータを最適化したいと思って調べてみたところ、以下のKNIME Hubの記事が参考になりそうだった。

hub.knime.com

・まず、Parameter Optimization関連のノードを使うためには、Extensionをインストールする必要がある(以下)。

・次に、ワークフローを組んでみた(下図)。以前のCross Validationの記事で作成したワークフローをベースに、Irisの分類問題をRandom Forestで解く際のハイパーパラメータを最適化することを考える。

・下半分はデフォルトのハイパーパラメータを用いた場合、上半分は最適化のためのループを組み込んだ場合。モデルの良し悪しは、とりあえずAccuracyで判断する。
・Parameter Optimization Loop Startの設定は以下の通り。振るパラメータとして、決定木の数と深さを設定し、どれだけのレンジで、どれだけの間隔で振るか設定した。パラメータの名前は、出力されてそのままValiableになる。探索手法はいろいろ選べるが、今回は総当たりにした。

・Random Forest LearnerのFlow Variableに先のハイパーパラメータのFlow Variableを設定する。

・Parameter Optimization Loop Endで、どの指標を見て条件を最適化するかを選択する(設定は下図)。今回は、Accuracyを最大にしたい。

・結果は以下の通り。最適化プロセスを経た場合はAccuracyが0.96になるモデルを得られた。ちなみに、デフォルトのハイパーパラメータでのAccuracyは0.953だった。

・Parameter Optimization Loop Endの下側の出力ポートでは、試したハイパーパラメータそれぞれにおけるAccuracyを見ることができる(下図)。

・ハイパーパラメータをきちんと理解しながら最適化しなければならないなぁと感じた。

 

終わり。