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

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

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

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

解決済

1回答

6525閲覧

Keras predictのnumpy返り値の評価について

yoshidaagri

総合スコア14

Keras

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2020/03/07 02:08

失礼します。kerasを触り始めて1週間ほどの初学者になります。

状況

初学者用のテキストを用いて、品質管理に関するコメント文章の区分を予測する分類器を作成したく、
kerasを触り始めました。

結果以下のアウトプットを得ました。

log

1Train on 84 samples, validate on 22 samples 2Epoch 1/100 384/84 [==============================] - 0s 4ms/sample - loss: 1.0987 - accuracy: 0.2619 - val_loss: 0.8936 - val_accuracy: 0.2727 4Epoch 2/100 584/84 [==============================] - 0s 407us/sample - loss: 0.7933 - accuracy: 0.4405 - val_loss: 0.7541 - val_accuracy: 0.5455 6Epoch 3/100 784/84 [==============================] - 0s 367us/sample - loss: 0.6354 - accuracy: 0.6190 - val_loss: 0.6816 - val_accuracy: 0.6364 8Epoch 4/100 984/84 [==============================] - 0s 326us/sample - loss: 0.5637 - accuracy: 0.7619 - val_loss: 0.6519 - val_accuracy: 0.6364 10Epoch 5/100 1184/84 [==============================] - 0s 406us/sample - loss: 0.5233 - accuracy: 0.7976 - val_loss: 0.6304 - val_accuracy: 0.8182 12Epoch 6/100 1384/84 [==============================] - 0s 352us/sample - loss: 0.4965 - accuracy: 0.8214 - val_loss: 0.6202 - val_accuracy: 0.8182 14Epoch 7/100 1584/84 [==============================] - 0s 368us/sample - loss: 0.4710 - accuracy: 0.8333 - val_loss: 0.6167 - val_accuracy: 0.8636 16Epoch 8/100 1784/84 [==============================] - 0s 399us/sample - loss: 0.4425 - accuracy: 0.8333 - val_loss: 0.6165 - val_accuracy: 0.8636 18Epoch 9/100 1984/84 [==============================] - 0s 279us/sample - loss: 0.4093 - accuracy: 0.8333 - val_loss: 0.6173 - val_accuracy: 0.8636 20Epoch 10/100 2184/84 [==============================] - 0s 241us/sample - loss: 0.3798 - accuracy: 0.8333 - val_loss: 0.6201 - val_accuracy: 0.8636 22Epoch 11/100 2384/84 [==============================] - 0s 242us/sample - loss: 0.3455 - accuracy: 0.8690 - val_loss: 0.6243 - val_accuracy: 0.8182 24予測結果 [[0.88910174 0.11089834]] 2527/27 [==============================] - 0s 2ms/sample - loss: 0.5542 - accuracy: 0.8148 26[0.5542417764663696, 0.8148148]

質問

上記logの予測結果の評価をどのようにすれば宜しいのでしょうか。
予測結果 [[0.88910174 0.11089834]]の1番めの数値が何なのか、2番めの数値が何なのか不明です。

根本的な質問で恐縮ですが、この値が良好なのは劣悪なのか分かるのことがゴールです。

以上です。宜しくお願いします。

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

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

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

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

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

hoshi-takanori

2020/03/07 05:04

お使いのテキストは何ですか? また、どのようなコードを実行しましたか?
yoshidaagri

2020/03/07 05:39 編集

ご返信ありがとうございます。 使用したテキストは...社外秘の品質管理、バグに関するコメントなので公開は控えます。すいません。 使用したコードはマイナビ出版「機械学習・深層学習による自然言語処理入門」の7章のコードです。 以下にコードが提供されております。ご参照いただけましたら幸いです。 https://colab.research.google.com/drive/1GtFEsTloBKvDD6W_y2F2iNWgCUA7vvpO inputのテキストも上記コードでinputとしているamazonのレビュー文章とそう変わらないものと捉えていただけましたら幸いです。 サンプルでは[[0.34541914 0.65458083]]と出力されています。
guest

回答1

0

ベストアンサー

参考にされたコード の train.py をもとに説明しますので、ご利用目的に合わせて解釈してください。

python

1def main(): 2 # Loading dataset. 3 x, y = load_dataset('data/amazon_reviews_multilingual_JP_v1_00.tsv', n=5000)

