플라스크를 사용하여 기계 학습 모델 배포


기계 학습 초보자로서 기계 학습 및 딥 러닝을 위한 모든 알고리즘에 대한 충분한 리소스를 누구나 쉽게 얻을 수 있지만 ML 모델을 프로덕션에 배포하기 위한 참조를 찾기 시작했을 때 좋은 리소스를 찾지 못했습니다. 내가 이 분야에 아주 익숙하기 때문에 내 모델을 배포하는 데 도움이 될 수 있습니다. 그래서 Heroku에서 Flask를 사용하여 내 모델을 배포하는 데 성공했을 때 다른 사람들이 모델을 간단하게 배포할 수 있도록 돕기 위해 기사를 작성하기로 결정했습니다. 나는 그것이 도움이되기를 바랍니다 :)

Live Demo
이 기사에서는 단순화를 위해 scikit-learn과 함께 간단한 로지스틱 회귀 알고리즘을 사용하고 매우 가벼운 웹 프레임워크인 Flask를 사용합니다. 우리는 두 개의 파일을 만들 것입니다.
  • model.py
  • app.py

  • model.py 파일에서 우리는 모델을 개발하고 훈련할 것이고, app.py에서는 POST 요청을 처리하고 결과를 반환하도록 코딩할 것입니다.
  • model.py

  • 이 파일에서 ML 모델을 개발하고 훈련합니다. 증상을 바탕으로 사람의 심장병을 예측합니다. 데이터 세트here를 찾을 수 있습니다.

    import pandas as pd
    import sys
    import numpy as np
    import pickle
    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import LogisticRegression
    


    모델을 개발하는 데 사용할 라이브러리를 가져옵니다. NumPy와 pandas는 행렬과 데이터를 각각 조작하고, sklearn.model_selection은 데이터를 훈련 세트와 테스트 세트로 분할하고, sklearn.linear_model은 LogisticRegression을 사용하여 모델을 훈련시킵니다. 피클을 사용하여 훈련된 모델을 디스크에 저장합니다.

    df=pd.read_csv('heart-data.csv')
    x=df.drop('target', axis=1)
    y=df['target']
    


    Pandas를 사용하여 데이터 세트를 가져오고 기능과 레이블을 데이터 세트에서 분리했습니다.

    train_x,valid_x,train_y,valid_y=train_test_split(x,y,test_size=0.3,random_state=35)
    


    이 섹션에서는 sklearn의 train_test_split을 사용하여 데이터를 각각 0.70 및 0.30의 훈련 및 테스트 크기로 분할했습니다.

    logr=LogisticRegression()
    logr.fit(train_x,train_y)
    result=logr.predict(valid_x)
    


    객체는 LogisticRegression() 클래스의 logr로 인스턴스화되고 tarin_x 및 train_y를 사용하여 훈련됩니다. 나중에 예측된 결과가 결과에 저장됩니다.

    pickle.dump(logr,open('model.pkl','wb'))
    model=pickle.load(open('model.pkl','rb'))
    


    피클 라이브러리를 사용하여 훈련된 모델을 디스크에 저장합니다. Pickle은 Python 개체 구조를 직렬화 및 역직렬화하는 데 사용됩니다. 파이썬 객체가 바이트 스트림으로 변환되는 곳.

    우리의 경우 서버에서 사용할 수 있도록 모델을 저장하려고 합니다. 따라서 객체 logr을 model.pkl이라는 파일에 저장합니다.

    여기서 model.py는 모델을 훈련하고 저장할 준비가 되었습니다. model.py의 전체 코드는 다음과 같습니다.

    # Importing the libraries
    import pandas as pd
    import sys
    import numpy as np
    import pickle
    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import LogisticRegression
    
    # Importing the dataset
    df=pd.read_csv('heart-data.csv')
    df.rename(columns={"class":"target"},inplace=True)
    df['target'].replace(['absent','present'],[0,1],inplace=True)
    df=pd.get_dummies(df)
    x=df.drop('target', axis=1)
    y=df['target']
    #Splitting the dataset into the Training set and Test set
    train_x,valid_x,train_y,valid_y=train_test_split(x,y,test_size=0.3,random_state=35)
    
    # Fitting Simple Linear Regression to the Training set
    logr=LogisticRegression()
    logr.fit(train_x,train_y)
    pickle.dump(logr,open('model.pkl','wb'))
    model=pickle.load(open('model.pkl','rb'))
    
    # Predicting the Test set results
    result=model.predict(valid_x)
    print(result)
    


    2.app.py

    이 파일에서 플라스크 웹 프레임워크를 사용하여 UX에서 가져올 POST 요청을 처리합니다.

    코드에서 사용할 메서드 및 라이브러리를 가져옵니다.

    from flask import Flask
    from flask import render_template,redirect,request
    import pandas as pd
    import sys
    import numpy as np
    import pickle
    


    다음 코드 섹션에서는 Flask()의 인스턴스를 만들고 모델을 모델에 로드했습니다.

    app=Flask(__name__)
    
    model=pickle.load(open('model.pkl','rb'))
    


    여기에 result() 메서드가 있습니다. 어떤 resut 메소드가 사용자가 전달한 양식에서 데이터를 가져옵니다. model.predict() 메서드는 양식에서 입력을 받아 2D numpy 배열로 변환합니다. 결과는 result라는 변수에 저장되고 이 변수를 반환합니다.

    @app.route("/result", methods = ['POST', 'GET'])
    def result():
        if request.method=='POST':
    #geting data from html form
            age=request.form["age"]
            .
            .
    # after geting data appending in a list
            lst=list()
            lst.append((age))
            lst.append((sex))
            lst.append((chest))
            lst.append((resting_blood_pressure))
            lst.append((serum_cholestoral))
            lst.append((fasting_blood_sugar))
            lst.append((resting_electrocardiographic_results))
            lst.append((maximum_heart_rate_achieved))
            lst.append((exercise_induced_angina))
            lst.append((oldpeak))
            lst.append((slope))
            lst.append((number_of_major_vessels))
            lst.append((thal))
    # converting list into 2 D numpy array
            ans=model.predict([np.array(lst,dtype='int64')])
            result=ans[0]
            return render_template("result.html",result=result)
    
        else:
            return render_template("index.html")
    


    마지막으로 다음 코드 섹션에서 앱을 실행합니다. 여기에서는 포트 5000을 사용하고 debug=True로 설정했습니다. 오류가 발생하면 이를 디버깅하고 해결할 수 있기 때문입니다.

    
    if __name__=='__main__':
        app.run(port=5000,debug=True)
    


    내 Github 저장소heart-disease-predictor에서 모든 코딩을 찾을 수 있습니다.
    주저하지 말고 아래 댓글 섹션에 아이디어를 입력하세요.

    고맙습니다 :)

    좋은 웹페이지 즐겨찾기