본문 바로가기

My Project

[코드스테이츠 / Flask] 머신러닝 모델을 웹서비스로 구현하기

0. 작업 계획

① 모델 저장 : 모델을 학습시키고 저장한다

② 시작 페이지 : 여섯가지 정보를 입력받는 박스가 있고 predict를 통해 정보를 전송한다

③ 결과 페이지 : 저장해둔 모델을 불러온다. 입력받은 정보를 통해 모델 예측 결과를 반환한다

 

 

1. 완성된 모델 피클링

먼저 '식당 위생 검사' 데이터를 이용해 머신러닝 모델을 만들었다. 시설타입, 위험성, 위치한 도시, 검사 종류, 검사 시기를 통해 위생 검사 통과 여부를 예측하는 모델이다. 모델을 학습시키고 테스트까지 마친 후, 피클링을 통해 모델을 flask_app 폴더 내에 저장했다. 

 

import joblib
joblib.dump(clf, './flask_app/model.pkl')

 

 

2. flask_app

본격적으로 flask 앱을 만들어보자. 

위 캡처처럼 애플리케이션 구현에 필요한 것들은 모두 flask_app 폴더를 따로 만들어 넣어두었다. 피클링된 모델(model.pkl)과 html 파일이 들어갈 templates 폴더, flask app을 만들 __init__.py가 있다.

 

 

3. index.html

시작페이지가 될 html 파일이다. 

 

<form> 태크를 사용해 여섯가지 정보를 입력받고 서버로 전송한다. 이 form은 서버의 /predict 경로로 HTTP POST 요청을 보내는 역할을 하게된다.

 

또, <select>와 <option> 태그를 이용해 정보 입력 시 몇가지 옵션 안에서 고를 수 있도록 하였다.

 

<!DOCTYPE html>
<html>
<head>
    <title>Home</title>
</head>
<body>
    <h1>Input Form</h1>
    
    # action
    <form action="/predict" method="post"> 
		
        # 정보 입력받을 박스 생성
        <label for="Facility Type">Facility Type:</label>
        <select id="Facility Type" name="Facility Type" required>
            <option value="">Select an option</option>
            <option value="restaurant">restaurant</option>
            <option value="grocery store">grocery store</option>
            <option value="liquor store">liquor store</option>
        </select><br><br>

        <label for="Risk">Risk</label>
        <select id="Risk" name="Risk" required>
            <option value="">Select an option</option>
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
        </select><br><br>

        <label for="City">City</label>
        <select id="City" name="City" required>
            <option value="">Select an option</option>
            <option value="CHICAGO">CHICAGO</option>
            <option value="ETC">ETC</option>
        </select><br><br>

        <label for="Inspection Type">Inspection Type</label>
        <select id="Inspection Type" name="Inspection Type" required>
            <option value="">Select an option</option>
            <option value="Canvass">Canvass</option>
            <option value="License">License</option>
            <option value="Complaint">Complaint</option>
        </select><br><br>

        <label for="Inspection Year">Input Data 3:</label>
        <input type="text" id="Inspection Year" name="Inspection Year" required><br><br>

        <label for="Inspection Month">Input Data 3:</label>
        <input type="text" id="Inspection Month" name="Inspection Month" required><br><br>

        <input type="submit" value="Predict">
    </form>
</body>
</html>

 

 

 

4. __init__.py (flask 앱 구현)

시작 페이지는 'index.html'을 렌더링하는 방식으로 구현한다.

 

결과 페이지에서는 request.form을 통해 데이터를 가져오고, 불러온 모델로 예측을 수행한다. 그리고 예측된 값들을 /predict 페이지에 출력한다.

# 라이브러리
from flask import Flask, render_template, request, jsonify
import joblib
import os

app = Flask(__name__)

# 모델 로드
model_path = os.path.join(os.path.dirname(__file__), 'model.pkl')
model = joblib.load(model_path)

# 시작 페이지
@app.route('/')
def index():
    return render_template('index.html')

# 결과 페이지 : 첫 페이지에서 받은 정보로 예측을 수행하여 결과를 반환한다
@app.route('/predict', methods=['POST'])
def predict():
    # 입력 데이터 받기
    facility_type = request.form['Facility Type']
    risk = request.form['Risk']
    city = request.form['City']
    inspection_type = request.form['Inspection Type']
    inspection_year = request.form['Inspection Year']
    inspection_month = request.form['Inspection Month']

    # 예측 수행
    prediction = model.predict([[facility_type, risk, city, inspection_type, inspection_year, inspection_month]])

    # 결과 반환
    if prediction.tolist() == [0] :
        response = "식품 품질 검사 통과"
    else :
        response = "식품 품질 검사 불통"
    return response

if __name__ == '__main__':
    app.run()

 

 

5. 실행

__init__.py를 실행시키면 http://localhost:5000 에서 구현된 플라스크 앱을 확인할 수 있다.

 

시작 페이지

결과 페이지