見出し画像

【W7】活性予測のための機械学習モデル_15_Step3_09_サポートベクトルマシン

【W7の目的】
ターゲット分子(EGFR)に対して新規な化合物の活性を予測するために、様々な教師あり機械学習(supervised ML)アルゴリズムを使用する方法について学習します。

前の回までは人工ニューラルネットワークでした。

https://note.com/knimesupportteam/n/ne8ee61c13c46

今回からは教師あり機械学習アルゴリズムの一つとしてサポートベクトルマシンを扱います。

サポートベクトルマシン(Support Vector Machines (SVM)): SVMカーネルトリックと呼ばれる入力を高次元の特徴空間に暗にマッピングする手法を使って、非線形の分類を効率的に実行することができます。オブジェクトの関数としてマージンを最大化するというアイデアに基づいた分類です。

【サポートベクトルマシンって何だろう】

アルゴリズムの説明はこれまで一貫して引用に頼ってきました。誇ることではないですね。

サポートベクトルマシン(SVM)の概要がわかりやすいなと感じたサイトを紹介し引用していきます。まずはt-kahiさんも推薦されていた下記のサイトより。

最もシンプルな例として2つの説明変数での二値分類でのSVMの働きを丁寧に説明されています。

AとBの境界線をいかにうまく引くかと考え、

境界線と最も近くにあるデータを「サポートベクトル」と呼びます。

そして

SVMでは、正しい分類基準を見つけるために、「マージン最大化」という考えを使います。
マージンとは、「判別する境界とデータとの距離」を指します。
これが大きければ、「ほんの少しデータが変わっただけで誤判定してしまう」というミスをなくすことができます。

上記記事から引用してきた下図はもっとも単純な線形サポートベクトルマシンの例となります。

(引用元) https://logics-of-blue.com/svm-concept/

【カーネルって何だろう】

では線形の境界線ではうまく分けられない場合はどうするか。カーネル法の登場です。
図解が豊富で読みやすかった記事がこちら。

カーネル法では「データを別の特徴空間に移してから線形回帰を行う」という説明がよくされています。これについてもう少し詳細に触れてみましょう。
 まず線形分離可能でないデータを線形分離可能にすることを考えます。これを考えるために、学習データよりも高次元な空間があって、学習データのそれぞれの点はその高次元空間の点に対応していると考えます。高次元空間の中では、学習データに対応する点は線形分離可能であり、実際の学習データはその高次元空間からの射影だと考えます。このような空間が手に入れば、高次元な空間でサポートベクトルマシンを用いて決定境界を学習できるでしょう。最後に、高次元な決定境界を元の特徴量のなすベクトル空間に射影して決定境界を得ます。
 もともと線形分離でないデータを高次元空間に移して線形分離している様子をイメージにしたのが次の図3です。

(引用元) https://www.shoeisha.co.jp/book/article/detail/233

高次元空間をうまく設定すると線形分離可能になるというのは感覚的には分かる気がしました。

では高次元空間を設定するカーネル法とは何だとなるわけですが、ここが難しいです。本来は数学を勉強せねばと金子先生の記事に行き当たり、Lagrangeの未定乗数法で撃沈されました。

ラグランジュの未定乗数法の気持ち【条件付き極値問題】

は楽しく観たものの、カーネル法がわかったとは言えないままでいます。

さらに他にもいくつか見ては打ちのめされたサイトをいくつか紹介しておきます。

高校生でもわかるっていうが、私は最近娘の数学の課題の相談をされても自力では解けないのでここで深追いを断念しました。高校生は賢いよ。

下記サイトはカーネル・トリックまで数式を駆使して丁寧に説明してくれていました。
https://chokkan.github.io/mlnote/classification/05svm.html

「9.5. カーネルSVMの学習例」は非線形変換の一例を可視化までしてくれているのでお勧めしておきます。

実は数日かけてあちこち見て回ったのですが結局、カーネル関数を適切に選ぶことでより分離能の高い高次元空間を得るのだな(小並感)とざっくり理解して次へ進みます。

【SVM Learnerのカーネル関数】

学習データに含まれる特徴ベクトルを高次元に非線形変換して、その空間で線形の識別を行う機械学習の手法をカーネル法と呼びます。

カーネル法は、データを高次元に非線形変換することで、線形分離を可能としていました。しかし、データが高次元になることで、計算が困難になってしまうのではないかという疑問が出てきますよね。
そこで用いられるのが、カーネルトリック。データを非線形変換する場合、カーネル関数というものを使用します。データの特徴ベクトルをカーネル関数に入力することで、非線形変換した高次元の特徴ベクトルを得ることができます。代表的なカーネル関数には多項式カーネル、ガウスカーネル、シグモイドカーネルといったものがあります。

今回デモデータで体験するのもその一種、RBFカーネル(=ガウシアンカーネル)を用いてSVMを実行します。

このWFの機械学習に用いるノード、SVM Learnerの設定は以下の通り。

Polynominal: 多項式カーネル

Hyper Tangent: シグモイドカーネルに相当(と推定)

RBF: ガウスカーネルに相当(次回再び)

1つのノードで、メジャーどころ3種のカーネル関数に対応する高機能のようです。ノーコードで一体どこまでできるんだと驚くばかり。次回はこのSVM LearnerでのRBFカーネル(=ガウシアンカーネル)の実装に関連して勉強をしてみます。

補足:
ちなみにHyper Tangentははっきり明示してくれているノードの説明を見つけることができなかったので、

「tanh関数」は、「シグモイド関数の拡張バージョン」

との記事を見てシグモイド型と推定しています。



更に引用は続く:

【サンプル間の類似度を評価するカーネル関数】

金子先生のカーネル関数についての解説記事で特にありがたかったのは、今回デモデータで体験するRBFカーネル(=ガウシアンカーネル)を定性的に知ることができるようかみ砕いて説明して下さっていたところです。いろいろとありがとうございます。

よく使われるガウシアンカーネル Radius Basis Function (RBF) を見てみましょう。

サンプル間のユークリッド距離 d = ||x(i)−x(j)|| があります。2 つのサンプル間の距離が近いほど、それらのサンプルは似ているといえますので、サンプル間の類似度となりそうです。ただ距離は、値が小さいほど類似度が高くなり、類似度と逆の大小関係になります。そこで、

と変換して、値が大きいほど類似度が高い、としたわけです (厳密にいえば他にも理由はあります)。0 から 1 までの値をとり、1 に近いほど 2 つのサンプル間は似ているといえます。

このように、カーネル関数は、サンプル間の類似度を評価するものです。関数を変えることで、いろいろな類似度を評価できます。類似度でしたら、tanimoto 係数などいろいろな指標がありますし、非線形関数φよりは考えやすいだろう、というわけです。

上記の説明を読んで、この関数RBFカーネルで類似度が評価できることや、分離モデルに適用することが腑に落ちたように思ったので引用させていただきました。
不適切な引用もあったかもしれません。お叱りを受けたら削除いたしますがひとまずは感謝とともに。

私の感覚的な理解として、冒頭で引用したAとBの二値分類に関してだったら、あるカーネル関数で定義される高次元空間でAとの類似度を0から1で表現して等高線を引き、0.5以上ならA側に、0.5より小さかったらB側にアサインする感じかなと想像します。

カーネルトリックの難しさに敗北感は感じつつも次へ進みます。


記事を読んでいただきありがとうございます。 先人の智慧をお借りしつつ、みなさんに役立つ情報が届けられたらと願っています。 もしサポートいただけるなら、そのお金はKNIMEの無料勉強会の開催資金に充てようと思います。