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

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

詳細はこちら
機械学習

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

Python

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

Q&A

3回答

4566閲覧

ディープラーニングでの予測値の出力が正しく出力されない

hidekun-

総合スコア4

機械学習

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

Python

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

0グッド

2クリップ

投稿2019/11/28 04:41

編集2019/11/28 17:02

前提・実現したいこと

ディープラーニングを使って「震災時の道路復旧期間の予測」を行っています。
その中で全111個のデータ中の34個(30%に当たる)のテスト用データを使って、学習から予測を行っていましたが、34個分の予測値がすべて同じ結果になってしまうという問題が発生してしまいました。

発生している問題・エラーメッセージ

python

1y_test = model.predict(x_test) 2pd.DataFrame(y_test) 3 4#以下は下のコードに対する出力 50 4.853684 61 4.853684 72 4.853684 83 4.853684 94 4.853684 105 4.853684 116 4.853684 127 4.853684 138 4.853684 149 4.853684 1510 4.853684 1611 4.853684 1712 4.853684 1813 4.853684 1914 4.853684 2015 4.853684 2116 4.853684 2217 4.853684 2318 4.853684 2419 4.853684 2520 4.853684 2621 4.853684 2722 4.853684 2823 4.853684 2924 4.853684 3025 4.853684 3126 4.853684 3227 4.853684 3328 4.853684 3429 4.853684 3530 4.853684 3631 4.853684 3732 4.853684 3833 4.853684

該当のソースコード

python

1import numpy as np 2import pandas as pd 3from sklearn.model_selection import train_test_split 4import matplotlib.pyplot as plt 5 6# affine変換してる 7def affine(z, w, b): 8 return np.dot(z, w) + b 9# affine変換勾配 10def affine_back(du, z, w, b): 11 dz = np.dot(du, w.T) 12 dw = np.dot(z.T, du) 13 db = np.dot(np.ones(z.shape[0]).T, du) 14 return dz, dw, db 15def sigmoid(u): 16 return 1 / (1 + np.exp(-u)) 17# 活性化関数 (シグモイド )の 勾配,中間層の勾配 18def sigmoid_back(u): 19 return (1 - sigmoid(u)) * sigmoid(u) 20def identity(u): 21 return u 22 23# 二乗和誤差:回帰問題 24def squared_error(y, u): 25 return 0.5 * np.sum((y - u) ** 2) / y.shape[0] 26# 誤差 (二乗和誤差)+活性化関数 (恒等関数 )の勾配 27def identity_mean_squared_error_back(y, u): 28 return (y - u) / y.shape[0] 29 30# 学習部分 31def learn(x, u, w1, b1, w2, b2, w3, b3, lr): 32# 順伝播 (入力データから、予測データを求めるまで ) 33 u1 = affine(x, w1, b1) 34 z1 = sigmoid(u1) 35 u2 = affine(z1, w2, b2) 36 z2 = sigmoid(u2) 37 u3 = affine(z2, w3, b3) 38 y = identity(u3) 39 40# 重み、バイアスの更新 41 w1 = w1 - lr * dw1 42 b1 = b1 - lr * db1 43 w2 = w2 - lr * dw2 44 b2 = b2 - lr * db2 45 w3 = w3 - lr * dw3 46 b3 = b3 - lr * db3 47 return w1, b1, w2, b2, w3, b3 48 49def predict(x, w1, b1, w2, b2, w3, b3): 50# 順伝播 51 u1 = affine(x, w1, b1) 52 z1 = sigmoid(u1) 53 u2 = affine(z1, w2, b2) 54 z2 = sigmoid(u2) 55 u3 = affine(z2, w3, b3) 56 y = identity(u3) 57 return y 58 59# 実行プログラム 60# 地震データ読み込み 61df = pd.read_csv('earthquake_B_traffic.csv') 62 63# データの作成 説明変数・目的変数分ける 64df_x = df.drop("regulatory period", axis=1) 65p= df.drop("damage range", axis=1) 66q= p.drop( "embankment height", axis=1) 67r= q.drop("landform", axis=1) 68s= r.drop("banking structure", axis=1) 69t= s.drop("damage form", axis=1) 70u= t.drop("traffic", axis=1) 71# 説明変数・目的変数をそれぞれ訓練データ・テストデータに分割 72pred_train = model.predict(x_train) 73pred_test = model.predict(x_test) 74 75# ノード数設定 76d0 = x_train.shape[1] 77d1 = 30 # 1層目のノード数 78d2 = 30 # 2層目のノード数 79d3 = 1 #出力層 80 81 82# 重みの初期化 (-0.1 0.1の乱数 ) 83np.random.seed(9) 84w1 = np.random.rand(d0, d1)*0.001 85w2 = np.random.rand(d1, d2)*0.001 86w3 = np.random.rand(d2, d3)*0.001 87#重みを1~0.001に設定する部分 88 89# バイアスの初期化 (0) 90b1 = np.zeros(d1) 91b2 = np.zeros(d2) 92b3 = np.zeros(d3) 93# 学習率 94lr = 0.5 95# バッチサイズ 96batch_size = 30 97# 学習回数 98epoch =1000 99 100#グラフを 描写リスト 101x = [0, epoch] 102y = [0.100] 103for i in range(epoch): 104 for j in range(0, x_train.shape[0], batch_size): w1, b1, w2, b2, w3, b3 = learn(x_train[j:j + batch_size], t_train[j:j + batch_size], w1, b1, w2, b2, w3, b3, lr) 105 # 学習 shape[00]は行の大きさを調べている.ここでは, ,77.よって 0~77の範囲でバッチサイズ文のステップ幅で数列を作成 106 107print(i) 108 109 110# 予測(学習データ) 111y_train = predict(x_train, w1, b1, w2, b2, w3, b3) 112# 予測(テストデータ) 113y_test = predict(x_test, w1, b1, w2, b2, w3, b3) 114# 誤差表示 115train_err = squared_error(y_train, t_train) 116test_err = squared_error(y_test, t_test) 117print(i, test_err) 118x.append(i) 119y.append(train_err) 120 121print(train_err) 122 123 124# 正解率 125def accuracy_rate(y, u): 126 max_y = np.argmax(y) 127 max_t = np.argmax(u) 128 return np.sum(max_y == max_t) / y.shape[0] 129 130print(accuracy_rate) 131 132# 予測(テストデータ) 133y_test = predict(x_test, w1, b1, w2, b2, w3, b3) 134print(y_test.shape) 135 136# データの作成 説明変数・目的変数分ける 137df_x = df.drop("regulatory period", axis=1) 138p= df.drop("damage range", axis=1) 139q= p.drop( "embankment height", axis=1) 140r= q.drop("landform", axis=1) 141s= r.drop("banking structure", axis=1) 142t= s.drop("damage form", axis=1) 143u= t.drop("traffic", axis=1) 144 145# 説明変数・目的変数をそれぞれ訓練データ・テストデータに分割 146pred_train = model.predict(x_train) 147pred_test = model.predict(x_test) 148 149# 事前準備 150from keras.models import Sequential 151from keras.layers import Dense, Dropout 152 153 154# モデルを作るぞ!と宣言 155model = Sequential() 156model.add(Dense(15, input_dim=6, activation='sigmoid')) 157model.add(Dropout(0.2)) 158model.add(Dense(15, activation='sigmoid')) 159model.add(Dropout(0.2)) 160model.add(Dense(1)) 161model.compile(optimizer='adam', loss='mse', metrics=['accuracy']) 162 163epochs = 1000 164history = model.fit(x=x_train, y=t_train, epochs=epochs, batch_size=11, validation_data=(x_test, t_test)) 165 166score = model.evaluate(x_test, t_test, verbose=0) 167print('Test loss', score[0]) 168print('Test accurancy', score[1]) 169 170 171y_test = model.predict(x_test) 172pd.DataFrame(y_test)

