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

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

詳細はこちら
Python

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

Q&A

解決済

2回答

3486閲覧

混同行列のヒートマップを%表示にしたい

shimauma111

総合スコア6

Python

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

0グッド

2クリップ

投稿2019/12/11 13:51

前提・実現したいこと

画像分類を行った時に、混同行列を用いて制度などを確認したいのですが、ヒートマップに「%表示」で出力したいのですが、いろいろ試したのですが、うまくいきません。分かる方いましたら教えていただけると助かります。

該当のソースコード

import cnn_model import keras import matplotlib.pyplot as plt import numpy as np from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix import pandas as pd import seaborn as sns #入力と出力を指定 im_rows=32 im_cols=32 im_color=3 in_shape=(im_rows,im_cols,im_color) nb_classes=4 #写真データを読み込み photos=np.load(".\dataset.npz") x=photos["x"] y=photos["y"] #読み込んだデータを三次元配列に変換 x=x.reshape(-1,im_rows,im_cols,im_color) x=x.astype("float32")/255 #ラベルデータをone-hotベクトルに直す y=keras.utils.np_utils.to_categorical(y.astype("int32"),nb_classes) #学習用とテスト用に分ける x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.9) #cnnモデルを取得 model=cnn_model.get_model(in_shape,nb_classes) #学習を実行 hist=model.fit(x_train,y_train, batch_size=32, epochs=5, verbose=1, validation_data=(x_test,y_test)) #モデルを評価 score=model.evaluate(x_test,y_test,verbose=1) print("正解率=",score[1],"loss=",score[0]) #学習の様子をグラフへ描写 #正解率の推移をプロット plt.plot(hist.history["acc"]) plt.plot(hist.history["val_acc"]) plt.title("Accuracy") plt.legend(["train","test"],loc="upper left") plt.show() #ロスの推移をプロット plt.plot(hist.history["loss"]) plt.plot(hist.history["val_loss"]) plt.title("Loss") plt.legend(["train","test"],loc="upper left") plt.show() model.summary() model.save_weights(".\cnn.hdf5") def print_cmx(y_true, y_pred): labels = sorted(list(set(y_true))) cmx_data = confusion_matrix(y_true, y_pred, labels=labels) labels= ["cat","dog","brid","human"] df_cmx = pd.DataFrame(cmx_data, index=labels, columns=labels) plt.figure(figsize = (10,7)) sns.heatmap(df_cmx, annot=True) plt.xlabel("Predict-labels") plt.ylabel("True-labels") plt.show() predict_classes = model.predict_classes(x_test, batch_size=32) true_classes = np.argmax(y_test,1) print_cmx(true_classes,predict_classes)

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

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

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

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

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

guest

回答2

0

ベストアンサー

こちらを参考にしてみてください。

Confusion matrix — scikit-learn 0.22 documentation

投稿2019/12/12 00:24

hayataka2049

総合スコア30935

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

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

shimauma111

2019/12/12 05:44

すみません。 試したのですが、%表示にできません。 もし宜しければ教えていただくと助かります
hayataka2049

2019/12/12 06:32

plot_confusion_matrix関数のnormalize引数に"all"を指定すると良いのではないでしょうか。
hayataka2049

2019/12/12 06:37 編集

ちなみにこの関数を使わないでプロットする場合は、一度混同行列を表す配列の総和で割ると良いかと思います。その上で必要なら100をかけるとパーセントの数字になるかと。
shimauma111

2019/12/12 12:44

自分のプログラムで言うとどの辺のあたりで混同行列を表す配列の総和で割るとよろしいでしょうか? 無知ですみません。
hayataka2049

2019/12/12 12:48

混同行列の配列を計算してから、seabornでプロットするためにDataFrameに格納する前が良いかと思います。
shimauma111

2019/12/12 14:17

何度もすみません。プログラム書き換えてみたのですがうまくいかないです。もしよろしければ、プログラムの書き換えを見せていただけると嬉しいです。
hayataka2049

2019/12/13 07:26

プログラム全体の動作までは把握できていませんが、 cmx_data = (cmx_data / np.sum(cmx_data)) * 100 などではいけませんか?
shimauma111

2019/12/18 05:20

遅くなってしまい申し訳ございません。 色々バタバタしていて今日試しています。 色々と教えていただきありがとうございます。
guest

0

例えば、今0.1となっているものを10%と表示したいのであれば、値を100倍にしてから、パーセントの表示を追加する必要があります。
sns.heatmap(df_cmx, annot=True)
となっている部分を、

python

1# 100倍する 2ax = sns.heatmap(df_cmx*100, annot=True) 3# %の表示を加える 4for t in ax.texts: t.set_text(t.get_text() + " %")

と変更すると想定している動作になるかと思います。

投稿2019/12/11 14:55

編集2019/12/11 14:55
kabayan55

総合スコア389

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

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

aaa_1994

2019/12/11 15:30

0.1とかではなく15とか20とかに表示されている場合どうすればよいでしょうか?
shimauma111

2019/12/12 05:58

自分のやつ0.1とかの表示ではなく200とかになっているのですがそれを0.1などの表示にしたい場合はどのように変更すればよいでしょうか?
kabayan55

2019/12/12 10:40 編集

想定されている入力と出力を簡単な例で教えていただけますか? 例えば200と表示されている値は何%と表示されていてほしいのでしょうか?
shimauma111

2019/12/12 14:21

精度がいいものは90%などの表示がしたいです。 https://newtechnologylifestyle.net/keras_fashion-mnist/ 僕のヒートマップではないですが、上記のサイトのようなひーーとマップの出力ではなく、くらすAは80%みたいな感じにしたいです。分かりずらい文章ですみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問