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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

12811閲覧

株価予測のプログラミング

tubamed

総合スコア8

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2017/11/13 07:53

###前提・実現したいこと
完全プログラミング初心者です。
Anaconda上でspyder(python)を使い日経平均株価を予測するプログラミングを作ろうとしています。ネットで拾ったコードを基にanacondaで仮想環境を構築し実行したら以下のエラーがでました。原因は何でしょうか?

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

エラーメッセージ ValueError: Expected 2D array, got 1D array instead: array=[ 17353.66 17091.58 17237.76 ..., 22913.82 22868.71 22681.42]. Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

###該当のソースコード

python

1import pickle 2from pathlib import Path 3 4import pandas as pd 5import numpy as np 6import matplotlib.pyplot as plt 7from keras.layers import Input, Dense, LSTM 8from keras.models import Model 9from keras.callbacks import CSVLogger 10from sklearn.preprocessing import StandardScaler 11 12 13def read_data(): 14 paths = Path('.').glob('./indices_I101_1d_*.csv') 15 df = pd.concat([pd.read_csv(p, index_col='日付', parse_dates=True, encoding='cp932') 16 for p in paths]) 17 df = df.sort_index() 18 closes = df['終値'].values 19 return closes 20 21 22def create_model(): 23 inputs = Input(shape=(10, 1)) 24 x = LSTM(300, activation='relu')(inputs) 25 price = Dense(1, activation='linear', name='price')(x) 26 updown = Dense(1, activation='sigmoid', name='updown')(x) 27 model = Model(inputs=inputs, outputs=[price, updown]) 28 model.compile(loss={ 29 'price': 'mape', 30 'updown': 'binary_crossentropy', 31 }, optimizer='adam', metrics={'updown': 'accuracy'}) 32 return model 33 34 35def build_train_test_data(base_data): 36 scaler = StandardScaler() 37 data = scaler.fit_transform(base_data) 38 x_data = [] 39 y_data_price = [] 40 y_data_updown = [] 41 for i in range(len(data) - 10): 42 x_data.append(data[i:i + 10]) 43 y_data_price.append(data[i + 10]) 44 y_data_updown.append(int((base_data[i + 10 - 1] - base_data[i + 10]) > 0)) 45 x_data = np.asarray(x_data).reshape((-1, 10, 1)) 46 y_data_price = np.asarray(y_data_price) 47 y_data_updown = np.asarray(y_data_updown) 48 train_size = int(len(data) * 0.8) 49 x_train = x_data[:train_size] 50 y_train_price = y_data_price[:train_size] 51 y_train_updown = y_data_updown[:train_size] 52 x_test = x_data[train_size:] 53 y_test_price = y_data_price[train_size:] 54 y_test_updown = y_data_updown[train_size:] 55 return x_train, y_train_price, y_train_updown, x_test, y_test_price, y_test_updown, scaler 56 57 58def main(): 59 model = create_model() 60 data = read_data() 61 x_train, y_train_price, y_train_updown, x_test, y_test_price, y_test_updown, scaler = \ 62 build_train_test_data(data) 63 model.fit(x_train, [y_train_price, y_train_updown], 64 validation_data=(x_test, [y_test_price, y_test_updown]), epochs=100, batch_size=10, 65 callbacks=[CSVLogger('train.log.csv')]) 66 model.save('model.h5') 67 with open('scaler.pkl', 'wb') as f: 68 pickle.dump(scaler, f, protocol=pickle.HIGHEST_PROTOCOL) 69 pred = model.predict(x_test)[0][:, 0].reshape(-1) 70 pred = scaler.inverse_transform(pred) 71 y_test_price = scaler.inverse_transform(y_test_price.astype('float64')) 72 result = pd.DataFrame({'pred': pred, 'test': y_test_price}) 73 result.plot() 74 plt.show() 75 76 77if __name__ == '__main__': 78 main()

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

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

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

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

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

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

_Victorique__

2017/11/13 07:59

原因はエラーメッセージに書いてありますよ。それを読んでも原因が何か理解出来ないのですか?
guest

回答1

0

ベストアンサー

英語が読めなくてもGoogle翻訳に尋ねればそれなりに翻訳されます。

ValueError:2D配列が必要です。代わりに1D配列があります: 配列= [17353.66 17091.58 17237.76 ...、22913.82 22868.71 22681.42]。 データに単一のフィーチャがある場合はarray.reshape(-1、1)、単一のサンプルが含まれている場合はarray.reshape(1、-1)を使用してデータを変更します。

ここでいうフィーチャとサンプルは、それぞれ
フィーチャ、

[[1], [2], [3], ...]

サンプル

[[1, 2, 3...]]

要するに2次元の配列が入力なのに、1次元配列が来たから、これを1つの塊として認識すべきか、個別のものとして認識すべきか、困ったと言っています。

本来このエラーはどこの行で起きたのか、書かれているはずなのですが。
それがないので、どうなおすべきかもわかりません。

がんばって推理してみるのであれば、main関数の中の

python

1def main(): 2 .... 3 pred = model.predict(x_test)[0][:, 0].reshape(-1) 4 pred = scaler.inverse_transform(pred) 5 y_test_price = scaler.inverse_transform(y_test_price.astype('float64')) 6 ....

あたりが怪しいように思います。
データもないので確かめようがありませんが。

ちなみに、万が一こちらが原因だった場合、sklearnのバージョンが新しいせいです。
0.19以後ValueErrorが出るようになります。
その場合は.reshape(-1, 1)をうまく使ってください。

自分で修正するのが困難で、かつコードが動きさえすればよいのであれば、バージョンを古いものに変更することで実行できるかもしれません。

conda install --force scikit-learn=0.18.2

もともとのコードが動くものであれば……。

投稿2017/11/13 08:37

mkgrei

総合スコア8560

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

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

tubamed

2017/11/14 09:09

詳しくありがとうございます。これを基にがんばります
tubamed

2017/11/14 09:26

バージョンを古いものにしたらできました!
mkgrei

2017/11/14 10:45

scikit-learnの仕様変更のせいですね。 英語版の詳しい?解決法しか見つけられませんでした。 https://stackoverflow.com/questions/35082140/preprocessing-in-scikit-learn-single-sample-depreciation-warning 新しいバージョンだとブログ等で見つかる古いコードが走らない可能性が高いですね。 自分で修正できるようになるまで、古いバージョンでやり過ごして、余裕が出た頃に新しいバージョンに移行するとよいかと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問