こんばんは。前回まで少し小休止で旅行記を書いていましたが、再び本題の機械学習の勉強を進めていければなと思います!
兼ねてから、普段使っている機械学習アルゴリズムの仕組みや特徴を復習して頭に入れておきたいなと思っていたので、機械学習アルゴリズム解説シリーズとして、続けられればなと思います。まだまだ初学者なので、誤っている部分などあればご指摘いただけると嬉しいです!
第1回は、サポートベクターマシン!普段決定木系アルゴリズムをよく使っているので、改めて、このアルゴリズムの仕組みと特徴を理解して、どのような場合に選択の候補となるのかを理解しておこうと思います。
Contents
サポートベクターマシン(SVM)の概要
教師あり機械学習アルゴリズムの1つで、線形・非線形の回帰・分類に適用可能なアルゴリズムです。
1963年に線形サポートベクターマシンが提唱され、
1992年に非線形問題にも拡張された。
アルゴリズムの特徴として、マージン最大化(後述)という考え方が適用されている。
サポートベクターマシンを理解する
線形サポートベクターマシン
はじめに、線形サポートベクターマシンを解説していこうと思います。
線形サポートベクターマシンを適用するには、前提としてデータセットが線形分割可能である必要があります。線形分割可能とは、データを直線(二次元の場合)で特徴グループ分けできるような状態を言います。
ちなみに、特徴量が3つの場合は、直線ではなく面で分割するイメージです。
以下の例では、特徴量が2つの二次元空間を例に説明していきます。
マージン最大化
線形サポートベクターマシンでは、上記の線形分割可能なデータセットに対して、マージン最大化という考え方に基づいて最適な分類直線を引きます。
下の図をみてください。データセットの色の違いが特徴の違いだとして、このデータセットを、未知のデータにも対応できるようもっとも上手に分類する直線はどれでしょうか。
SVM分類器は、この時、「サポートベクトル」からの「マージン」が最大となる直線を選びます。下の図を見てください。
境界線のもっとも近くにあるデータを「サポートベクトル」と呼びます。このサポートベクトルと境界線の間の距離を「マージン」と呼びます。
このマージンの合計を最大にすることで、未知のデータについても正しく分類できる確率を高めるような直線を引くことができるのです。
ハードマージン分類
分類した時に、全てのデータが正しく分類できていることを要求する時、それをハードマージン分類と呼びます。
ハードマージン分類を行おうとすると、データが線形分離可能な場合でしか使えず、線形分離を阻む外れ値が一つでもデータに入ってしまうと対処できなくなってしまう問題があります。
これを「マージン違反」と呼びます。
柔軟なモデルを作るためには、ある程度のマージン違反を許容できる仕組みが必要です。
このような分類問題を「ソフトマージン問題」と呼びます。
ソフトマージン分類問題
というわけで、ソフトマージン分類問題では、以下のバランスを取ることを考える必要があります。
- マージンの最大化
- マージン違反を極力減らす
非線形サポートベクターマシン
多くの現実のデータでは、上記のように線形分割可能であるケースの方が少ないと思います。そのような場合にも対応できないと、実用的だとは言えません。
詳しい説明は別途時間を割いて書いてみようと思いますが、要は
いろいろやって線形問題に落とし込む
という方向性です。具体的に以下のようなことを行います。
多項式特徴量の追加
このような場合に最初に行われることは、多項式特徴量の追加です。
この方法では、一般的に問題が複雑になるほど高い次数の特徴量を追加する必要があり、計算量が膨大になってしまう問題があります。
この問題に対処するために、「カーネルトリック」という方法が使われます。
類似性特徴量の追加
これは、個々の特徴量が、ある「ランドマーク」からどの程度近いかを示す類似性関数で計算された値を特徴量として追加する方法です。
この「ランドマーク」の選び方がポイントになりますが、これも計算量が多くなってしまう問題があります。
実はこの問題も「カーネルトリック」を使うことで計算コストの問題を解消します。
RBFカーネルの利用
先ほどまで「カーネルトリック」と呼んでいたものがこのRBFカーネルになります。
数学はまた別途時間を設けて解説してみようと思いますが、簡単に説明すると、上記の多項式特徴量の追加や、類似性特徴量の追加を実際に行わなくても、同じ効果が得られる計算を行うことができるのです。
サポートベクターマシンの得意・不得意なこと・注意点
- 特徴量のスケールの影響を受けやすいため、スケーリングが重要
- データセットが大きくなると、計算量が指数関数的に増えていくため、中小規模のデータセットに対して最適
Pythonでサポートベクターマシンモデルを作ってみる
それでは、Kaggleのタイタニックデータを利用して、サポートベクターマシンによる予測モデルを構築してみようと思います。
線形サポートベクターマシン
線形サポートベクターマシンを実装する一般的な方法には2種類あります。
Scikit-LearnのLinearSVCを利用する方法と、SVCでKernel=”linear”と引数を与えてやる方法です。
コメントを残す