まず、x と y ですが、アマゾンのレビューの最初の 5,000 件のデータ(星の数が 3 のものは除く)から、レビューの文章が x、星の数 1, 2 を悪い (0)、4, 5 を良い (1) としたものが y で、0 <= i < 5000 に対して x[i](レビューの文章)と y[i](悪いか良いかを表す 0 または 1 の値)が対応しています。

python

1 # Preprocessing dataset. 2 x = [clean_html(text, strip=True) for text in x] 3 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42) 4 5 # Vectorizing dataset. 6 vectorizer = CountVectorizer(tokenizer=tokenize) 7 x_train = vectorizer.fit_transform(x_train) 8 x_test = vectorizer.transform(x_test) 9 x_train = x_train.toarray() 10 x_test = x_test.toarray()

で、それを学習用データ(x_train および y_train、4,000 件)とテストデータ(x_test および y_test、1,000 件)に分けた上で、x_train に出てくる単語それぞれについての出現数に変換しています。(ここで、テストデータにしか出てこない単語は捨てられていることに注意。)

python

1 # Setting hyperparameters 2 vocab_size = len(vectorizer.vocabulary_) 3 label_size = len(set(y_train))

入出力のパラメータですが、vocab_size が単語数(一件の入力値のサイズ)、label_size が結果の分類数(出力値のサイズ)で、ここで行う処理はレビューの文章における各単語の出現数により悪いか良いかの 2 種類の結果に分類することが目的なので、label_size は 2 となります。

モデルの構築と学習の処理は省略しますが、一層のニューラルネットを構築し、4,000 件の学習用データ(x_train および y_train)を使って学習しています。
ちなみに、validation_split=0.2 なので 4,000 件のうち 2 割は学習中のバリデーションデータとして使われてますね。
参考: トレーニングデータ・バリデーションデータ・テストデータの定義
参考: なぜ教師あり学習でバリデーションセットとテストセットを分ける必要があるのか? - Qiita

python

1 text = 'このアプリ超最高!' 2 vec = vectorizer.transform([text]) 3 y_pred = model.predict(vec.toarray()) 4 print(y_pred)

これが実際に学習したモデルを使って、レビューの文章が「このアプリ超最高!」だったら評価は悪い(星の数が 1 または 2)なのか良い(4 または 5)なのかを予測する処理になります。
まず、vec は「このアプリ超最高!」の各単語の出現数をカウントした長さ vocab_size の配列で、単語はたぶん「この」「アプリ」「超」「最高」の 4 個なので [0,0,0,...,0,1,0,...,0,1,0,...,0,1,0,...,0,1,0,...,0] みたいなものになります。1 が出現する位置が各単語に対応します。
そして結果 y_pred は長さが label_size つまり 2 の配列で、それぞれ 0(悪い、星の数が 1 または 2)または 1(良い、星の数が 4 または 5)に対応する予測値(確率?)になります。
(この予測値ですが、Softmax 関数の結果なので足して 1 になり、機械学習によって予測された確率のように扱える数値ではあるのですが、個人的にはこれを「確率」と呼ぶのは気持ち悪く感じます。が、天気予報の「降水確率」のようなものだと思えばそんなものかという感じです…。)

追記: よく見たら入力([text])と出力([[0.34541914 0.65458083]])がそれぞれ配列になってますね。これは一度に複数の入力を受けてそれぞれの予測値を返すということで、例えば入力 ['超最高!', '最悪。金返せ'] に対して出力が [[0.2, 0.8], [0.9, 0.1]] なら、レビュー文章 '最高!' に対する予測値が [0.2, 0.8] つまり良い(予測値 0.8)、'最悪。金返せ' が [0.9, 0.1] つまり悪い(予測値 0.9)ということになります。

python

1 acc = model.evaluate(x_test, y_test) 2 print(acc)

最後に、1,000 件のテストデータ(x_test および y_test)を使ってモデルの評価を行ないます。

以上、自分も勉強中なので間違いがあったらご指摘ください。

投稿2020/03/07 07:55

hoshi-takanori

総合スコア7901

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

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

yoshidaagri

2020/03/07 09:07

度重なるご返答感謝します。 > そして結果 y_pred は長さが label_size つまり 2 の配列で、それぞれ 0(悪い、星の数が 1 または 2)または 1(良い、星の数が 4 または 5)に対応する予測値(確率?)になります。 なるほど、評価が悪いのか良いの、それぞれの予測値であるという解説、非常に納得しました。 不勉強であることを恥じるばかりです。ありがとうございます。 label_sizeが2なのも影響しているように認識しました。 以上です。本質問はCloseさせていただきます。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問