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

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

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

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

Q&A

解決済

2回答

19929閲覧

Internal Server Errorの解決方法が知りたい。

1976kaca

総合スコア15

Python 3.x

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

0グッド

0クリップ

投稿2018/09/28 15:06

編集2018/09/28 15:26

初心者です。Python機械学習プログラミング[第2版]で勉強中です。
第9章 9.4.1で映画レビュー分類アプリケーションを作成しました。
ローカルサーバーで起動したらうまくいき、
PythonAnywhereにファイルをアップロードして、webを
1.映画レビュー入力画面
2.フィードバック入力画面
までは表示できるようになったのですが、
フィードバックをクリックすると、
以下のエラー表示の画面になります。

Internal Server Error
The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.

コードは以下になります。

python

1from flask import Flask, render_template, request 2from wtforms import Form, TextAreaField, validators 3import pickle 4import sqlite3 5import os 6import numpy as np 7 8from vectorizer import vect 9 10app = Flask(__name__) 11 12cur_dir = os.path.dirname(__file__) 13clf = pickle.load(open(os.path.join(cur_dir, 'pkl_objects', 'classifier.pkl'), 14 'rb')) 15db = os.path.join(cur_dir, 'reviews.sqlite') 16 17def classify(document): 18 label = {0: 'negative', 1: 'positive'} 19 X = vect.transform([document]) 20 y = clf.predict(X)[0] 21 proba = clf.predict_proba(X).max() 22 return label[y], proba 23 24def train(document, y): 25 X = vect.transform([document]) 26 clf.partial_fit(X, [y]) 27 28def sqlite_entry(path, document, y): 29 conn = sqlite3.connect(path) 30 c = conn.cursor() 31 c.execute("INSERT INTO review_db (review, sentiment, date)"\ 32 " VALUES (?, ?, DATETIME('now'))", (document, y)) 33 conn.commit() 34 conn.close() 35 36class ReviewForm(Form): 37 moviereview = TextAreaField('', 38 [validators.DataRequired(), 39 validators.length(min=15)]) 40@app.route('/') 41def index(): 42 form = ReviewForm(request.form) 43 return render_template('reviewform.html', form=form) 44 45@app.route('/results', methods=['POST']) 46def results(): 47 form = ReviewForm(request.form) 48 if request.method == 'POST' and form.validate(): 49 review = request.form['moviereview'] 50 y, proba = classify(review) 51 return render_template('results.html', 52 content=review, 53 prediction=y, 54 probability=round(proba*100, 2)) 55 return render_template('reviewform.html', form=form) 56 57@app.route('/thanks', methods=['POST']) 58def feedback(): 59 feedback = request.form['feedback_button'] 60 review = request.form['review'] 61 prediction = request.form['prediction'] 62 63 inv_label = {'negative': 0, 'positive': 1} 64 y = inv_label[prediction] 65 if feedback == 'Incorrect': 66 y = int(not(y)) 67 train(review, y) 68 sqlite_entry(db, review, y) 69 return render_template('thanks.html') 70 71if __name__ == '__main__': 72 app.run()

エラーログは以下です。
2018-09-28 14:56:46,612: Exception on /thanks [POST]#012Traceback (most recent call last):#012 File "/usr/lib/python3.5/site-packages/flask/app.py", line 2292, in wsgi_app#012 response = self.full_dispatch_request()#012 File "/usr/lib/python3.5/site-packages/flask/app.py", line 1815, in full_dispatch_request#012 rv = self.handle_user_exception(e)#012 File "/usr/lib/python3.5/site-packages/flask/app.py", line 1718, in handle_user_exception#012 reraise(exc_type, exc_value, tb)#012 File "/usr/lib/python3.5/site-packages/flask/_compat.py", line 35, in reraise#012 raise value#012 File "/usr/lib/python3.5/site-packages/flask/app.py", line 1813, in full_dispatch_request#012 rv = self.dispatch_request()#012 File "/usr/lib/python3.5/site-packages/flask/app.py", line 1799, in dispatch_request#012 return self.view_functionsrule.endpoint#012 File "/home/1976kaca/movieclassifier/app.py", line 67, in feedback#012 train(review, y)#012 File "/home/1976kaca/movieclassifier/app.py", line 26, in train#012 clf.partial_fit(X, [y])#012 File "/usr/lib/python3.5/site-packages/sklearn/linear_model/stochastic_gradient.py", line 540, in partial_fit#012 self._validate_params()#012 File "/usr/lib/python3.5/site-packages/sklearn/linear_model/stochastic_gradient.py", line 89, in _validate_params#012 if self.max_iter is not None and self.max_iter <= 0:#012AttributeError: 'SGDClassifier' object has no attribute 'max_iter'

