ChemPlotを使ったケミカルスペースの可視化

ChemPlotとは

化学空間(ケミカルスペース|chemical space)を可視化することを目的としたケモインフォマティクスツール。
(要は、沢山の分子構造からなるデータセット中の各分子を、2次元上(のグラフ)にいい感じにプロットしてくれるライブラリ)

RDKitのフレームワーク、scikit-learn API、umap-learn APIを使用している。

(公式ドキュメント)

ChemPlot is a cheminformatics tool whose purpose is to visualize subsets of the chemical space in two dimensions. It uses the RDKit chemistry framework, the scikit-learn API and the umap-learn API.

ChemPlotの概要

できること

  • Dimensionality Reduction:t-SNE, PCA, UMAPを用いてデータの次元を削減できる。
  • Similarity Analysis:指標に基づいて分子の類似性を評価し次元削減できる。
  • Visualize the Chemical Space:静的なグラフと動的(interactiveな)グラフを作成できる。
  • Clustering Data:k-meansによってクラスタリングした結果も合わせて表示できる。
  • Additional Features:六角の瓶プロットやカーネル密度推定の結果を可視化できる。

データセット

chemplotには、下記のサンプルデータセットが準備されている。

IDNameTypeSize
C_1478_CLINTOX_2Clintox (Toxicity) 1 2 3 4Classification1478
C_1513_BACE_2BACE (Inhibitor) 5Classification1513
C_2039_BBBP_2BBBP (Blood-brain barrier penetration) 6Classification2039
C_41127_HIV_3HIV 7Classification41127
R_642_SAMPLSAMPL (Hydration free energy) 8Regression642
R_1513_BACEBACE (Binding affinity) 5Regression1513
R_4200_LOGPLOGP (Lipophilicity) 9Regression4200
R_1291_LOGSLOGS (Aqueous Solubility) 10Regression1291
R_9982_AQSOLDBAQSOLDB (Aqueous Solubility) 11Regression9982

基本的な使い方

インストール

(その他, RDkitのインストールが必要)

conda の場合

conda install -c conda-forge chemplot

pip の場合

pip install chemplot

モジュールインポート〜データの準備

今回はBBBP(blood-brain barrier penetration) のデータセットを使用してみる。
2039の化合物のSMILES形式の化合構造データと、(血液脳関門)透過性のラベル(0 or 1)のデータが格納されている。

import matplotlib.pyplot as plt
from chemplot import load_data
from chemplot import Plotter
import matplotlib.pyplot as plt

