任意の座標データに対し、2つのクラスを与え、サポートベクトルマシンにて決定境界の表示を試みているものです。
現在までどちらか一方のクラスの座標数に偏りがある場合、背景が、座標数の多い側の色(オレンジ)に表示され、座標数の少ないクラス0(青プロット)の決定境界が表示されておりました。(図1)
しかし、今回行った検証においては明らかにクラス1(オレンジプロット)の座標が多いにもかかわらず、オレンジの決定境界が表示されました。(図2)
今までは、座標数の少ない方の色の決定境界が表示されると思い込んでおりましたが、このような2クラスのデータで、SVM表示される決定境界が、どちらの色に表示されるかはどのように決定されているのでしょうか?また、図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])
同じデータで何回も繰り返して実行したら、結果が変わったりしませんでしょうか?
参考
https://teratail.com/questions/254744
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の黄緑が最も面積が大きいという結果は変わらず、分類の境界線の形も目視では変化してないように見えました
jbpb0さん
ご回答ありがとうございます。今まで多数のデータで決定境界表示していて、この1件以外は、背景が座標数の多い側の色に表示されていたので、そう思い込んでおりました。なるほどですね。random_stateの有無も確認してみましたが、おっしゃる通り結果はほぼ変わりませんでした。
https://codezine.jp/static/images/article/11466/11466_04.jpg
の左のデータを分類するのに、右のようにデータを変換して平面で区切りますから、左の図に分類した領域の色を付けたら、領域の端(上下左右の辺に近いところ)の色は、周囲にあるオレンジ色のデータの色になります
この時に、青色のデータ数をもっと増やしたり、オレンジ色のデータ数を減らしたりしても、オレンジデータが青データの周囲をぐるっと取り囲んでる配置が変わらなければ、やはり領域の端の色はオレンジ色になるでしょう
なので、境界の形が単純な場合は、領域の端の色は外側にあるデータの色になりやすいです
ただし、境界が複雑に入り組んでる場合は、上記図のような簡単な変換では済まないので、その変換のやりやすさも関係してきますので、一概には言えなくなります
質問に掲載してる画像の図を見ると、二つ目の方は、左上を除き青データがより外側にあるので、領域の端の色が青色になるのは、直感的に納得できます
一方、一つ目の方は、右下を除き青データがより外側にあるのに、領域の端の色はオレンジ色になってるのは、何で? って感じます
やはり、境界が複雑に入り組んでる場合は、そんな単純は話ではないのでしょうね
質問の一つ目の画像で、右下に大きく外れてるオレンジデータ2個を削除したら、領域の端の色が青色に変わったりしませんかね?
ならないかな??
その2個を削除しただけでは逆転しなくても、より外側にあるオレンジデータを1個ずつ削除していったら、たぶんどこかで逆転すると思います
逆転した時にデータ数を比較したら、まだオレンジデータの数の方が多いだろうと思います
あくまでも想像で、未確認ですが
ご提案頂いたように図1の右下のオレンジデータ除去し検証しましたが、結果は変わりませんでした。下記の回答にもありますが、やはりデータの数に依存するわけではないようですね。
回答1件
あなたの回答
tips
プレビュー