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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

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

Q&A

解決済

1回答

3732閲覧

kerasでの分類結果の出力方法を変更したいです

python_2019

総合スコア68

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

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

0グッド

0クリップ

投稿2019/08/23 06:05

編集2019/08/23 06:18

以下、ご指導をお願いできませんでしょうか。

〇アヤメのデータ(解析対象のデータ)
イメージ説明
〇kerasでアヤメの10データ(説明変数4個)の分類(予測)を実行しました。
〇3分類です(0,1,2)
〇結果をprint(X_pred, y_pred)で確認すると、y_predの値は、
以下太字のように、3分類の小数点第7位までの評価値として出力されます。

[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]
[5.4 3.9 1.7 0.4]
[4.6 3.4 1.4 0.3]
[5. 3.4 1.5 0.2]
[4.4 2.9 1.4 0.2]
[5.9 3. 5.1 1.8]] [[0.9604735 0.036979 0.0025476 ]
[0.9274674 0.06670068 0.00583181]
[0.9471255 0.04877361 0.00410091]
[0.9132033 0.07942345 0.00737325]
[0.9618993 0.03564271 0.00245795]
[0.96040165 0.03737509 0.00222324]
[0.94531244 0.05049011 0.00419744]
[0.9462063 0.05007736 0.00371628]
[0.9030936 0.08779445 0.00911197]
[0.00817783 0.3878351 0.6039871 ]]

〇この、y_predの値を、[0 0 0 0 0 0 0 0 0 2]のように、それぞれ10データに対して、3つずつではなく、最も確率が高いものを整数として、1つだけ出力するのはどうすればよいでしょうか?

例えば、
[0.9604735 0.036979 0.0025476 ]の場合、「0」
[0.00817783 0.3878351 0.6039871 ]の場合、「2」
となります。

先頭位置から順番に、「0,1,2」と分類されます。

すなわち、3つの数値で最も大きい数値の「位置の値(0~2)」を、表示したいです。

よろしくお願いいたします。

 以下のような結果表示にしたいと思っています。

[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]
[5.4 3.9 1.7 0.4]
[4.6 3.4 1.4 0.3]
[5. 3.4 1.5 0.2]
[4.4 2.9 1.4 0.2]
[5.9 3. 5.1 1.8]]** [0 0 0 0 0 0 0 0 0 2]**

◆以下、プログラムと実施結果です(読み難くてすみません)。

from pandas import Series,DataFrame
import pandas as pd

<エクセルの入力ファイル名、シート名を指定>
df = pd.read_excel('iris_data.xlsx',sheet_name='target')

<データをコピーする。>
df_X = df.copy()
df_Y = df.copy()

<取得したExcelデータから属性データのみを取り出す>
df_X = df_X.drop('Target',axis=1)

<取得したExcelデータから目的変数のみを取り出す>
drop_idx = ['sepal length (cm)', 'sepal width (cm)','petal length (cm)','petal width (cm)']
df_Y = df_Y.drop(drop_idx,axis=1)

<訓練データと評価用データに分割>
from sklearn.model_selection import train_test_split as split
x_train, x_test, y_train, y_test = split(df_X,df_Y,train_size=0.8,test_size=0.2)

import tensorflow as tf
import keras
from keras.layers import Dense,Activation

<ニュートラルネットワークで使用するモデル作成>
model = keras.models.Sequential()
model.add(Dense(units=32,input_dim=4))
model.add(Activation('relu'))
model.add(Dense(units=3))
model.add(Activation('softmax'))
model.compile(loss='sparse_categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])

<評価の実行>
score = model.evaluate(x_test, y_test,batch_size = 1)
print(score[1])

 30/30 [==============================] - 0s 432us/step
0.9666666666666667

<未知データの分類(エクセルファイルから複数データの読み込み)>
<エクセルの入力ファイル名、シート名を指定>
df1 = pd.read_excel('iris_data_3.xlsx',sheetname='data2')
X_pred = np.array(df1)
y_pred = model.predict(X_pred)
print(X_pred, y_pred)

[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]
[5.4 3.9 1.7 0.4]
[4.6 3.4 1.4 0.3]
[5. 3.4 1.5 0.2]
[4.4 2.9 1.4 0.2]
[5.9 3. 5.1 1.8]] [[0.9604735 0.036979 0.0025476 ]
[0.9274674 0.06670068 0.00583181]
[0.9471255 0.04877361 0.00410091]
[0.9132033 0.07942345 0.00737325]
[0.9618993 0.03564271 0.00245795]
[0.96040165 0.03737509 0.00222324]
[0.94531244 0.05049011 0.00419744]
[0.9462063 0.05007736 0.00371628]
[0.9030936 0.08779445 0.00911197]
[0.00817783 0.3878351 0.6039871 ]]
以上です。

