技術資料
研究背景
- 有機合成では効率性や環境面から化学反応の設計に生体触媒(酵素)が利用される機会が増加
- 酵素は化学触媒よりも環境に優しく,特定の反応物に強く作用して化学反応を早く進める
- 酵素は4桁のEC番号で分類されている
- EC番号を機械学習で予測することで,酵素分析(以下)を行う実験コストや時間の削減になる
- 代謝経路の解析で得られた未知の酵素の性質の特定
- 特定の化学反応を触媒する酵素の探索
0.1 環境構築
本プログラムはAnaconda上で実装する
Anacondaインストール
以下のページからインストール
https://www.anaconda.com/download#downloads
rdkitチャネル(仮想環境)の作成
仮想環境の補足
- Anacondaは通常"base"と呼ばれるチャネル(仮想環境)を用いるが,新しいチャネル"rdkit"を作る
- バージョンが1.0.2(2021年版)のscikit-learnを用いるため,メイン環境として"base",本技術資料のの再現環境として"rdkit"を用いることを推奨
手順
WindowsボタンからAnaconda Promptを開く
バージョン取得
python -V
rdkitチャネル作成
# 研究当時のバージョン
conda create -n rdkit python=3.8.8 -y
※baseチャネルからrdkitチャネルに変更(Anaconda Prompt)
conda activate rdkit
rdkitライブラリの導入(pipでは不可)
conda install rdkit -c conda-forge
jupyterカーネル導入
pip install jupyter environment_kernels
jupyter起動
jupyter notebook
Jupyterのプログラムを起動するとき
anaconda promptを起動し,(base)の部分で以下を入力
(base) C:\Users\~~~>activate rdkit
base→rdkitに切り替わったら,Jupyter起動
(rdkit) C:\Users\~~~>jupyter notebook
- インストールしたモジュールはbaseではなく,rdkitチャネル内のディレクトリに保存される
ディレクトリを辿って「master_ECprediction」まで行き,「~.ipynb」を起動する
0.2 プログラム実行時の補足
実行するプログラムファイル
以下2ファイルで構成される
- 機械学習に用いるデータセットの作成を行う「ECprediction_dataset.ipynb」
- データセットから多クラス分類モデルを作成し,EC番号予測を行う「ECprediction_model.ipynb」
プログラムの取り扱い説明
- プログラムはそれぞれセルで分割されており,1セルずつ順次実行していく
- 計算に時間がかかる箇所の状態確認が重要のため,通常のPythonファイルとは異なり,あえてプログラムを分割している
- セルをクリックし,shift + enterでセル内のプログラムを実行できる
- 変数名,もしくはprint(変数名)をセルの下部に記載することで変数の中身を確認可能
- 初回時は最上セルのpipインストールでモジュールを導入
リスタートポイントについて
途中からプログラムを実行できるようにあらかじめ保存したファイルを読み込み再開できる仕組み
- 上部セルのimportを実行したあと,任意のリスタートポイントから実行可能('''のコメントアウトを外す)
- プログラムを完全再現するのに8日程度かかるため,実行時間が長いセルは飛ばし,最寄りのリスタートポイントから次のセルに進むことを推奨する
- 実行時間(Intel Core i7-9700K 3.6GHz の場合)を参考にして次に進む
- 特に各反応式の特性値の計算,記述子選択,パラメータ調整に多大な時間がかかる
- リスタートポイントから読み込まれるファイル名の語尾には「0」を記載し,通常実行で保存されるファイルと区別している
1.1 モデル構築用データセット作成(ECprediction_dataset.ipynb)
1.2 プログラム順次実行
モジュールインストール
pip install rdkit
元データセットを1つの化合物SMILESに分解
- 元データセット*1は,左辺と右辺のSMILESを連結している
- 左辺と右辺を隔てる'|X.X.X.X>>'と,第1項~第N項を隔てる'.'に着目し,左辺のSMILESリスト,右辺のSMILESリストに分解
- MetaNetXにおけるEC 2.A.3.1などのデータは削除している
- 2次元配列のleft_sms,right_smsにそれぞれ格納
特性値計算不可の化合物SMILES削除
SMILES形式の化合物から210種の特性値を計算する際,発散値を持つ化合物が存在するため,そのような化合物を除去
リスタートポイント1から5の前までのセル
- 右辺左辺から全ての化合物(51478個)を抽出し,RDKit構造オブジェクトに変換(~初めの3セル).
- 1化合物に208種類の特性値を計算し,発散値とnan値を持つ削除化合物リストの作成(~リスタートポイント4)
- バージョン依存の関係から2種の記述子を除外して実行
- SMILES反応式の左辺と右辺を走査し,削除化合物リストを含む反応式を除去(~リスタートポイント5手前)
整理された左辺と右辺のSMILES反応式データフレームが出力される(left_smsDF5, right_smsDF5)
210次元特徴ベクトルの作成
リスタートポイント5から最後までのセル
- 左辺と右辺のSMILES反応式をRDKit構造オブジェクトに変換(~初めの3セル)
- 構造オブジェクトでは計算不可の特性値を持つ化合物を検索できないため,検索後もう一度変換
- 左辺,右辺それぞれの化合物に対して,210種類の特性値を計算(~リスタートポイント6)
- 重い処理のため,Jupyter以外のブラウザやプログラムを閉じることを推奨
- 左辺の各特性値の和と右辺の各特性値の和の差を取り,210種の特性値変化量を要素に持つ特徴ベクトルを作成(~最後のセルまで)
2. EC番号分類モデルの作成,テストデータの分類
「ECprediction_model.ipynb」を実行
モジュールインストール(多クラス分類,SMOTE用)
pip install scikit-learn==1.0.2
pip install imblearn
データ数が5個以下のものを削除する
- 層化5分割交差検証を実行するためにはデータ6個以上必要
- 6個では学習:テスト = 4:1分割で,学習5個/テスト1個となり,学習データのみに交差検証を行うため
- 10分割などの場合も,どのクラスもテストデータに最低1個は含まれる必要がある
- 【未実施】確率で同じデータを抽出する層化シャッフル抽出の場合は学習データが3個でも可能
EC番号が3桁目まで存在するクラスのみ抽出
- 現状のデータはEC T.X.X.X (T=1,2, ... ,7)でラベル付けされている.
- 本研究では3桁目の予測のため,3桁まで分かっているデータのみ用いる
- 遺伝子配列の手法では4桁まで予測されており,いずれはフィンガープリント・物理化学特性値でも開発されると予想(or 開発する必要がある)
- 正規表現のor記法(|)を用い,EC X.X.X.X,EC X.X.X.-,EC X.X.X.S(Sは MetaNetX 固有の文字区別)のデータを抽出する
削除するデータ
- EC7のデータ(データ数が少ないため)
- EC X.-.-.-やEC X.X.-.-などのデータ(1桁分類,1~2桁分類になら使用可能)
【懸念事項】ラベル変更によるクラス分布の変動(交差検証)
4桁までのクラスで層化抽出したデータを1桁or1~3桁に変更した場合,各クラスの学習データとテストデータの割合は一定かどうか(層化抽出が崩れていないか)
- 割合を検証したところ,どのクラスも学習75~85%,テスト15~25%で分布していたため,train_test_splitの標準通りと考えられる.
- 少なくとも4桁の時点で最低5個あるので,3桁クラスでは必ず5個以上ある(5分割可能)