分類アルゴリズム~SVM~

こんにちは!EMです^^

 

今回も分類アルゴリズムシリーズとして、解説していきたいと思っています。

今日はサポートベクターマシーンです!

 

 

ロジスティック回帰と同様に、サポートベクターマシーン(SVM)は
2つのグループの間にまっすぐな境界線を描きます。

ただし、ロジスティック回帰は境界線にシグモイド変換を適用し
闘値(少しズレると大きく変わるギリギリの値)を選択しますが
SVMは線を移動させることによってグループの間の分離を最適化します。

はじめて見ると、線形境界は制限の塊のように見えるかもしれませんが
今後扱っていくカーネル法だと、データをより高次元の空間に
マッピングできることがわかります。

つまり、異なる次元の空間の直線は、逆変換すると非線形になる可能性があります 。

 

SVC

from sklearn.svm import LinearSVC

SVM_model = LinearSVC()
SVM_model.fit(X_trn[features_to_include], Y_trn)

print('accuracy on training data',SVM_model.score(X_trn[features_to_include], Y_trn))
print('accuracy on test data',SVM_model.score(X_tst[features_to_include], Y_tst))
 
【output】
 
accuracy on training data 0.7768047337278107
accuracy on test data 0.7892122072391767
 
 
svm_model_2feat = LinearSVC()
svm_model_2feat.fit(X_trn[two_features], Y_trn)
 
print('accuracy on training data',svm_model_2feat.score(X_trn[two_features], Y_trn))
print('accuracy on test data',svm_model_2feat.score(X_tst[two_features], Y_tst))
 
【output】
accuracy on training data 0.5581065088757396
accuracy on test data 0.5578424414478353
 
 
PlotBoundaries(svm_model_2feat, X_trn[two_features].values,Y_trn) 
 

f:id:tennisfashionista:20210207232514p:plain

 

 

カーネル法 SVM(Kernel SVMs)

SVMは直線の境界を描画しますが、はじめに問題をより高次元の空間にマッピングすることで
この制限をうまく避ける事ができます。

さらに異なる空間に描かれた直線を、クラス間の非線形境界にマッピングして戻すことができます。

このマッピング関数はカーネルと呼ばれます。

この方法の欠点は、カーネルを指定する必要があり、問題に対して
常に直感的であるとは限りません。

幸いなことにScikit-Learnは、放射基底関数など何通りかの組み込みカーネルを提供しています。

 

from sklearn.svm import SVC

kernel_SVM_model = SVC(kernel='rbf'#radial basis function mapping
kernel_SVM_model.fit(X_trn[features_to_include], Y_trn)

print('accuracy on training data',
    kernel_SVM_model.score(X_trn[features_to_include], Y_trn))
print('accuracy on test data',
    kernel_SVM_model.score(X_tst[features_to_include], Y_tst))

 

【output】

accuracy on training data 0.9176331360946746
accuracy on test data 0.7753726046841731

 

kernel_svm_model_2feat = SVC(kernel='rbf')
kernel_svm_model_2feat.fit(X_trn[two_features], Y_trn)
 
print('accuracy on training data',
kernel_svm_model_2feat.score(X_trn[two_features], Y_trn))
print('accuracy on test data',
kernel_svm_model_2feat.score(X_tst[two_features], Y_tst))
 
accuracy on training data 0.8461538461538461
accuracy on test data 0.7792760823278921

 

PlotBoundaries(kernel_svm_model_2feat, X_tst[two_features].values,Y_tst) 
 

f:id:tennisfashionista:20210209015711p:plain

 

 

今回は2通りのSVMを見てきました。

 
ただ、もっと詳しく表の見方について知りたい!全然これだとわからん!
という方は、ぜひ無料体験などを通してプロの先生に聞いてみてくださいね。
分からないところをピンポイントに教えてくれる環境ほど
効率がいいことはありません。
(私自身も無駄だったとは言いたくありませんが、独学で長い年月を遠回りしてきました…)
 
Now or Never!
思い立ったが吉日です。ぜひ見てみてください^^
 

 

 

今後もさらに色んなアルゴリズムを見ていきたいと思います。

最後まで読んで頂きありがとうございました。