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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1914閲覧

SVMを可視化に際して表示される複数の境界線の理由について

shibattyo

総合スコア10

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/02/01 06:49

編集2019/02/01 07:03

前提・実現したいこと

SVMを用いて領域分類した結果を可視化したいと思っています。
ここに質問の内容を詳しく書いてください。
その際に、機械学習のコードを参考にコーディングをjupyter notebookで行いました。
すると境界線とは別に線が何本か引かれているグラフが表示されてしまいました。
この線は何を表しているのか、どうすれば消えるのかを解決したいです。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

python

1ソースコード 2AV_df = pd.read_csv("AV1.0~3.0 nomal2.csv") 3x = AV_df.iloc[0:75, [0,1]].values 4y = AV_df.iloc[0:75, 2].values 5model = SVC(kernel = "rbf", random_state = 0, C = 10, gamma = 100 ) 6model.fit(x, y) 7 8def plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02): 9 markers = ('s','x','o','^','v') 10 colors = ('red','blue','lightgreen','gray','cyan') 11 cmap = ListedColormap(colors[:len(np.unique(y))]) 12 13 x1_min, x1_max = X[:, 0].min() -0.015, X[:, 0].max() +0.055 14 x2_min, x2_max = X[:, 1].min() -0.02, X[:, 1].max() +0.02 15 16 xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution)) 17 Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) 18 Z = Z.reshape(xx1.shape) 19 plt.contourf(xx1,xx2,Z,alpha = 0.4, cmap = cmap) 20 plt.xlim(xx1.min(), xx1.max()) 21 plt.ylim(xx2.min(), xx2.max()) 22 23 for idx, cl in enumerate(np.unique(y)): 24 plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1],alpha = 0.8, c= cmap(idx), marker= markers[idx], label = cl) 25 26 if test_idx: 27 X_test, y_test = X[test_idx, :], y[test_idx] 28 plt.scatter(X_test[:,0], X_test[:,1] ,c='', alpha=1.0, linewidth = 1, marker='o', s =55,label = 'test set') 29 30plot_decision_regions(x, y, classifier = model)

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

イメージ説明
ここにより詳細な情報を記載してください。

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

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

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

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

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

shibattyo

2019/02/01 07:03

申し訳ありませんでした。全文掲載いたしました
guest

回答2

0

すると境界線とは別に線が何本か引かれているグラフが表示されてしまいました。

質問者さんのデータが何クラス分類問題なのか等わからないのですが、SVM で決定境界を描画する場合、以下のようにすればよいと思います。

学習する。

iris データを学習する例

python

1import matplotlib.pyplot as plt 2import numpy as np 3from sklearn import datasets 4from sklearn.model_selection import train_test_split 5from sklearn.svm import SVC 6 7# データを取得 8iris = datasets.load_iris() 9data = iris.data[:, [0, 2]] 10label = iris.target 11 12# 学習データとテストデータに分割する。 13X_train, X_test, Y_train, Y_test = train_test_split( 14 data, label, test_size=0.2, stratify=label, random_state=42) 15 16# ロジスティック回帰モデルで学習する。 17model = SVC(gamma='auto') 18model.fit(X_train, Y_train) 19 20# テストデータを推論し、精度を出力する。 21Y_pred = model.score(X_test, Y_test) 22print('test accuracy: {:.2%}'.format(Y_pred))

描画する。

python

1fig, ax = plt.subplots(figsize=(8, 6)) 2 3# タイトル、x 軸、y 軸のラベルを設定する。 4ax.set_title('classification data using SVM') 5ax.set_xlabel('Sepal length') 6ax.set_ylabel('Petal length') 7 8# サンプルを描画する。 9ax.scatter(data[:, 0], data[:, 1], c=label, s=7, cmap='tab10') 10 11X, Y = np.meshgrid(np.linspace(*ax.get_xlim(), 1000), 12 np.linspace(*ax.get_ylim(), 1000)) 13XY = np.column_stack([X.ravel(), Y.ravel()]) 14Z = model.predict(XY).reshape(X.shape) 15 16# 等高線を描画する。 17ax.contourf(X, Y, Z, alpha=0.4, cmap='Paired') 18plt.show()

イメージ説明

追記

質問者さんのコードでデータセットを iris に差し替えて実行した結果

イメージ説明

決定境界以外に直接が引かれるという現象は確認できません。

投稿2019/02/01 07:30

編集2019/02/01 08:20
tiitoi

総合スコア21956

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

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

shibattyo

2019/02/01 08:01

これは3クラス分類です。 境界線の引き方ではなく上図に引かれている、境界線とは別の線が何を意味しているのかを知りたいです。 これもcontourf()メソッドで引かれた等高線という解釈でいいんでしょうか??
tiitoi

2019/02/01 08:10

等高線であることは確かなのですが、predict() の返り値は推定クラスなので、3クラスなら 0, 1, 2 のどれかのはずです。 等高線が引かれたということは、その部分に段差があるということになりますが、分類境界以外の部分に段差があるということになり変な気がします。 原因を見つけるには、Z がどのような値なのか確認する必要があります。 当方は AV1.0~3.0 nomal2.csv がないので、質問者さんのコードを動かすことができないので、原因まではわかりません。
tiitoi

2019/02/01 08:30 編集

matplotlib で描画する際、(numpy.meshgrid()で作成した)いくつかの点の関数値からそれ以外の点の関数値を補完するので、ごく一部だけラベルが違ったりして、そのような結果になっている可能性がありますね。 つまり、境界線じゃないように見える線も実は拡大するとその部分に別のラベルに推定された点が存在したりして決定境界になっているのではないでしょうか
shibattyo

2019/02/02 05:35

解答して頂きありがとうございました。 アドバイス頂いた通りにzの値を確認する過程でplot_decision_regions関数の引数であるrelosutionの値を小さくしたところ境界線のみになりました。 おそらく入力としていたデータの値が少数第6位まであり小さかったため、広い間隔で分割して予測を行なった結果、等高線が境界線以外に引かれてしまったのではないかと考えられます。 問題も一応解決いたしました。本当にありがとうございました。
guest

0

自己解決

plot_decision_regions関数の引数であるrelosutionの値を小さくしたところ境界線のみになりました。
おそらく入力としていたデータの値が少数第6位まであり小さかったため、広い間隔で分割して予測を行なった結果、等高線が境界線以外に引かれてしまったのではないかと考えられます。
そのため入力するいわゆる学習データの値に応じてresolutionの値は変えないといけないと思います。下の画像はresolutionを0.02から0.001に変更した時の様子です。
イメージ説明

投稿2019/02/02 05:40

shibattyo

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問