第15日目の記事です。前回は化合物を構成する原子ごとの重みを元に、原子ハイライト+ヒートマップ/棒グラフの補助図で可視化する方法を紹介しました。本記事ではその手法を機械学習に適用してみようと思います。用いれば同様に可視化できるように定義しました。weight_fn(mol)本記事ではこの形式に合わせて、以下の3つの手法で重みを計算します。GetSimilarityMapForModelの中で読まれているメソッドです。baseFPを用いて算出した予測値baseProbaと、原子ごとで作成したnewFPを用いて算出したnewProbaの差を以って各原子の重みとしています。Importance決定木系アルゴリズムにおいて、各特徴量が判別/回帰にどれぐらい寄与したかを示す指標です。解説するよりはググれば解説記事が見つかるのでそちらを挙げるに留めます。values2017年末に出てきた手法ですが、同時に使いやすいライブラリーが出てきたこともあって急速に利活用が進んでいる手法です。ケムインフォマティクスの分野でも早速活用・解析した論文が出ています。「ゲーム理論に基づいて...」という説明がなされますが、考え方としてはシンプルに、ある特徴量がない場合の予測値の差分をその特徴量の重要度として計算しているものです。こちらも詳細は先達の記事へ。(SHAPも含めた他の手法が非常に多く取り上げられている)溶解度データセットを用いた機械学習に適用まずはRDKitの溶解度データからランダムフォレストでモデルを作ります。0.7120622568093385まずまずのモデルが出来ました。それではGetAtomicWeightsForModelから試してみましょう。最初に幾つか関数を定義します。{sol_dict[y_pred[0]]}")これらを用いて、以下のように使います。変えて、weightsを指定できるようにしています。'Br'])test_mols[141]クラスの予測は外れてますが、全体としてヘテロ原子が赤に、sp2炭素が青になっており、何となくイメージに合っていそうです。test_mols[79]こちらはカルボン酸とメチレン鎖で色分けできていてよりイメージ通りの結果になりました。Importanceです。Importanceはclf.feature_importances_で取得できます。radius)がタプルで入っています。0))}各bitのimportance値を、そのbitの中心の原子の値として各原子の重みを計算しました。collisionがあり、その扱いには考慮が必要ですが、今回は単純に各bitに入っている原子数で平均しました。weightsこの方法で計算した重みを可視化したのが下図です。コハク酸のカルボン酸が強くハイライトされているのはイメージに合いますが、全体的に分かりづらいですね。Importanceが非負値であるため、色の濃淡のみでハイライトするこの手法とは相性が悪いようです。Importanceについては、特に重要なbitに絞って(※)可視化した方が視認性が上がるかも知れません。)test_mols[141]_FItest_mols[79]_FI最後にSHAPです。公式のレポジトリーを参考にして、以下のようにSHAP値を算出します。後は同様に可視化します。explainer.shap_values(fp.reshape((1,-1)))[class_id]test_mols[141]_SHAPtest_mols[79]_SHAPSHAPでは正負両方の値が出てくるため、GetAtomicWeightsForModelと同様に感覚的に捉えやすい結果になったと思います。SHAPという3つの重み計算方法を試してみました。collisionやradiusの考慮等、まだ検討すべき点はありそうです。大きいサイズのデータセットやモデルチューニングによるパフォーマンス向上の効果も見ておきたいところです。今回は時間が足りず可視化するところまでで終わりましたが、改めて時間を作って追加実験したいと思います。chainer-saliency新規性が高いけれど合成が難しい部分構造に今後どのように向き合っていくか化合物の可視化を機械学習に適用してみた少し拡張した化合物の可視化を試してみた月別アーカイブはてなブログをはじめよう!rkakamilanさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。