AttributeErrorを解決するには、どこから手を付けたらいいのかわかりません。
教えていただけないでしょうか?

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

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

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

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

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

tiitoi

2018/09/28 15:17

動かしたコードを追記できますか。
1976kaca

2018/09/28 15:24

ありがとうございます。追記します。
guest

回答2

0

エラーをそのまま解釈すると、sklearn.linear_model.SGDClassifier.partial_fit() オブジェクトは max_iter という attribute を持ってないということになります。

ただ実際持っているはずなので、変ですね。

python

1from sklearn.linear_model import SGDClassifier 2 3clf = SGDClassifier() 4print(type(clf)) 5print(clf.max_iter)

追記

hayataka2049 さんがおっしゃる通りバージョンの問題っぽいですね
最近のバージョンで追加されたみたいです。

max_iter : int, optional The maximum number of passes over the training data (aka epochs). It only impacts the behavior in the fit method, and not the partial_fit. Defaults to 5. Defaults to 1000 from 0.21, or if tol is not None. New in version 0.19.

バージョンは以下で確認できます。

import sklearn print(sklearn.__version__) # 0.19.2

投稿2018/09/28 15:40

編集2018/09/28 15:43
tiitoi

総合スコア21956

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

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

1976kaca

2018/09/28 15:54

ありがとうございます。ローカルとpythonanywhereでのバージョン違い確認できました。 ここから先は、pythonanywhereのコンソールで、sklearn古いバージョンのダウンロードをすればいいのでしょうか?
guest

0

ベストアンサー

ローカルで学習に使ったsklearnとPythonAnywhereのsklearnのバージョンが一致しているか確認してみてください。

憶測ですが、PythonAnywhereはバージョン0.18系(かそれ以前)なのでは? か、ローカルが古いか。どちらかはたぶん新しいはずです。

http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html
http://scikit-learn.org/0.18/modules/generated/sklearn.linear_model.SGDClassifier.html#sklearn.linear_model.SGDClassifier

max_iterはversion 0.19からで、内部の属性も同時に追加されているはず。

投稿2018/09/28 15:38

編集2018/09/28 15:45
hayataka2049

総合スコア30933

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

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

1976kaca

2018/09/28 15:39

ありがとうございます。調べてみます^ - ^
1976kaca

2018/09/28 15:49

わかりました!! ローカルは、0.18.1で古かったです!!
hayataka2049

2018/09/28 15:52

ローカルのsklearnをバージョンが合うようにアップデートして、もし必要になるならコードをバージョンアップに対応するよう編集し、fitし直してpickleのオブジェクトを作り直してpythonanywhereにデプロイ、という手順で動くところまで持っていけると思います
hayataka2049

2018/09/28 15:56

ん、今最新版を入れるとsklearn0.20が入っちゃうのか。サーバ側のバージョンはなんでしょう? 不要なトラブルを避けるために、バージョンきっちり合わせて入れた方が良いかも
hayataka2049

2018/09/28 15:59

サーバ側のダウングレードで済ませるなら、それはそれで一つの選択です・・・
1976kaca

2018/09/28 16:01 編集

なるほど、大掛かりになりそうですね。 サーバー側のダウングレードチャレンジしてみます!
hayataka2049

2018/09/28 16:04 編集

依存がなければできます。 pip install --upgrade sklearn==0.18.1 で入るかな?
1976kaca

2018/09/28 16:13

コンソールからpipを打ち込んでもinvalid syntaxとなってしまいます。
hayataka2049

2018/09/28 16:15 編集

pythonインタプリタを立ち上げた状態でやっていませんか? >>> の右側に打ち込んでいたらその状態です。ctrl-dとかで抜けられるはずなのでbashに戻ってください
1976kaca

2018/09/28 16:21

ありがとうございます。 結果は以下になりました。 Could not find a version that satisfies the requirement sklearn==0.18.1 (from versions: 0.0)
1976kaca

2018/09/28 23:18

ありがとうございます。 pip3.6 install --user scikit-learn==0.18.1でインストールできました。 webもローカルと同じ動きになりました!!
1976kaca

2018/09/28 23:46

ちなみに、エラーログでそんな属性はない、という表現があったら、バージョン違いを疑えってことでしょうか?
hayataka2049

2018/09/29 05:03 編集

今回のはそうとう稀なケースなので、普通は他に原因があることが多いと思います。真っ先に疑うような原因ではないです。 ただ、pickleを介したインスタンスのやり取りで属性がないって言われちゃう原因はなんだろう? って考えながら検索したり、ドキュメントやソースを読んだりして、最近のバージョンで更新されていたので、それでこういう挙動になり得るな、と。
1976kaca

2018/09/29 09:40

ありがとうございます。 参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問