data_BBBP = load_data("BBBP")
data_BBBP.head()
smilestarget
0[Cl].CC(C)NCC(O)COc1cccc2ccccc121
1C(=O)(OC(C)(C)C)CCCc1ccc(cc1)N(CCCl)CCCl1
2c12c3c(N4CCN(C)CC4)c(F)cc1c(c(C(O)=O)cn2C(C)CO...1
3C1CCN(CC1)Cc1cccc(c1)OCCCNC(=O)C1
4Cc1onc(c2ccccc2Cl)c1C(=O)N[C@H]3[C@H]4SC(C)(C)...1

Plotterオブジェクト作成〜次元削減・可視化

Plotterオブジェクトは、ChemPlot内の可視化用関数が全て含まれてるクラス。
今回はfrom_smilesメソッドを使用して、smilesのリスト、それらのターゲット値、ターゲットタイプ(Cはclassificationの意味)をオブジェクトに渡す。

Plotterオブジェクトを構築する際に、ライブラリ mordredを用いて各SMILESの記述子(descriptor)が計算され、目標値に基づいて選択される。
選択された記述子を種々のアルゴリズム(t-SNE, PCA, UMAP)を適用することで、各分子の次元数を2つに減らして2次元に可視化できるようにしている。

# まずはPlotterオブジェクトを作る。
cp = Plotter.from_smiles(data_BBBP["smiles"], target=data_BBBP["target"], target_type="C")

# tsneでの次元削減と可視化を実行する(dfには次元削減後のpandasがデータ格納される)
df = cp.tsne()
cp.visualize_plot(size=10)

Similarity Analysis

各分子から構成される化学空間(chemical space)を2次元グラフ上にプロットする際に、各分子をどのように配置するか決定するかの指標として分子の類似性の概念が用いられる。
類似している分子は2次元上で近くに配置され、あまり似ていない分子は離れた点として配置される。

ChemPlotでは、分子の類似性の指標に関して、構造的な指標(Strutural)テーラーメイドの指標が(tailored)が用意されていて、
Plotterオブジェクトの引数 simtype で選択できる。(デフォルトはtailored)

structural

構造の類似性を、異なる二つの分子で共通のフラグメントの数と次元で定義している。2つの分子で共通するフラグメントの数と次元が大きいほど、構造が類似しているとみなす。
フラグメントはECFP4(Extended-Connectivity Fingerprints)を持ちいて生成している。

tailored

ターゲットの特性を考慮して分子動詞の類似度指標を計算する。
一般的な記述子のセットを計算するのではなく、ターゲットの値に対して最適化されるように類似度指標を計算している。

from chemplot import Plotter, load_data
data_BBBP = load_data("BBBP")

#structural
cp_BBBP = Plotter.from_smiles(data_BBBP["smiles"], target=data_BBBP["target"], target_type="C", sim_type="structural")
cp_BBBP.tsne()
cp_BBBP.visualize_plot(size=8, title='t-SNE plot structural')

#tailored
cp_BBBP = Plotter.from_smiles(data_BBBP["smiles"], target=data_BBBP["target"], target_type="C", sim_type="tailored")
cp_BBBP.tsne()
cp_BBBP.visualize_plot(size=8, title='t-SNE plot tailored')

structural

tailored

Dimensionality Reduction

機械学習のアルゴリズム(PCA、t-SNE、UMAP)を使って、各分子の次元数(特徴量)を2つに減らし、2次元のグラフを作成する。

from chemplot import Plotter, load_data

data_BBBP = load_data("BBBP")
cp_BBBP = Plotter.from_smiles(data_BBBP["smiles"], target=data_BBBP["target"], target_type="C")

PCA

(参考:主成分分析の概要とpython実装
分子データセットの2つの主成分を計算する。
軸には(おそらく)累積寄与率の値が記載される

cp_BBBP.pca()
cp_BBBP.visualize_plot(size=8)

t-SNE

(参考:t-SNEを理解して可視化力を高める
t-SNEでは データセットのグローバルな構造はほとんど失われてしまうが、局所的な構造はよりよく保存されているため、
類似した特性を示す分子群のクラスターを明確に可視化することができる。

主なパラメータ

  • perplexity(int>0):近傍領域の大きさを指定する。推奨値は5〜50。この値が大きいほど分析される近傍領域は広くなる。

  • pca(Boolean):pcaで前処理をする(True) or しない(False)を指定。前処理をすることでプロット生成の時間を大幅に短縮することができる。

cp_BBBP.tsne(perplexity=5,pca=True)
cp_BBBP.visualize_plot(size=8)

UMAP

(参考:UMAP 論文を読む

t-SNEと同じように次元を縮小する際には分子同士の局所的な近傍をみる。UMAPはデータセットのグローバルな構造をより保持することができる。
さらに、t-SNEよりも計算効率が高く高速なアルゴリズム

主なパラメータ

  • n_neighbors(int>0):アルゴリズムが解析する局所近傍領域の大きさ。この値が小さいと局所的な構造を可視化する。
  • min_dist(float:0.0〜0.99):2Dグラフで許容される点の最小距離
  • pca(boolean):pcaで前処理をする(True) or しない(False)を指定。前処理をすることでプロット生成の時間を大幅に短縮することができる。
cp_BBBP.umap(n_neighbors=5,min_dist=0.99,pca=True)
cp_BBBP.visualize_plot(size=8)

Visualize the Chemical Space

ChemPlotではstaticなグラフとinteractive(動的)なグラフの2種類のグラフを作成することができる。
動的なグラフを作成する場合はinteractive_plotメソッドを実行する。

data = load_data("BBBP")
cp = Plotter.from_smiles(data["smiles"], target=data["target"], target_type="C")

cp.tsne()
cp.interactive_plot(show_plot=True)

(カーソルを合わせると分子構造が表示される)

Clustering Data

ChemPlotでは、sklearnの KMeans(k近傍法)を利用してクラスタリングした結果も合わせて表示することができる。

cp.cluserメソッドでクラスタリングを実施し、visualize_plotの引数でclusters=Trueを指定する。
(引数 clustersは、整数のリストや int を指定するこで、特定のクラスターを色付けして表示することも可能)

from chemplot import Plotter, load_data

data = load_data("LOGP")
cp = Plotter.from_smiles(data["smiles"], target=data["target"], target_type="R")
cp.umap(random_state=500)

# クラスタリングを実施
cp.cluster()
cp.visualize_plot(size=8, clusters=True)

# cluster0 を選択

cp.visualize_plot(size=8, clusters=0)

# cluster 1,2,3 を選択

cp.visualize_plot(size=8, clusters=[1,2,3])

Additional Features

散布図とは別に、化学空間(chemical space)の密度分布を、六角形のビンプロットやカーネル密度推定プロットで描画することができる。
(visualize_plotの際の引数'kind'で指定する)

data_BBBP = load_data("BBBP")
cp_BBBP = Plotter.from_smiles(data_BBBP["smiles"], target=data_BBBP["target"], target_type="C")

# Hexagonal Bin Plot
cp_BBBP.tsne(random_state=0)
cp_BBBP.visualize_plot(size=8, kind="hex")

# Kernel Density Estimate Plot
cp_BBBP.visualize_plot(size=8, kind="kde")

Hexagonal Bin Plot

Kernel Density Estimate Plot

参考

参考書籍