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

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

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

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

scikit-learn

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

1385閲覧

confusionmatrixを表示したい

svsvi

総合スコア7

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

scikit-learn

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/01/30 05:59

編集2020/01/30 07:47

confusion_matrixを表示したいのですがエラーが出てしまいます。
どうすれば表示できるのかお聞きしたいです。
具体的なプログラムを教えてもらえると助かります。

最初のソースコード

from __future__ import print_function import pandas as pd from pandas import Series,DataFrame from sklearn import svm from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix, accuracy_score, precision_score,f1_score import numpy as np import matplotlib.pyplot as plt import keras from keras.models import Sequential from keras.layers import Dense, Dropout from keras.optimizers import Adam from keras.optimizers import SGD csvdataset = pd.read_csv("Train_Random.csv",header=0) #説明変数 x = DataFrame(csvdataset.drop("Result",axis=1)) #目的変数 y = DataFrame(csvdataset["Result"]) #説明変数・目的変数をそれぞれ訓練データ・テストデータに分割 x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.20) y_test2 = y_test y_pred2 = x_test #データの整形 x_train = x_train.astype(np.float) x_test = x_test.astype(np.float) y_train = keras.utils.to_categorical(y_train,10) y_test = keras.utils.to_categorical(y_test,10) #ニューラルネットワークの実装① model = Sequential() model.add(Dense(60, activation='relu', input_shape=(59,))) model.add(Dropout(0.2)) model.add(Dense(60, activation='relu', input_shape=(59,))) model.add(Dropout(0.2)) model.add(Dense(60, activation='relu', input_shape=(59,))) model.add(Dropout(0.2)) model.add(Dense(10, activation='softmax')) sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) #ニューラルネットワークの実装② model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy']) #ニューラルネットワークの学習 history = model.fit(x_train, y_train,batch_size=1000,epochs=10,verbose=1,validation_data=(x_test, y_test)) #ニューラルネットワークの推論 score = model.evaluate(x_test,y_test,verbose=1) print("\n") print("Test 損失値:",score[0]) print("Test 正解率:",score[1]) print('confusion matrix 混合行列 =\n ', confusion_matrix(y_true=y_test2, y_pred=y_pred2))#混合行列 print('accuracy 正解率 = ', accuracy_score(y_true=y_test2, y_pred=y_pred2))#正解率 print('precision 適合率 = ', precision_score(y_true=y_test2, y_pred=y_pred2))#適合率 print('recall 再現率 = ', recall_score(y_true=y_test2, y_pred=y_pred2))#再現率 print('f1 score = ', f1_score(y_true=y_test2, y_pred=y_pred2))#f1スコア

エラーコード

ValueError Traceback (most recent call last) <ipython-input-4-ba6b4268701a> in <module> 69 print("Test 正解率:",score[1]) 70 ---> 71 tp, fn, fp, tn = confusion_matrix(y_test2, y_pred2).ravel() 72 73 print('confusion matrix 混合行列 =\n ', confusion_matrix(y_true=y_test2, y_pred=y_pred2))#混合行列 ~\Anaconda3\lib\site-packages\sklearn\metrics\_classification.py in confusion_matrix(y_true, y_pred, labels, sample_weight, normalize) 266 267 """ --> 268 y_type, y_true, y_pred = _check_targets(y_true, y_pred) 269 if y_type not in ("binary", "multiclass"): 270 raise ValueError("%s is not supported" % y_type) ~\Anaconda3\lib\site-packages\sklearn\metrics\_classification.py in _check_targets(y_true, y_pred) 88 if len(y_type) > 1: 89 raise ValueError("Classification metrics can't handle a mix of {0} " ---> 90 "and {1} targets".format(type_true, type_pred)) 91 92 # 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 binary and multiclass-multioutput targets

###修正後のy_pred2
回答でいただいたものをもとにy_pred2を変えたらエラーが変わりました

pred = model.predict(x_test, batch_size=1, verbose=0) y_pred2 = np.max(pred)

最新のエラーコード

ValueError Traceback (most recent call last) <ipython-input-13-b74e493b703b> in <module> 70 71 ---> 72 print('confusion matrix 混合行列 =\n ', confusion_matrix(y_true=y_test2, y_pred=y_pred2))#混合行列 73 print('accuracy 正解率 = ', accuracy_score(y_true=y_test2, y_pred=y_pred2))#正解率(正しく分類されたデータ数の割合) 74 print('precision 適合率 = ', precision_score(y_true=y_test2, y_pred=y_pred2))#適合率(Aに分類されたデータで実際にAであるデータ数の割合) ~\Anaconda3\lib\site-packages\sklearn\metrics\_classification.py in confusion_matrix(y_true, y_pred, labels, sample_weight, normalize) 266 267 """ --> 268 y_type, y_true, y_pred = _check_targets(y_true, y_pred) 269 if y_type not in ("binary", "multiclass"): 270 raise ValueError("%s is not supported" % y_type) ~\Anaconda3\lib\site-packages\sklearn\metrics\_classification.py in _check_targets(y_true, y_pred) 78 y_pred : array or indicator matrix 79 """ ---> 80 check_consistent_length(y_true, y_pred) 81 type_true = type_of_target(y_true) 82 type_pred = type_of_target(y_pred) ~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in check_consistent_length(*arrays) 210 if len(uniques) > 1: 211 raise ValueError("Found input variables with inconsistent numbers of" --> 212 " samples: %r" % [int(l) for l in lengths]) 213 214 ValueError: Found input variables with inconsistent numbers of samples: [1, 12000]

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

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

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

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

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

