こんにちは!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)
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)
今回は2通りのSVMを見てきました。
ただ、もっと詳しく表の見方について知りたい!全然これだとわからん!
という方は、ぜひ無料体験などを通してプロの先生に聞いてみてくださいね。
分からないところをピンポイントに教えてくれる環境ほど
効率がいいことはありません。
(私自身も無駄だったとは言いたくありませんが、独学で長い年月を遠回りしてきました…)
Now or Never!
思い立ったが吉日です。ぜひ見てみてください^^
今後もさらに色んなアルゴリズムを見ていきたいと思います。
最後まで読んで頂きありがとうございました。