サポートベクターマシンを使用して非線形データセットを学習する方法

サポートベクターマシンを使用して非線形データセットを学習する方法

サポートベクターマシン (SVM)

[[326874]]

サポート ベクター マシンとは何ですか? サポート ベクター マシンは、データの分類分析を実行できる教師あり機械学習モデルです。実際、サポート ベクター マシン アルゴリズムは、インスタンスを分離できる優れた超平面を見つけるプロセスです。

上記のようにデータが線形に分離可能な場合は、線形分類器を使用して 2 つのクラスを分離できます。データが非線形に分離可能な場合はどうすればよいでしょうか? 次のようになります:

ご覧のとおり、異なるクラスのデータ ポイントは分離可能ですが、単純に直線を描いて分類することはできません。

では、サポート ベクター マシンを使用して非線形機械学習データセットを適合させるにはどうすればよいでしょうか?

SVMの実験

機械学習データセットの作成

まず、非線形機械学習データセットを作成します。 Python コードは次のとおりです。

  1. #分類器を視覚化するためのパッケージをインポートする
  2. matplotlib.colorsからListedColormap をインポートします
  3. matplotlib.pyplot をpltとしてインポートします。
  4. 輸入警告
  5.  
  6. #分類を行うためのパッケージをインポートする
  7. numpyをnpとしてインポートする
  8. sklearn.svmからSVC をインポートします
  9.  
  10. #データセットの作成
  11. np.ランダムシード(0)
  12. X_xor = np.random.randn(200, 2)
  13. y_xor = np.logical_xor(X_xor[:, 0] > 0,
  14. X_xor[:, 1] > 0)
  15. y_xor = np.where (y_xor, 1, -1)
  16.  
  17. 図 = plt.figure(図サイズ=(10,10))
  18. plt.scatter(X_xor[y_xor == 1, 0],
  19. X_xor[y_xor == 1, 1]、
  20. c= 'b' 、マーカー= 'x'
  21. ラベル = '1' )
  22. plt.scatter(X_xor[y_xor == -1, 0],
  23. X_xor[y_xor == -1, 1]、
  24. c = 'r'
  25. マーカー= 's'
  26. ラベル = '-1' )
  27.  
  28. plt.xlim([-3, 3])
  29. plt.ylim([-3, 3])
  30. plt.legend(loc= 'ベスト' )
  31. plt.tight_layout()
  32. plt.show()

線形サポートベクターマシンを使ってみる

まず、次のように Python で実装できる線形サポート ベクター マシンの使用を試みます。

  1. #分類を行うためのパッケージをインポートする
  2. mlxtend.plottingからplot_decision_regions をインポートします
  3. numpyをnpとしてインポートする
  4. sklearn.svmからSVC をインポートします
  5.  
  6. #線形カーネルを使用してSVC分類器を作成する
  7. svm = SVC(カーネル= 'linear' 、C=1000、random_state=0)
  8. # 分類器をトレーニングする
  9. svm.fit(X_xor, y_xor)
  10.  
  11. # 意思決定の境界を視覚化する
  12. 図 = plt.figure(図サイズ=(10,10))
  13. plot_decision_regions(X_xor、y_xor、clf=svm) のプロット
  14. plt.legend(loc= '左上' )
  15. plt.tight_layout()
  16. plt.show()

C は誤分類に関連するコストです。 C 値が高いほど、データ セットを正しく分離するアルゴリズムが厳格になります。線形分類器の場合は、kernel='linear' を使用します。

ご覧のとおり、コストを高く設定したにもかかわらず、線は赤い点と青い点をうまく分離していません。

ラジアル基底関数カーネル

これまで使用した線形分類器は次のとおりです。

ご覧のとおり、g(x) は線形関数です。 g(x) > 0 の場合、予測値は 1 になります。 g(x) <0の場合、予測値は-1になります。しかし、上記のような非線形データを処理するために線形関数を使用することはできないため、線形関数を別の関数に変換する必要があります。

この分類器は、非線形データに最適であると思われます。 Python コードを見てみましょう:

  1. # RBFカーネルを使用してSVC分類器を作成する
  2. svm = SVC(カーネル= 'rbf' 、ランダム状態=0、ガンマ=1/100、C=1)
  3. # 分類器をトレーニングする
  4. svm.fit(X_xor, y_xor)
  5.  
  6. # 意思決定の境界を視覚化する
  7. 図 = plt.figure(図サイズ=(10,10))
  8. plot_decision_regions(X_xor、y_xor、clf=svm) のプロット
  9. plt.legend(loc= '左上' )
  10. plt.tight_layout()
  11. plt.show()

ガンマは1/シグマです。覚えておいてください、シグマは調整機能です。したがって、ガンマ値が小さいほど、シグマ値が大きく、分類器はポイント間の距離に対して敏感ではなくなります。

