質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

解決済

SVMの決定境界について

shujiu
shujiu

総合スコア3

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

1回答

0評価

0クリップ

220閲覧

投稿2021/12/17 09:24

編集2021/12/17 09:28

任意の座標データに対し、2つのクラスを与え、サポートベクトルマシンにて決定境界の表示を試みているものです。
現在までどちらか一方のクラスの座標数に偏りがある場合、背景が、座標数の多い側の色(オレンジ)に表示され、座標数の少ないクラス0(青プロット)の決定境界が表示されておりました。(図1)
しかし、今回行った検証においては明らかにクラス1(オレンジプロット)の座標が多いにもかかわらず、オレンジの決定境界が表示されました。(図2)
今までは、座標数の少ない方の色の決定境界が表示されると思い込んでおりましたが、このような2クラスのデータで、SVM表示される決定境界が、どちらの色に表示されるかはどのように決定されているのでしょうか?また、図1と図2で決定境界を行うクラスが変わった理由などわかりましたら教えていただけますと幸いです。初歩的な質問かもわかりませんが、何卒よろしくお願いいたします。使用したコードを以下に示します。
図1
図2

python

%matplotlib inline import matplotlib.pyplot as plt import numpy as np import pandas as pd from sklearn.svm import SVC from sklearn.linear_model import LinearRegression from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from mlxtend.plotting import plot_decision_regions from sklearn import datasets df = pd.read_csv("/Users/orala/Desktop/SVM/data1.csv", header=None) df.columns = ['Class label','point X','point Y'] #特徴量の設定 X = df.iloc[:,[1,2]].values # 正解ラベルの設定 y = df.iloc[:, 0].values -1 # 特徴量の標準化 sc = StandardScaler() sc.fit(X) # 訓練データを変換器で標準化 X_std = sc.transform(X) model = SVC(kernel='rbf', gamma=10.0 , C=100.0) model.fit(X_std,y) # 訓練データのプロット plt.figure(figsize=(16,9)) plot_decision_regions(X_std, y, model) plt.gca().invert_yaxis() plt.grid() #標準化した plt.xticks([-5.63,0.11,5.86]) plt.yticks([-5.36,-0.17,5.01])

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

jbpb0

2021/12/18 01:43 編集

https://qiita.com/jun40vn/items/59dd46bb7aedb33a5120 の「2. パーセプトロン」のコードで、 X, y, test_size=0.3, random_state=1, stratify=y) ↓ 変更 X, y, test_size=0.3) とすると、「train_test_split」を実行した後の「y_train」に含まれる3分類(0, 1, 2)の数が同じではなくなり、「train_test_split」を実行し直す度に「y_train」で3分類(0, 1, 2)のどれが一番多いかが変わります その状態で「6. サポートベクトルマシン(カーネルトリック2)」のコードを実行すると、結果表示で最も面積が大きいのは、Webページに記載の画像と同じで、常に分類2の黄緑でした 「y_train」で3分類(0, 1, 2)のどれが一番多いかとは無関係でした 上記例は3分類ですが、2分類でも同じだと思うので、 > 背景が、座標数の多い側の色 だったのは、たまたまそうだっただけではないですかね なお、上記例では、「SVC」の「random_state=1」は、有っても無くても結果には関係ないようでした 「SVC」の「random_state=1」を削除して繰り返し実行してみましたが、分類2の黄緑が最も面積が大きいという結果は変わらず、分類の境界線の形も目視では変化してないように見えました
shujiu

2021/12/18 06:05

jbpb0さん ご回答ありがとうございます。今まで多数のデータで決定境界表示していて、この1件以外は、背景が座標数の多い側の色に表示されていたので、そう思い込んでおりました。なるほどですね。random_stateの有無も確認してみましたが、おっしゃる通り結果はほぼ変わりませんでした。
jbpb0

2021/12/18 07:16 編集

https://codezine.jp/static/images/article/11466/11466_04.jpg の左のデータを分類するのに、右のようにデータを変換して平面で区切りますから、左の図に分類した領域の色を付けたら、領域の端(上下左右の辺に近いところ)の色は、周囲にあるオレンジ色のデータの色になります この時に、青色のデータ数をもっと増やしたり、オレンジ色のデータ数を減らしたりしても、オレンジデータが青データの周囲をぐるっと取り囲んでる配置が変わらなければ、やはり領域の端の色はオレンジ色になるでしょう なので、境界の形が単純な場合は、領域の端の色は外側にあるデータの色になりやすいです ただし、境界が複雑に入り組んでる場合は、上記図のような簡単な変換では済まないので、その変換のやりやすさも関係してきますので、一概には言えなくなります 質問に掲載してる画像の図を見ると、二つ目の方は、左上を除き青データがより外側にあるので、領域の端の色が青色になるのは、直感的に納得できます 一方、一つ目の方は、右下を除き青データがより外側にあるのに、領域の端の色はオレンジ色になってるのは、何で? って感じます やはり、境界が複雑に入り組んでる場合は、そんな単純は話ではないのでしょうね 質問の一つ目の画像で、右下に大きく外れてるオレンジデータ2個を削除したら、領域の端の色が青色に変わったりしませんかね? ならないかな?? その2個を削除しただけでは逆転しなくても、より外側にあるオレンジデータを1個ずつ削除していったら、たぶんどこかで逆転すると思います 逆転した時にデータ数を比較したら、まだオレンジデータの数の方が多いだろうと思います あくまでも想像で、未確認ですが
shujiu

2021/12/18 10:34

ご提案頂いたように図1の右下のオレンジデータ除去し検証しましたが、結果は変わりませんでした。下記の回答にもありますが、やはりデータの数に依存するわけではないようですね。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。