ご指導よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

numpy.argmax をお使いください。
axis=1 とすることで行ごとに見て、一番大きい値のインデックスが取得できます。

python

1import numpy as np 2 3score = np.array( 4 [ 5 [0.9604735, 0.036979, 0.0025476], 6 [0.9274674, 0.06670068, 0.00583181], 7 [0.9471255, 0.04877361, 0.00410091], 8 [0.9132033, 0.07942345, 0.00737325], 9 [0.9618993, 0.03564271, 0.00245795], 10 [0.96040165, 0.03737509, 0.00222324], 11 [0.94531244, 0.05049011, 0.00419744], 12 [0.9462063, 0.05007736, 0.00371628], 13 [0.9030936, 0.08779445, 0.00911197], 14 [0.00817783, 0.3878351, 0.6039871], 15 ] 16) 17 18np.argmax(score, axis=1) 19# array([0, 0, 0, 0, 0, 0, 0, 0, 0, 2])

投稿2019/08/23 06:32

tiitoi

総合スコア21956

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

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

python_2019

2019/08/23 06:51

ご回答、どうもありがとうございました。 教えていただいたPGMを実行すると、一番大きいインデックスを取得することができました。 追加でお教え頂きたいのですが、 この、[0, 0, 0, 0, 0, 0, 0, 0, 0, 2] を 以下のように、1つのprint命令で表示させることは可能なのでしょうか? 実は、後処理で、この2つのデータ(x,y)をエクセルの1つのシートに同時に書き出そうと考えています。 [[5.1 3.5 1.4 0.2] [4.9 3. 1.4 0.2] [4.7 3.2 1.3 0.2] [4.6 3.1 1.5 0.2] [5. 3.6 1.4 0.2] [5.4 3.9 1.7 0.4] [4.6 3.4 1.4 0.3] [5. 3.4 1.5 0.2] [4.4 2.9 1.4 0.2] [5.9 3. 5.1 1.8]] [0 0 0 0 0 0 0 0 0 2]
tiitoi

2019/08/23 07:01

pred_classes = np.argmax(score, axis=1) のように argmax の結果を変数に格納しておき、print するのでは駄目でしょうか。 print(X_pred, pred_classes)
python_2019

2019/08/23 07:15

ご回答、ありがとうございます。 今、argmax の結果を変数にして実行しました。 そうしますと、以下のような結果になりました。 [[5.1 3.5 1.4 0.2] [4.9 3. 1.4 0.2] [4.7 3.2 1.3 0.2] [4.6 3.1 1.5 0.2] [5. 3.6 1.4 0.2] [5.4 3.9 1.7 0.4] [4.6 3.4 1.4 0.3] [5. 3.4 1.5 0.2] [4.4 2.9 1.4 0.2] [5.9 3. 5.1 1.8]] [0 0 0 0 0 0 0 0 0 0] この結果は、直接X_predに対する一番大きなインデックスを取得しているのでしょうか。 (どうも結果が、若干異なるようです(10桁目 2→0) 実際の処理は、X_pred→分類器→y_pred となっており、この分類後の「y_pred」に対して、X_predの値と同時printができればと考えておりました。 私の説明不足で申し訳ございません。 ご指導よろしくお願いいたします。
tiitoi

2019/08/23 07:17

np.argmax(X_pred, axis=1) ではなく、np.argmax(y_pred, axis=1) ではないでしょうか。 つまり、以下です。 pred_classes = np.argmax(y_pred, axis=1) print(X_pred, pred_classes)
python_2019

2019/08/23 07:19

あ、うまく実行できました。 大変、お手数おかけいたしました。 どうもありがとうございました。 助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問