KNIMEを使ってChEMBLから情報をとってくるンゴ
なんだか、最近巷ではなんJ民が溢れているそうですね!
おさぼりおじさんが、日中よく読んでいる*1というyahooニュースで取り上げられているくらいなので、間違い無いですね。驚きですね。
さて、毒吐きから始めてしまいましたが、今回はKNIMEを使ってChEMBLから情報を取ってくる例を紹介しようと思います。
最初にポイントを2点!
- ChEMBL db Connectorというお手軽簡単ノードがKNIMEにはあるよ⭐︎
- ChEMBLもREST APIに対応しているので、いろいろ工夫して情報が取れるよ!
という内容について紹介します。
例としてはNS5Bポリメラーゼ阻害剤について情報収集してみようと思います。
ソバルディのやつです。
TargetのIDとしてCHEMBL5375(uniprot : Q8JXU8)が割り当てられいます。*2 *3
今回は"CHEMBL5375(uniprot : Q8JXU8)"を出発時に入力情報とする、次のようなフローについて順に紹介します。過去記事とかぶる内容もあるので、該当箇所はリンク等を活用することにして、解説は軽めにします。
*1:息抜きレベルを超えて、がっつりと芸能ニュースを読んでいるのをみると、正直ムカつきますね
*2:ソホスブビル:CHEMBL1259059のターゲットとしては、CHEMBL379(Hepatitis C virus)、CHEMBL395(HepG2)、CHEMBL382(CCRF-CEM)、CHEMBL612545(Unchecked)の4種が紐付いています。キャプチャでは【Approved Drugsとしてのソホスブビル】のメカニズムとしてCHEMBL5375が紐付いているため、今回のCHEMBL5375を基準とする検索ではソホスブビルはhitしてきません。自分の知りたい内容がちゃんと含まれるか否か、よく確認する必要があるので、お手軽簡単ほほいのほい!で済ませすぎるのはあまりお勧めはできません。
*3:chemblの作りに興味のある方がいるかもなので、chembl_23の構成図を載せておきますね。化合物情報を仲介役としてターゲット情報と上市薬情報は繋がっていますが、ターゲット情報と上市薬情報は直接繋がってはいないことがわかると思います。
KNIMEで明日の天気を調べよう! 〜REST APIの活用〜
今回はKNIMEを使って、明日の天気予報を調べてみようと思います。
…このこと自体に大して意味はありません。
ポイントは
KNIMEはweb上の情報も取得することができる
という点です。
色んな方法があるのですが、今回はわりと分かりやすい「REST API」を活用した方法を紹介しようと思います*1
例として取り上げる題材は、無料&内容が分かりやすいLivedoor天気情報を利用させていただくことにします。
上リンクの内容を確認していただくと次のような記述があります。
(例)「福岡県・久留米の天気」を取得する場合
下記URLにアクセスしてJSONデータを取得します。
基本URL + 久留米のID(400040)
REST APIという方法の正確な解説は私にはちょっと難しいですが、ざっくりと言うと
「Livedoorさん!(http://weather.livedoor.com/***/)、JSONという形式で(json/v1/)、久留米(?city=400040)のお天気情報を教えてください」
という呪文を詠唱すると、希望通りの情報を召喚できるというものです。
呪文の唱え方としては、例えばwebブラウザのアドレスバーににhttp://*****/400040を入力してgoすると次のように久留米のお天気情報が返ってきます。
文字コードの関係で、ちょっと見苦しいキャプチャですが、こんな感じです。一見汚そうに見えますが、これはJSONという形式で書かれた綺麗な情報です(後述)!この中から、必要な情報をKNIMEを使って抜き取れば良いということです。
ということで、全国分の明日のお天気をKNIMEを使ってgetしてみようと思います。
フローの全体像としては次の通りです。
上下の2つに分岐していますが、やっていることは同じです。両方とも紹介します。
それでは最初から順を追って解説していきます。
*1:webページのhtmlをそのまま取ってきたり、SPARQLのEndpointに繋いだり、できることはたくさんありますよ!
Neural Network Consoleで活性値予測をしてみた
SONYからNeural Network Consoleというのが公開されましたね(以下NNC)。
これの良し悪しを議論できるほどの知識は私にはないです。でもGUIツールということで、とりあえず使ってよう!という試みです。セットアップの方法などは公式に書かれていますので、そちらを参考にしてください。
さて、なにをやってみようかなと考えたのですが、私は仕事柄、画像認識をあまり活用できる身近な内容があまり思いつかなかったので、数値(阻害活性値)の予測をしてみることにしました*1
チュートリアルには画像の分類(MNIST)が書かれているのですが、画像以外の形式を入力にする例はあまり紹介されていません。私はこの記事を参考にしました。
この内容に従えば、とりあえず動きます。ざっくりというと、
の2つがあればいい。という内容です。
データのcsv
今回の場合は、ただの0,1が1024列並んだcsvが化合物ごとに必要ということです。上記はcompound-0についてのもの。これが1つの場所にたくさんある状態が必要です。
これ、誰でも簡単に用意できるものなのでしょうか?
KNIMEを使えば、結構簡単ですよ。過去記事の内容ですべて網羅できますので、あとでちょっと解説します。
データセットのcsv
これは何を指すかというと
ラベルとは、今回の場合「正解の数値」ですし、分類をしたいならred, blue, greenなどの「正解の種別」に該当するものです。今回は活性値(-1~1にして欲しいみないなので、pIC50を10で割りました)。このリストを作る時もKNIMEで簡単に作れます。
ここまでで紹介した2種の準備物を作成するフローをキャプチャしました。
ちょっと細かいですね。
過去記事のリンクを活用しながら、ざっくりと解説します。
fingerprint関連
sdfを読んだ後です。化合物のIDとpIC50が入ってます。構造も入ってますが、自分のデータなので見えないようにしてあります。*2
これにFingerprintsというノードを繋げます。
設定画面はこんな感じです。特に意味はありませんが、Circular-ECFP4を今回は選びました。これを実行した後にExpand Bit Vectorというノードをつなげると0,1のビットが1024個、個別のカラムに分割されます。
この内容のpIC50をnormalizeします。
normalizerの設定画面です。乱暴かなと思いましたが、単純に小数化しました(キャプチャ左下)。
続くColumn RenameでpIC50というカラム名をpIC50_normalに変更し、Column Filterで構造式のカラムを捨てました(fingerprintを出したので、もういらない)。
データファイル作成
Loopを使って1行ずつ読み込み、csvに書き出します。分岐上側では、変数化された化合物のIDを「所望の場所+化合物のID+拡張子」になるようにしています。分岐下側では化合物IDとpIC50_mormalを捨てて、fingerprintのみ(学習に使う入力値のみ)になるようにfilterしています。
上側分岐からきた変数をファイル名として、csvファイルを書き出します。書き出し時には、カラムヘッダは入れません。また、クオートもつけないように指定しました。文字コードはUTF-8としました。各種タブにて設定可能です。
ここまでで、冒頭のファイルいっぱい状態が出来上がりです。
データセット作成
データをたくさん格納した場所をList Filesで指定します。続けてURL to File Pathを繋ぎます。するとFile nameというカラムができますが、これは今回の例では化合物のIDとして作成してあります。ですので、元のデータの化合物IDとfile nameでアノテーション(joiner)したあとに、いらない項目を除けばおおむね完成です。
データの場所と、活性値(正解の値)だけのテーブルができています。NNCのお作法に従ってカラム名は
- ファイルの場所→【x:data】
- 正解値→【y:label】
に変更します。このtableを学習用と評価用に分割すれば準備完了です。partitioningノードでは様々な方法でデータを分割できます。今回はランダムに80:20に分割しました。この分け方とかも、deeplearningには重要なんだと思いますが、今回はあまり気にしていません。
最後にそれぞれをcsvとして書き出しました。
NNCの画面
とりあえず、1024→100→1という感じにしました。最適化法はデフォルトのままでadam、lossはsquared errorにしました。勉強を始めようとしているところなので、意味ねーよこんなのという内容でしたら申し訳ありません。いろいろ教えてくださる方がいると助かります。
これで学習するとこんな感じのようです。
評価結果はこんな感じ。
y:labelが正解(pIC50を10で割ったやつ)、y'が予測値になります。
この画面で、右クリックすると内容をcsvで書き出すことも可能です。
書き出したcsvをKNIME上でグラフにしてみました。
ファイルを読み込んで、2D/3DScatterplotにつなぎます。
ちょっと見にくいですが、横軸がy:label(正解)・縦軸がy'(予測値)です。r^2 = 0.59となっています。なかなかの相関ではないでしょうか?繰り返しになりますが、結構狭い範囲での学習・予測なので(ケモタイプが絞られてる)、新たなケモタイプについて予測値を出そうとすれば大外れすると思います。でも、簡単に予測値を出すことができて結構楽しいです。
さて、キャプチャのplotですが、はっきり言ってダサいですね。綺麗じゃないというか、こなれてないというか…。
そうなんです。個人的な意見ですが、KNIMEは可視化に関してはあまり強くはないと思います。情報は得られるがかっこよくない。ですので、私は整形したファイルをspotfireなどに読ませて可視化部分を担当させています。
spotfireは有償なので、オープンソースでかっこよく描画ができるものがあるといいなーと思っています。グラフ内でインタラクティブに動かせるやつがいいです。(ご存知の方がいれば教えてください)
今回は、雑記ということでKNIMEに関する紹介は少ない&雑でしたが、いかがでしたか?私は末端の合成化学者ですので、データ解析や機械学習などについてあまり知識はありませんが、興味はもっています。現役でベンチワークしてますので、あまり勉強する時間が取れないのですが…。
周りにあまり詳しい人もいないので、いろいろと教えてくれる人がいるといいなーと思っています。何かブログ内で間違ったいる部分の指摘とか、色々な関連する面白い技術とか、コメントお待ちしていますので、もし気が向けば宜しくお願いします。
もちろん、ただの感想でも結構です。
ではまた次回!
【KNIME】ノード紹介:Parallel Chunk Start 〜多重影分身するってばよ〜
今回の記事は短めですが、活用できる場面にかなり高い確率で遭遇できると思います。
どんな場面かというと…
この処理、重いんですけど!
という時です。
そんな時は、Parallel Chunkを使いましょう!
Parallel Chunk Start (End)
重たい処理の前後をParallel Chunk StartとEndで挟むことによって、その区間内の処理を分散させて並列処理をすることができます。
今回は、以前に紹介したRenderer to Imageについて並列処理をしていこうと思います。
Loopを使って、複数のファイルを読む方法について紹介した記事の例題で作成した、4335化合物のデータを持つテーブルの構造式部分を画像ファイル(png)に変換しようとする場面を想定してください。
Renderer to Imageノードを接続すれば目的は達成できるのですが、ちょっと処理に時間がかかるんです。私の場合は約100秒かかりました。
やっぱり、ちょっと重い作業を一人で抱え込むのはよくないですよね。そこで、分身を作って作業を分散させるのがParallel Chunkです。
続きを読む【KNIME】ノード紹介:Group Loop Start 〜カテゴリごとに処理したい〜
先日、KNIMEでloopを回すにはどうするか?という記事を書きました。割と興味を持っていただけたのか、たくさんブックマークもして頂きました。ありがとうございます。
こんなニッチな内容でも読んでくださる方がいるというのは嬉しいですし、今後も頑張って書いてみよう!とモチベーションも上がりました。
私も分からないことの方が多いです。もし、もっとお詳しい方がいらっしゃれば、是非コメントなどいただけると嬉しいです。
さてさて、上のリンク記事の例題は、複数のファイルを一気に読むというものでしたが、今回はその逆で
【データの内容を複数のファイルに書き出す】
という作業について紹介してみようと思います。
例では、もう少しひねくれて"1つのエクセルファイルに複数のシートとして分割させる"という内容にしてみました。
キャプチャに掲げたように、以前の例で紹介したfile_0 ~ file_9をひとまとめにして出来上がったテーブルを、シート名を元のファイル名とした1つのエクセルファイルに書き出してみます。
全体像のキャプチャを載せます↓
基本的には赤枠の部分(青枠を除く)で目的は達成できますが、もう少しおまけ要素を盛り込みました。緑枠部分は過去記事を参照いただければと思います。
それでは順に紹介していきます。
続きを読む
【KNIME】小ネタ:** to variableノードを使わない変数の作り方
ここ何回かの記事で、変数を使った内容を書きました。
-
【超入門】KNIMEで変数を使うには 〜今日の日付をエクセルのシート名にして書き出してみよう〜 - 非プログラマーのためのインフォマティクス入門。(仮)
-
【超入門】Loopを回せ! 〜KNIMEを使って複数のファイルを一気に読んでみよう〜 - 非プログラマーのためのインフォマティクス入門。(仮)
個人的には、変数に関しては「これが基本かな?」という方法を書きましたが、他にも何かしらの値を変数に指定する方法があるので、2つ紹介します。
Workflow内のどこでも使えるglobalな変数
この場合は、変数は固定値になりますが。
まずはKNIME explorerの中から、指定のflowを選び右クリックメニューを出します。今回の例ではtest10という名前のflowです。メニューの中にWorkflow Variables...というのがあるので、選択します。
次のような新たなウインドウが開くので、addを選びます。今回の例ではfix_valueという名前の変数を設定することにします。タイプは整数値、値は2として設定します。
入力が終わったらOKします。
これでおしまいです。このworkflow上では、どこでもfix_value(値は2)という変数が使えるようになっています。確認してみます。
以前にちょっと紹介したTable Creator使って、1から9が入っているテーブルを作りました。Tableというタブではなくて、Flow Variablesというタブを探して内容を確認すると確かにfix_valueという変数名で2という値を持っていることが分かります。
続きを読む
【超入門】Loopを回せ! 〜KNIMEを使って複数のファイルを一気に読んでみよう〜
勝手に偉そうな命名をした"超入門シリーズ"ですが、これまでに
について紹介してきました。
さていよいよ今回はループの回し方について紹介したいと思います。
この3つが揃えば、データサイエンティストやプログラミングガチ勢ではない、私のような専門外の人間でも、ある程度のルーチンワークをKNIMEにお願いすることができるようになります。
今回は例として、
【複数のファイルを一気に全部読み込む】という作業にtryしてみます。
読み込むファイルの形式はsdfというものにして説明しますが、エクセルでもcsvでも、大体流れは同じです。
さて、状況のイメージです。
ひとつのフォルダに読みたいファイルが全て入っているものとします。今回の場合は、testという名前のフォルダにfile_0.sdf ~ file_9.sdfという10個のファイルが格納されています*1。これを一気に読んでいこうと思います。
あんまりピンとこないでしょうか?
- 10人から集めたファイルを一つにしたい
- 毎月のレポートを10ヶ月分まとめて解析したい
などなど、色んな場面が考えられると思うので、皆様の状況によく合うものをイメージすると活用に繋がるのではないでしょうか?
それでは、KNIMEの操作について紹介します。
*1:ファイルの日付に注目して下さい。全部同じ時間ですね。今回の例題として使った10個のファイルは、もともと1つだったファイルをKNIMEを使って私が10分割したものです。これもloopを使った処理により作成しています。色々簡単にできます