ガンマを上げて何が起こるか見てみましょう。

  1. # RBFカーネルを使用してSVC分類器を作成する
  2. svm = SVC(カーネル= 'rbf' 、ランダム状態=0、ガンマ=1、C=1)
  3. # 分類器をトレーニングする
  4. svm.fit(X_xor, y_xor)
  5.  
  6. # 意思決定の境界を視覚化する
  7. 図 = plt.figure(図サイズ=(10,10))
  8. plot_decision_regions(X_xor、y_xor、clf=svm) のプロット
  9. plt.legend(loc= '左上' )
  10. plt.tight_layout()
  11. plt.show()

ガンマを 100 倍に増やすと、トレーニング セットの分類子の精度が向上するようです。ガンマ値を 10 倍するとどうなるでしょうか?

  1. # RBFカーネルを使用してSVC分類器を作成する
  2. svm = SVC(カーネル= 'rbf' 、ランダム状態=0、ガンマ=10、C=1)
  3. # 分類器をトレーニングする
  4. svm.fit(X_xor, y_xor)
  5.  
  6. # 意思決定の境界を視覚化する
  7. 図 = plt.figure(図サイズ=(10,10))
  8. plot_decision_regions(X_xor、y_xor、clf=svm) のプロット
  9. plt.legend(loc= '左上' )
  10. plt.tight_layout()
  11. plt.show()

これは、ガンマを 10000 に増やすと、より正確になるという意味ですか? 実際、ガンマ値が大きすぎると、分類器は最終的に違いを認識できなくなります。

Cを増やしましょう。 C は、機械学習データセット全体の誤分類に関連するコストです。つまり、C を増やすと、単一のデータ ポイントだけでなく、データ セット全体の感度が高まります。

  1. ipywidgetsから、interact、interactive、fixed、interact_manual をインポートします
  2. ipywidgetsをウィジェットとしてインポートする
  3.  
  4. 警告をフィルターする( "無視する" )
  5.  
  6. @interact(x=[1, 10, 1000, 10000, 100000])
  7. svc(x=1)を定義します。
  8. # RBFカーネルを使用してSVC分類器を作成する
  9. svm = SVC(カーネル= 'rbf' 、ランダム状態=0、ガンマ=.01、C=x)
  10. # 分類器をトレーニングする
  11. svm.fit(X_xor, y_xor)
  12.  
  13. # 意思決定の境界を視覚化する
  14. 図 = plt.figure(図サイズ=(10,10))
  15. plot_decision_regions(X_xor、y_xor、clf=svm) のプロット
  16. plt.legend(loc= '左上' )
  17. plt.tight_layout()
  18. plt.show()

SVM 分類器が 2 つのポイント グループを正常に分離できるようにするためのパラメータを見つけました。

やっと

この記事を読んで、SVM 分類器とは何か、そしてそれを非線形機械学習データセットの学習にどのように使用するかについて直感的に理解していただけたと思います。データが高次元の場合、視覚化を通じて分類器のパフォーマンスを判断することはできません。良い方法は、トレーニング セットでトレーニングし、テスト セットで混同行列や f1 スコアなどのメトリックを使用することです。

<<:  新型コロナウイルス感染症の流行中に音声テクノロジーが再び注目を集めているのはなぜでしょうか?

>>:  私の国は、5G、人工知能、自動運転で目覚ましい成果を上げ、革新的な国の仲間入りを果たしました。

ブログ    

推薦する

Google AIが既知のタンパク質配列の10%を一度に注釈付け、10年で人間の研究成果を上回る

タンパク質は人体のすべての細胞と組織の重要な構成要素です。体のすべての重要な成分にはタンパク質が必要...

...

銀行における会話型 AI – 企業が犯しがちな 3 つの間違い

金融サービス業界は、特定の金融プロセスに不可欠なレガシー機器やシステムを使用しているため、他の業界に...

清華大学がJittorをオープンソース化:国内初の大学開発のディープラーニングフレームワーク、PyTorchへのワンクリック変換が可能

Theano、Caffeに続き、大学主導のディープラーニングフレームワークがオープンソース化され、国...

最大フロー問題の解決における画期的な進歩: 新しいアルゴリズムは「驚くほど高速」

この問題はネットワークフロー理論において非常に基本的なものです。 「新しいアルゴリズムは驚くほど高速...

...

IBM、次世代AI開発をメインフレームに移行するための更新されたツールスイートをリリース

IBMは木曜日、メインフレーム開発者向けに最近発表した生成型AIコーディング機能をベースに、古いデー...

脚付きロボットの新たなスキル:ANYmalは山登りを学んでいる

ロボット工学の研究者がここ数年で脚付きロボットで成し遂げたことは実に驚くべきことだ。昨年7月、オレゴ...

...

...

Swift モバイル ゲーム開発に適用される幅優先探索アルゴリズム

[51CTO.com クイック翻訳] Swift Algorithm Club (https://g...

企業が人工知能を導入する際に知っておくべき5つの誤解

[[392106]] AI は広く普及しているにもかかわらず、知識と認識のギャップにより、商業的な導...

...

Java プログラミング スキル - データ構造とアルゴリズム「ツリー」

[[388287]]なぜツリー構造が必要なのでしょうか? 1. 配列格納方法の分析:利点: 下付き...