guest

回答1

0

ベストアンサー

`y_pred2=x_test'となっており、テストデータをそのまま予測に入れてしまっているのでエラーになります。混合行列のときは、予測して出てきたラベルと実際のラベルが引数として必要なので、

pred = model.predict(x_test, batch_size=1, verbose=0) y_pred2 = np.max(pred)

例えばですが、上記のようなものを加えた予測結果を実際のラベルと比べれば、混合行列が出せると思います。

投稿2020/01/30 06:26

bamboo-nova

総合スコア1408

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

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

svsvi

2020/01/30 07:14 編集

回答ありがとうございます。 y_pred2をそのように変えたらエラー内容が変わりました。 こちらの原因は何でしょうか。質問欄に載せましたのでよろしければ見ていただけると助かります。
bamboo-nova

2020/01/30 07:13

すみません。categoricalしておりますので、 y_test2 = [np.argmax(i) for i in y_test] pred = model.predict(x_test) y_pred2 = [np.argmax(i) for i in pred] で実際のラベルも予測されたラベルも一次元のnumpy配列が得られるので、混合行列ができると思います。
svsvi

2020/01/30 07:49

また新しいエラーコードがでました。サンプル数の入力変数に一貫性がないとでてしまったのですがcsvデータには問題ないと思います。原因は何でしょうか。質問欄にエラーコード載せておきました。
bamboo-nova

2020/01/30 08:09

samples: [1, 12000]と書いてあるので、 X = X.reshape(X.shape[1:]) としてみて、引数のものをそれぞれ y_test2.shape y_pred2.shape を表示してみてくれませんか? 次元が一致して入れば大丈夫だと思います。
svsvi

2020/02/01 02:23

トラブルがあって返信遅くなってすみません! 重ねて申し訳ないのですがpython初心者なものでshapeなどもよくわからないのでどこにどうするのかさらに具体的に教えてもらいたいです。まだ見ていてくださったら返信いただけたら幸いです。
bamboo-nova

2020/02/01 06:58

まず、混合行列を作成するにあたって、予測されたラベルの出力と実際のラベルの出力が多次元ではなく、かつ次元が一致している必要があります。 Found input variables with inconsistent numbers of samples: [1, 12000] このエラー文ですが、おそらく次元が[12000, ]のような形になっていないことが原因だと思うので、 X = X.reshape(X.shape[1:]) とすることで回避できます。ただ、y_pred2もy_test2も同じ次元でないと混合行列が算出できないので、各々print(y_test2.shape)などとして、[1, 12000]のような形になっていないかどうかを確認してみて、なっていたらX = X.reshape(X.shape[1:])として、y_pred2とy_test2の次元が一致するようにしてみてくださいということでした。 次元が一致しているかどうかを調べるためにprint(y_test2.shape)とデバッグすることはよくあるので、今後の練習と思って確認してみて下さると検証しやすいと思います。
svsvi

2020/02/01 11:32

丁寧にありがとうございます print(y_test2.shape)で確認しようとしたところ 'list' object has no attribute 'shape' とでてしまったのですがlistがおかしくなっているのでしょうか.
bamboo-nova

2020/02/01 11:37

y_test2がlist型でnumpy.ndarray型になってないみたいです。 y_test2 = np.array(y_test2) とすればnumpy型に変換できるので、print(y_test2.shape)で確認できます。
svsvi

2020/02/01 12:14

(1,)   y_test2 (12000,) y_pred2 と表示できました。 形は同じなので原因は違うということでしょうか?
bamboo-nova

2020/02/01 12:21

y_test2 = [np.argmax(i) for i in y_test] 前に言ったこれ、エラーの元ですね汗 y_test2 = y_testだけで問題なさそうです。 y_test2 = [np.argmax(i) for i in y_test]をしてしまうと、y_testにある10このラベルの中で一番大きい数字を取り出すだけなので、エラーになりますね汗 質問の結果としては、 (1,)   y_test2 (12000,) y_pred2 ということで、文字通り次元が一致していないことが原因なので、上記の対応をすればy_test2が(12000,)になるはずなので、次元が一致して混合行列が出せると思います。
svsvi

2020/02/01 12:32

その通りにしたら全て表示できました。 何から何までありがとうございました。助かりました。
bamboo-nova

2020/02/01 12:35

いえいえ、こちらこそ勘違いしてるところがあったみたいですみませんでした汗 機械学習のプログラムを構築していく過程で次元や型の確認は避けて通れないところなので、何かあったらデータの型や次元を確認する癖があるとデバッグ速度も上がるのでオススメです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問