https://github.com/tizuo/keras/blob/master/LSTM%20with%20multi%20variables.ipynb
このサイトにあるプログラムを使って機械学習をしようと思っているのですが、
CSVファイルを作るまではできたんですがプログラムが動かない状態です。
前にも質問させていただいて、回答者の協力もありエラー文の半分くらいは処理できたんですが、
残りのエラー文が検索等おこなっても解決できず、わかる方がいれば教えてほしいです。
import numpy
import pandas
from keras.models import Sequential
from keras.layers import Dense
from keras import optimizers
from keras.wrappers.scikit_learn import KerasRegressor
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from keras.models import load_model
import os
import argparse
#----------------------------
# get command line variables
#----------------------------
parser = argparse.ArgumentParser(description='Make models by keras. Place Y on the head column in the cleaned dataset with header names on the top row. Rows containing null values will be deleated.')
parser.add_argument('--mode', choices=['create', 'predict'], dest='mode', metavar='create/predict', type=str, nargs='+', required=True,
help='an integer for the accumulator')
parser.add_argument('--input_file', dest='input_file', type=str, nargs='+', required=True,
help='path to dataset or model')
parser.add_argument('--method', choices=['binary', 'multiple', 'regression'], metavar='binary/multiple/regression', dest='method', type=str, nargs='+', required=True,
help='Model type you solve')
parser.add_argument('--output_file', dest='output_file', default=False, required=False,
help='If you input output_file it will save result as directed path.')
parser.add_argument('--model_file', dest='model_file', default=False, nargs='*',
help='If you input model_file it will save or load a model.')
parser.add_argument('--definition', metavar='array of data type such as str, int and float with delimiter [,]', dest='definition', default=False, nargs='*',
help='If you define data type of columns, send array of full column definitions.')
args = parser.parse_args()
#----------------------------
# functions
#----------------------------
class MakeModel:
#init
def __init__(self, args):
self.X = self.Y = []
self.row_length = self.column_length = 0
self.method = args.method[0]
self.ifp = args.input_file[0]
if args.model_file != False:
self.mfp = args.model_file[0]
else:
self.mfp = False
if args.output_file != False:
self.ofp = args.output_file[0]
else:
self.ofp = False
if args.definition != False:
self.dfin = args.definition.split(",")
else:
self.dfin = False
#create layers
def create_model(self, evMethod, neurons, layers, act, learn_rate, cls, mtr):
# Criate model
model = Sequential()
model.add(Dense(neurons, input_dim=self.column_length, kernel_initializer='normal', activation='relu'))
for i in range(1, layers):
model.add(Dense(int(numpy.ceil(numpy.power(neurons,1/i)*2)), kernel_initializer='normal', activation='relu'))
model.add(Dense(cls, kernel_initializer='normal', activation=act))
# Compile model
adam = optimizers.Adam(lr=learn_rate)
model.compile(loss=evMethod, optimizer=adam, metrics=mtr)
return model
#load dataset
def load_dataset(self):
dataframe = pandas.read_csv(self.ifp, header=0, encoding="sjis").dropna()
if self.dfin != False:
dataframe[dataframe.columns].apply(lambda x: x.astype(self.dfin[dataframe.columns.get_loc(x.name)]))
dataframe_X = pandas.get_dummies(dataframe[dataframe.columns[1:]]) #create dummy variables
if self.method == 'multiple':
dataframe_Y = pandas.get_dummies(dataframe[dataframe.columns[0]]) #create dummy variables
else:
dataframe_Y = dataframe[dataframe.columns[0]]
#print(dataframe_Y.head())
#print(dataframe_X.head())
self.row_length, self.column_length = dataframe_X.shape
self.X = dataframe_X.values
self.Y = dataframe_Y.values
#train
def train_model(self):
#pipe to Grid Search
estimators = []
estimators.append(('standardize', StandardScaler()))
#rely on chosen method parameters
if self.method == 'binary':
evMethod = ['binary_crossentropy']
activation = ['sigmoid']
metr = [['accuracy']]
estimators.append(('mlp', KerasClassifier(build_fn=self.create_model, epochs=10, batch_size=200, verbose=1)))
cls = [1]
elif self.method == 'multiple':
evMethod = [['categorical_crossentropy']]
activation = ['softmax']
metr = [['accuracy']]
estimators.append(('mlp', KerasClassifier(build_fn=self.create_model, epochs=10, batch_size=200, verbose=1)))
cls = [self.Y.shape[1]]
else:
evMethod = ['mean_squared_error']
activation = [None]
metr = [None]
estimators.append(('mlp', KerasRegressor(build_fn=self.create_model, epochs=10, batch_size=200, verbose=1)))
cls = [1]
pipeline = Pipeline(estimators)
#test parameters
batch_size = list(set([int(numpy.ceil(self.row_length/i)) for i in [1000,300,100]]))
epochs = [10, 50, 100]
neurons = list(set([int(numpy.ceil(self.column_length/i)*2) for i in numpy.arange(1,3,0.4)]))
learn_rate = [0.001, 0.005, 0.01, 0.07]
layers = [1,2,3,4,5]
#test parameter
"""batch_size = [31]
epochs = [100]
neurons = [32]
learn_rate = [0.01]
layers = [5]"""
#execution
param_grid = dict(mlp__neurons = neurons, mlp__batch_size = batch_size, mlp__epochs=epochs, mlp__learn_rate=learn_rate, mlp__layers=layers, mlp__act=activation, mlp__evMethod=evMethod, mlp__cls=cls, mlp__mtr=metr)
grid = GridSearchCV(estimator=pipeline, param_grid=param_grid)
grid_result = grid.fit(self.X, self.Y)
#output best parameter condition
clf = []
clf = grid_result.best_estimator_
print(clf.get_params())
accuracy = clf.score(self.X, self.Y)
if self.method in ['binary', 'multiple']:
print("\nAccuracy: %.2f" % (accuracy))
else:
print("Results: %.2f (%.2f) MSE" % (accuracy.mean(), accuracy.std()))
#save model
if self.mfp != False:
clf.steps[1][1].model.save(self.mfp)
#predict dataset
def predict_ds(self):
model = load_model(self.mfp)
model.summary()
sc = StandardScaler()
self.X = sc.fit_transform(self.X)
pr_Y = model.predict(self.X)
if len([self.Y != '__null__']) > 0:
if self.method == 'binary':
predictions = [float(numpy.round(x)) for x in pr_Y]
accuracy = numpy.mean(predictions == self.Y)
print("Prediction Accuracy: %.2f%%" % (accuracy*100))
elif self.method == 'multiple':
predictions = []
for i in range(0, len(pr_Y)-1):
for j in range(0, len(pr_Y[i])-1):
predictions.append(int(round(pr_Y[i][j]) - self.Y[i][j]))
accuracy_total = len([x for x in predictions if x == 0])/len(predictions)
accuracy_tooneg = len([x for x in predictions if x == -1])/len(predictions)
accuracy_toopos = len([x for x in predictions if x == 1])/len(predictions)
print("Prediction Accuracy: %.2f%% (positive-error:%.2f%%/negative-error:%.2f%%)" % (accuracy_total*100, accuracy_tooneg*100, accuracy_toopos*100))
else:
accuracy = numpy.mean((self.Y - pr_Y)**2)
print("MSE: %.2f" % (numpy.sqrt(accuracy)))
#save predicted result
if self.ofp != False:
numpy.savetxt(self.ofp, pr_Y, fmt='%5s')
#----------------------------
# select mode
#----------------------------
m = MakeModel(args)
if args.mode == ['create']:
#make model
m.load_dataset()
m.train_model()
else:
#predict dataset
m.predict_ds()
m.load_dataset()
m.predict_ds()
エラー文
File "auto_analyzer.py", line 190, in <module>
m.predict_ds()
File "auto_analyzer.py", line 152, in predict_ds
model = load_model(self.mfp)
File "C:\Users\shinozaki\Anaconda3\envs\jbmes\lib\site-packages\keras\engine\s
aving.py", line 417, in load_model
f = h5dict(filepath, 'r')
File "C:\Users\shinozaki\Anaconda3\envs\jbmes\lib\site-packages\keras\utils\io
_utils.py", line 197, in init
'Received: {}.'.format(type(path)))
TypeError: Required Group, str or dict. Received: <class 'bool'>.
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
Lhankor_Mhy
2019/06/22 16:10
コードをご提示ください。
tubusio
2019/06/24 14:53
すいません返信遅れました。
了解です。
Lhankor_Mhy
2019/06/24 15:11
パラメータが間違っている、というのが一番ありそうな気がします。
tubusio
2019/06/24 15:21
と、いいますと。。
Lhankor_Mhy
2019/06/24 15:32
エラーを見ると、ファイルパスなどがあるべきところ、ブール値が入っているのが原因だと思います。
で、クラスのコードを見ると、
if args.model_file != False:
self.mfp = args.model_file[0]
else:
self.mfp = False
のような処理をしていますから、パラメータの指定が漏れているのではないかと思ったのですが……
的外れでしたでしょうか?
tubusio
2019/06/24 15:37
うーん、、どうなんでしょう。。
もしそうだとしたらfileの0の部分を違う数字にかえるということですか?
学校の研究でやっているのでぜんぜん知識がなくて、、すいません
Lhankor_Mhy
2019/06/24 15:41
「fileの0の部分」というのが何のことなのかわからないですが、それで動きそうなら試してみてはいかがですか?
tubusio
2019/06/24 15:52
あ、すいません
file[0]の0の部分のことです
Lhankor_Mhy
2019/06/24 16:17
たぶん、それは違うんじゃないですかね……
呼び出し時の --model_file パラメータを指定していないのではないか、という話です。
すみませんが、python のことはともかく、keras モジュールについて私は全然わからないので、ご理解のほどよろしくお願いします。
tubusio
2019/06/24 18:17
なるほど
指定というと具体的にはどのようにプログラムをかればいいんでしょうか?
Lhankor_Mhy
2019/06/24 19:12
逆に今まではどのように呼び出していたのでしょうか?
Lhankor_Mhy
2019/06/24 19:14
あ、別にはぐらかしているわけではないですよ。
なにかのバッチ処理で呼んでいるのであれば、そのコードを変える必要があると思いますので、念のために聞いています。コマンドラインで呼んでいるのであれば、その呼び方をご提示ください。
tubusio
2019/06/25 01:30
python auto_analyzer.py --mode predict --input_file 100.150.csv --method binary
です。
Lhankor_Mhy
2019/06/26 09:50
そうすると、そのコマンドに --model_file でファイルパスを指定すればいいのではないでしょうか。
tubusio
2019/06/26 10:24
なるほど、、、、
試してみます!
tubusio
2019/06/26 10:30
今やってみたら今度は別のエラーが、、、w
File "auto_analyzer.py", line 182, in <module>
m = MakeModel(args)
File "auto_analyzer.py", line 48, in __init__
self.mfp = args.model_file[0]
IndexError: list index out of range
Lhankor_Mhy
2019/06/26 10:34
--model_file の後に何も書かなかった、とかではないですか?
tubusio
2019/06/27 08:11
あ、なにも書いてないですね。
それって読み込むcsvのファイル名入れればいいんですかね。。。?
ちょっと試してみます
tubusio
2019/06/27 08:12
だめでした
何のファイルを指定すればいいんですかね、、、
Lhankor_Mhy
2019/06/27 09:30
うーん、ニューラルネットワークのことはよくわからないので、どちらかというとご研究をされているtubusioさんの方がご専門では……?
tubusio
2019/06/27 12:55
なるほど、、ちょっといろいろ探ってみますw
長くつきあっていただいてありがとうございました!
tubusio
2019/06/27 15:03
プログラムうごきました!
ありがとうございました!!!!
Lhankor_Mhy
2019/06/27 15:04
ご解決されて何よりです。
自己解決の処理をお願いします。
https://teratail.com/help#resolve-myself