🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

Python

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

Q&A

解決済

2回答

3928閲覧

scikit-learnでサポートベクターマシン(SVM)を行う際のプロットの色と背景を変えたいです

tatsuromariya

総合スコア2

scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

Python

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

0グッド

0クリップ

投稿2021/01/24 12:06

編集2021/01/24 12:53

こんにちは。
現在Jupyter Notebook上で、二次元の散布図に対してサポートベクターマシン法を用いて識別線を引いてみているのですが、どうやらデフォルトでプロットの色と背景の色が決まっているらしく、ここを変更する方法があれば教えていただきたく存じます。
せめてプロットの色と背景の色を同系色にできればいいなと思っております。
以下にコードと得られる図を示します。csvファイルにはNH3センサ値の列、COセンサ値の列、NO2センサ値の列と計測した物質を3タイプに分けて1,2,3と数値をふっているtypeの列が載っています。
よろしくお願いいたします。

import pandas as pd
from sklearn import svm
from mlxtend.plotting import plot_decision_regions
import matplotlib.pyplot as plt
df = pd.read_csv('C:/Users/tatsuro mariya/Documents/Python Scripts/sensor.csv',names=["NH3","CO","NO2","type"])

//Fit Support Vector Machine Classifier

X = df[['NO2','NH3']]
y = df['type']

clf = svm.SVC(C=1.0, kernel='linear', gamma=0.8)
clf.fit(X.values, y.values)

//Plot Decision Region using mlxtend's awesome plotting function

plot_decision_regions(X=X.values, y=y.values,clf=clf, legend=2)

イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

せめてプロットの色と背景の色を同系色にできれば

この図が分類器の決定境界を図示したものだということを考えれば、散布図のプロット色と塗り潰し面の色が一致していないのはどう考えてもおかしいですよね。

このプロットを行っているのは mlxtend ライブラリの plot_decision_regions 関数ですが、この関数は、分類クラスのラベルがゼロ始まりの整数の連続値である、つまり 0, 1, 2, 3, 4, …であるという前提のもとに描画を行っています。
ところが質問のデータの分類ラベル(type列の値)は 1, 2, 3 であるため、結果としてグラフ表示の不具合となっています。

正しいグラフ表示にするためには、以下のいずれかの方法をとる必要があります。

  1. 元データの分類ラベル自体を 0, 1, 2 に変更する
  2. plot_decision_regions 関数内で一時的にラベルを 0, 1, 2 に書き換える
  3. plot_decision_regions 関数を使わず自分で matplotlib ライブラリを使って描画する(plot_decision_regions も内部では matplotlib を使って描画しています)

2 の方法を説明すると、ラベルを 1, 2, 3 から 0, 1, 2 に書き換えるために y = df['type']

python

1y = df['type'] - 1

に変更します。さらに凡例のラベルを元の 1, 2, 3 で表示するために plot_decision_regions(X=X.values, y=y.values,clf=clf, legend=2) の部分を

python

1ax = plot_decision_regions(X=X.values, y=y.values,clf=clf) 2handles, labels = ax.get_legend_handles_labels() 3ax.legend(handles, [1, 2, 3], framealpha=0.3, scatterpoints=1, loc=2)

に変更します。もちろんここで [1, 2, 3] を ['物質名a', '物質名b', '物質名c'] などとしても構いません。

デフォルトでプロットの色と背景の色が決まっているらしく、ここを変更する方法があれば

単純に色を変えるだけであれば、plot_decision_regions 関数に colors 引数を渡して変更することができます。デフォルトは

python

1plot_decision_regions(X, y, clf, colors='red,blue,limegreen,gray,cyan')

です。分類クラス 0 が red、クラス 1 が blue、クラス 2 が limegreen, …と対応しています。色名については https://matplotlib.org/examples/color/named_colors.html を参照してください。

もっと細かい調整については matplotlib にキーワード引数を渡すことによって行うことができます。ドキュメント中の Example 9 - Customizing the plotting style を参照してください。

投稿2021/01/27 14:16

編集2021/01/27 14:36
etherbeg

総合スコア1195

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

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

tatsuromariya

2021/02/08 07:54

ご回答ありがとうございました。 原因を突き止めていただいき感謝しております。 おかげさまで思い描いていた図を作成することができました。
guest

0

colorsという引数を取るので、ここを渡してあげれば基本的には良いのかと思われます。

mlxtend/decision_regions.py at e8e7c092f47fcc5228f90df367173667b568276c · rasbt/mlxtend · GitHub

質問の画像は、理由はよくわかりませんがマーカーと背景が噛み合ってませんね。同色になりそうなのですが。

mlxtendに頼らずとも、Exampleを適当に真似て自分でプロットしてしまうという手はあります。

Examples — scikit-learn 0.24.1 documentation

投稿2021/01/27 13:31

hayataka2049

総合スコア30935

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

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

tatsuromariya

2021/02/08 07:51

ご回答ありがとうございました。 データの分類ラベルがずれていたことが同色にならない原因だったようです。 色々教えていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問