###説明変数5種類で実装
説明変数を5種類に一つ減らして試みたところ、正しく予測値が出力され、
使用したデータの実測値と予測値の比較グラフの表示までできました。
説明変数が一つ変わるだけで予測値の出力が正しく行われないことが解決できないことです。

イメージ説明

補足情報(FW/ツールのバージョンなど)

コードの中身の説明変数は全部で6個、出力値は予測日数

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

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

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

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

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

guest

回答3

0

同じ現象になったことがあります。
原因を特定できませんでしたが、入力データの数を減らしたら直りました。

データを変えてみることはできますか?

投稿2019/11/28 09:35

surphy

総合スコア101

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

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

hidekun-

2019/11/28 16:35

回答ありがとうございます。 説明変数を5種類から6種類から変更したらこのような現象になりました。 解決次第、解決法の投稿いたしますので是非見てください!
guest

0

同じ値が出るということは

①モデルの訓練がうまくいっていない

②訓練自体は出来ているが、何かしらのミスで同じ値が表示されている

のどちらかの可能性が高いです。

プログラム全文読むのは手間なので、
①かどうか確かめるために

print('Test loss', score[0])
print('Test accurancy', score[1])

の出力を提示してください。

投稿2019/11/28 08:35

horiegom

総合スコア152

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

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

hidekun-

2019/11/28 16:44

毎度、回答ありがとうございます。 print('Test loss', score[0]) print('Test accurancy', score[1]) を出力してみると Test loss 12.803413335014792 Test accurancy 0.029411764705882353 という出力が出ました。
guest

0

コードの中身は読んでませんが、x_testの中身を確認してみてください。

x_testが全て同じ値になってませんか?

投稿2019/11/28 05:55

編集2019/11/28 05:56
horiegom

総合スコア152

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

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

hidekun-

2019/11/28 07:32

回答ありがとうございます。 x_train, x_test, t_train, t_test のすべてprint()で出力してみましたがどれも正常な説明変数が出力されました。 y_testに関わるコードが何かおかしいのしょうか?
horiegom

2019/11/28 09:21

本筋とは一旦離れますが x_train, x_test, y_train, y_test = train_test_split(df_x, u, test_size=0.3) pred_train = model.predict(x_train) pred_test = model.predict(x_test) とするのが一般的です。 あと、逆伝播とか定義されていますが、これは全く使っていない? ただのkerasでfitしただけでしょうか。
horiegom

2019/11/28 09:21

①回帰分析なら model.add(Dense(1, activation='relu')) の最後の活性化関数は不要ではないですか? model.add(Dense(1)) で良いはずです。 ②validation dataとtest dataは分けましょう。
horiegom

2019/11/28 09:21

同じ値が出るということは ①モデルの訓練がうまくいっていない ②訓練自体は出来ているが、何かしらのミスで同じ値が表示されている のどちらかの可能性が高いです。 プログラム全文読むのは手間なので、 ①かどうか確かめるために print('Test loss', score[0]) print('Test accurancy', score[1]) の出力を提示してください。
horiegom

2019/11/28 10:12

あと、コードから動作に関係ない部分を全部消してください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問