학습된 사이킷런 추정기 저장
- 머신러닝 모델을 훈련하려면 많은 계산 비용이 드는데, 애플리케이션을 재시작 할 때마다 모델을 다시 훈련하는 것은 바람직 하지 않다. 때문에 학습된 모델을 재사용하기 위해 파이썬의 pickle 모듈을 사용하는 것이 좋다.
- 이 모듈은 파이썬 객체의 구조를 압축된 바이트코드로 직렬화하고 복원할 수 있다.
- 분류기의 현재 상태를 저장하고 새로운 샘플을 분류할 때 훈련 데이터에서 모델을 다시 학습할 필요 없이 저장된 모델을 불러오기만 하면 된다.
import pickle
import os
dest = os.path.join('movieclassifier', 'pkl_objects')
if not os.path.exists(dest):
os.makedirs(dest)
pickle.dump(stop, open(os.path.join(dest, 'stopwords.pkl'), 'wb'), protocol=4)
pickle.dump(clf, open(os.path.join(dest, 'classifier.pkl'), 'wb'), protocol=4)
- 8장의 온라인 알고리즘 다음에 위 코드를 실행하면 ‘../movieclassifier/pkl_objects/’ 패스에 직렬화된 파이썬 객체를 저장한다.
- pickle 모듈의 dump 메서드를 사용하여 훈련된 로지스틱 회귀 모델 뿐만 아니라 NLTK 라이브러리의 불용어도 직렬화하여 저장한다. 이렇게 하면 서버에 NLTK 라이브러리를 설치할 필요가 없다.
- protocol=4는 파이썬 3.4 버전 이상에서 사용할 수 있는 최신 pickle 프로토콜이다.
- HashingVectorizer는 학습 과정이 없어서 pickle로 직렬화할 필요가 없다. 대신 현재 사용 중인 파이썬 세션에서 HashingVectorizer 객체를 임포트할 수 있도록 파이썬 스크립트를 만들어 보겠다.
from sklearn.feature_extraction.text import HashingVectorizer
import re
import os
import pickle
cur_dir = os.path.dirname(__file__)
stop = pickle.load(open(os.path.join(cur_dir, 'pkl_objects', 'stopwords.pkl'), 'rb'))
def tokenizer(text):
text = re.sub('<[^>]*>', '', text)
emoticons = re.findall('(?::|;|=)(?:-)?(?:\\)|\\(|D|P)', text.lower())
text = re.sub('[\\W]+', ' ', text.lower()) + ' '.join(emoticons).replace('-', '')
return [w for w in text.split() if w not in stop]
vect = HashingVectorizer(decode_error='ignore', n_features=2**21, preprocessor=None, tokenizer=tokenizer)
- movieclassifier 디렉터리를 이동하여 아래 코드를 실행하면 vectorizer를 임포트하고 분류기를 복원하고, 복원한 분류기 객체를 사용하여 문서 샘플을 전처리하고 감성 레이블을 예측한다.
import pickle
import re
import os
from vectorizer import vect
import numpy as np
clf = pickle.load(open(os.path.join('pkl_objects', 'classifier.pkl'), 'rb'))
label = {0:'양성', 1:'음성'}
example = ['I love this movie']
X = vect.transform(example)
print('예측: %s\\n확률: %.2f%%' % (label[clf.predict(X)[0]], np.max(clf.predict_proba(X))*100))
데이터를 저장하기 위해 SQLite 데이터베이스 설정
- SQLite는 오픈소스 SQL 데이터베이스 엔진으로 대부분의 운영 체제를 지원한다. 파이썬은 표준 라이브러리에 SQLite 데이터베이스를 위한 sqlite3 API가 이미 포함되어 있기 때문에 SQLite를 이용하면 편리하다.
- 파이썬에서 SQLite를 사용하는 예시는 아래와 같다.
import sqlite3
conn = sqlite3.connect('reviews.sqlite')
c = conn.cursor()
c.execute('DROP TABLE IF EXISTS review_db')
c.execute('CREATE TABLE review_db (review TEXT, sentiment INTEGER, date TEXT)')
example1 = 'I love this movie'
c.execute("INSERT INTO review_db (review, sentiment, date) VALUES (?, ?, DATETIME('now'))", (example1, 1))
example2 = 'I dislike this movie'
c.execute("INSERT INTO review_db (review, sentiment, date) VALUES (?, ?, DATETIME('now'))", (example2, 0))
c.execute("SELECT * FROM review_db WHERE date BETWEEN '2017-01-01 00:00:00' AND DATETIME('now')")
results = c.fetchall()
conn.commit()
conn.close()
print(results)
플라스크 웹 애플리케이션 개발
- 플라스크(Flask)는 파이썬으로 만들어진 웹 프레임워크이다.
첫 번째 플라스크 애플리케이션
- 플라스크 API와 친숙해지기 위해 우선 간단한 웹 애플리케이션을 만들어보겠다. 첫 번째로 만들 애플리케이션은 이름을 입력하는 폼 필드 하나만 가진 간단한 웹 페이지로 구성된다.
- 먼저 아래와 같은 디렉터리 구조를 만든다.
1st_flask_app_1/
app.py
templates/
first_app.html
- app.py 파일은 플라스크 웹 애플리케이션을 구동하기 위해 파이썬 인터프리터로 실행할 핵심 코드를 담고 있다.
- 플라스크는 templates 디렉터레에서 웹 브라우저에 표시할 정적인 HTML 파일을 찾는다.
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('first_app.html')
if __name__ == '__main__':
app.run()