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

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

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

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

Q&A

解決済

1回答

1100閲覧

SVMの決定境界について

shujiu

総合スコア3

機械学習

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

0グッド

0クリップ

投稿2021/12/17 09:24

編集2021/12/17 09:28

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

python

1%matplotlib inline 2import matplotlib.pyplot as plt 3import numpy as np 4import pandas as pd 5from sklearn.svm import SVC 6from sklearn.linear_model import LinearRegression 7from sklearn.preprocessing import StandardScaler 8from sklearn.model_selection import train_test_split 9from sklearn.metrics import accuracy_score 10from mlxtend.plotting import plot_decision_regions 11from sklearn import datasets 12 13df = pd.read_csv("/Users/orala/Desktop/SVM/data1.csv", header=None) 14df.columns = ['Class label','point X','point Y'] 15 16#特徴量の設定 17X = df.iloc[:,[1,2]].values 18# 正解ラベルの設定 19y = df.iloc[:, 0].values -1 20 21# 特徴量の標準化 22sc = StandardScaler() 23sc.fit(X) 24# 訓練データを変換器で標準化 25X_std = sc.transform(X) 26 27model = SVC(kernel='rbf', gamma=10.0 , C=100.0) 28model.fit(X_std,y) 29 30# 訓練データのプロット 31plt.figure(figsize=(16,9)) 32plot_decision_regions(X_std, y, model) 33plt.gca().invert_yaxis() 34plt.grid() 35#標準化した 36plt.xticks([-5.63,0.11,5.86]) 37plt.yticks([-5.36,-0.17,5.01])

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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の右下のオレンジデータ除去し検証しましたが、結果は変わりませんでした。下記の回答にもありますが、やはりデータの数に依存するわけではないようですね。
guest

回答1

0

ベストアンサー

機械学習アルゴリズムのしくみを解説 「サポートベクトルマシン」と「k-means法」とは
が比較的わかりやすいでしょうか。
SVMは二次元平面上で何かをしようとしているのではなく、多次元上でマージン最大化(できるだけ分かれ目のサポートベクターとの距離から遠い位置に)で境界を引こうとしているって感じです。
それを二次元平面に戻すと線形カーネル以外だとぐにゃりとした境界線になりますね。
理論的ではなくイメージな感じで恐縮ですが、二次元平面上で見ると件数が少ないクラスを囲った方がマージン最大化になりやすいのであたかも少ないクラスを囲うようなアリゴリズムに見えますがデータによりますね。手元で試したところ

df.pd.DataFrame() df['a'] = [5.0, 4.2, 3.9, 4.0, 3.45, 3.61, 3.53, 3.58, 3.64, 3.51, 3.52] df['b'] = [5.2, 3.3, 4.2, 4.0, 3.53, 3.53, 3.60, 3.69, 3.55, 3.61, 3.52] df['target'] = [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]

こんなデータですと件数が多い 1 の方が囲われました。
イメージ説明

念の為補足
「クラス0(青プロット)の決定境界が表示」「オレンジの決定境界が表示」と記載されておりますが、決定境界は0と1を分ける境界ですのでどちらかの決定境界というわけではないです。高次元上では線形の超平面ですが二次元上だとあたかもどちらかを囲っているように見えるというだけです。

投稿2021/12/18 09:35

aokikenichi

総合スコア2218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shujiu

2021/12/18 10:37

aokikenichiさん ご回答ありがとうございます。一概にデータ数の数に依存して決定境界が作成されているわけではないことが回答内容から理解出来ました。見かけ上、どちらかを囲う領域は作成されているが、あくまで境界であるということですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問