mnistのモデル評価を行うために、混同行列を取得しようとすると、エラーが発生します。
通常のディープラーニングの2分類では、ちゃんと混同行列を得ることができていたのですが、何故でしょうか?
mnistは10分類なので、混同行列はできないのでしょうか?
お詳しい方、ご指導をお願いいたします。
(以下、全てのコードとエラーメッセージです。)
import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D #from keras.optimizers import RMSprop #from keras.utils import np_utils #from sklearn.datasets import fetch_mldata # データを高速かつ効率的に使えるPandasをインポート import pandas as pd # 数値計算を効率的に行うNumpyをインポート import numpy as np # グラフが簡単に描写できるMatplotlibをインポート import matplotlib import matplotlib.pyplot as plt # MNISTデータを読込む (x_train, y_train), (x_test, y_test) = mnist.load_data() # MNISTデータを加工する # 1次元に加工する場合(畳み込みは2次元)(デフォルトは2次元) #x_train = x_train.reshape(60000, 784) #x_test = x_test.reshape(10000, 784) # データを float 型に変換 x_train = x_train.astype('float32') x_test = x_test.astype('float32') # 0〜255 までの範囲のデータを 0〜1 までの範囲に変更(正規化) x_train /= 255 x_test /= 255 # 分類するクラス数 y_train = keras.utils.to_categorical(y_train, 10) y_test = keras.utils.to_categorical(y_test, 10) # 後の評価で使用? y_test_backup = y_test # 両方のサイズを確認 print("x_train.shape(学習用の画像データ) : ", x_train.shape) print("y_train_shape(学習用の正解データ) : ", y_train.shape) print("x_test.shape(テスト用の画像データ) : ", x_test.shape) print("y_test.shape(テスト用の正解データ) : ", y_test.shape) x_train.shape(学習用の画像データ) : (60000, 28, 28) y_train_shape(学習用の正解データ) : (60000, 10) x_test.shape(テスト用の画像データ) : (10000, 28, 28) y_test.shape(テスト用の正解データ) : (10000, 10) # 28x28x1のサイズへ変換 x_train = x_train.reshape(x_train.shape[0], 28, 28,1) x_test = x_test.reshape(x_test.shape[0], 28, 28,1) # モデルの宣言 model = Sequential() # 先に作成したmodelへレイヤーを追加 model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28,28,1))) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dense(10, activation='softmax')) # Learnig Processの設定 model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) # 注意 - 数分程度かかる # モデルの訓練(エポック数) model.fit(x_train, y_train, epochs=1) Epoch 1/1 60000/60000 [==============================] - 19s 318us/step - loss: 0.4984 - acc: 0.8590 <keras.callbacks.History at 0x1fa3aaad5c0> # テストデータを使ってモデルの評価 loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128) print(loss_and_metrics) 10000/10000 [==============================] - 1s 54us/step [0.2483551863193512, 0.9253] # 評価の実行 from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score predict_classes = model.predict_classes(x_test) score = model.evaluate(x_test,y_test) print('正確度(accuracy):', score[1]) print(' ') #print('精度(正確度):{:.3f}'.format(accuracy_score(y_test, predict_classes))) #print('適合率:{:.3f}'.format(precision_score(y_test, predict_classes))) #print('再現率:{:.3f}'.format(recall_score(y_test, predict_classes))) #print('f-1値:{:.3f}'.format(f1_score(y_test, predict_classes))) # 混同行列(Confusion Matrix) print(' ') from sklearn.metrics import confusion_matrix print(confusion_matrix(y_test, predict_classes)) 10000/10000 [==============================] - 1s 60us/step 正確度(accuracy): 0.9253 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-7-0c069648309b> in <module> 16 from sklearn.metrics import confusion_matrix 17 ---> 18 print(confusion_matrix(y_test, predict_classes)) C:\python\anaconda\pgm\lib\site-packages\sklearn\metrics\classification.py in confusion_matrix(y_true, y_pred, labels, sample_weight) 251 252 """ --> 253 y_type, y_true, y_pred = _check_targets(y_true, y_pred) 254 if y_type not in ("binary", "multiclass"): 255 raise ValueError("%s is not supported" % y_type) C:\python\anaconda\pgm\lib\site-packages\sklearn\metrics\classification.py in _check_targets(y_true, y_pred) 79 if len(y_type) > 1: 80 raise ValueError("Classification metrics can't handle a mix of {0} " ---> 81 "and {1} targets".format(type_true, type_pred)) 82 83 # We can't have more than one value on y_type => The set is no more needed ValueError: Classification metrics can't handle a mix of multilabel-indicator and multiclass targets
以下、printの結果です。
print(y_test) print(predict_classes) [[0. 0. 0. ... 1. 0. 0.] [0. 0. 1. ... 0. 0. 0.] [0. 1. 0. ... 0. 0. 0.] ... [0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.]] [7 2 1 ... 4 5 6]
回答2件
あなたの回答
tips
プレビュー