[51CTO.com クイック翻訳] データ サイエンティスト/機械学習エンジニアが Scikit-Learn、TensorFlow、Keras、または PyTorch を使用して機械学習モデルを開発する場合、最終的な目標はそれを本番環境にデプロイすることです。機械学習プロジェクトに取り組むとき、探索的データ分析 (EDA)、特徴量エンジニアリング、ハイパーパラメータ調整に重点を置きすぎて、モデルの予測から実際の価値を抽出するという主な目標を忘れてしまうことがよくあります。
機械学習モデルをデプロイする、またはモデルを本番環境にデプロイするということは、モデルをエンドユーザーまたはシステムが利用できるようにすることを意味します。ただし、機械学習モデルの導入には複雑さが伴います。この記事の目的は、Flask API を使用してトレーニング済みの機械学習モデルを本番環境にデプロイする方法を学ぶことです。
線形回帰を使用して、金利と最初の 2 か月の売上を使用して 3 か月目の売上を予測します。
線形回帰とは何ですか? 線形回帰モデルの目的は、1 つ以上の特徴 (独立変数) と連続ターゲット変数 (従属変数) 間の関係を見つけることです。特徴が 1 つしかない場合は単変量線形回帰と呼ばれ、特徴が複数ある場合は多変量線形回帰と呼ばれます。
線形回帰の仮定 線形回帰モデルは次の式で表すことができます。
Yは予測値である θ₀は部分項です。 θ₁,…,θnはモデルパラメータである x1、x2、…、xnは固有値です。
図1. 線形回帰図
Flask を使用する理由は何ですか? 使いやすいです。 組み込みの開発サーバーおよびデバッガー。 統合されたユニットテストのサポート。 REST リクエストディスパッチを活用します。 広範なドキュメント。 プロジェクト構造 このプロジェクトは 4 つの部分から構成されます。
model.py – 最初の 2 か月の売上に基づいて 3 か月目の売上を予測する機械学習モデルのコードが含まれています。 app.py – これには、GUI または API 呼び出しを通じて売上の詳細を受け取り、モデルに基づいて予測値を計算して返す Flask API が含まれています。 request.py — request モジュールを使用して、app.py で定義された API を呼び出し、戻り値を表示します。 HTML/CSS – ユーザーが売上の詳細を入力し、3 か月目の予測売上を表示できるようにする HTML テンプレートと CSS スタイルが含まれています。
図2. 機械学習モデルを展開するためのパイプライン
環境とツール サイキットラーン パンダ ナンピー フラスコ コードはどこですか? コードから始めましょう。 Github 上のプロジェクト全体は、こちらからご覧いただけます。
まず、ユーザーが値を入力できるように HTML を使用してフロントエンドを構築します。ユーザーは、金利、初月の売上、2 か月目の売上の 3 つのフィールドに入力する必要があります。
<!DOCTYPE html> <html> <ヘッド> <メタ文字セット= "UTF-8" > <title>デプロイメントチュートリアル 1</title> <link href= 'https://fonts.googleapis.com/css?family=Pacifico' rel= 'スタイルシート' type= 'text/css' > <link href= 'https://fonts.googleapis.com/css?family=Arimo' rel= 'スタイルシート' type= 'text/css' > <link href= 'https://fonts.googleapis.com/css?family=Hind:300' rel= 'スタイルシート' type= 'text/css' > <link href= 'https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300' rel= 'スタイルシート' type= 'text/css' > <link rel= "スタイルシート" href= "{{ url_for('static', filename='css/style.css') }}" > </head> <body style= "背景: #000;" > <div クラス = "ログイン" > <h1>売上予測</h1> <! <フォームアクション = "{{ url_for('predict')}}" メソッド = "post" > <入力タイプ= "テキスト" name = "rate" placeholder = "rate" required = "必須" /> <入力タイプ= "テキスト" name = "初月の売上" placeholder = "初月の売上" required = "必須" /> <入力タイプ= "テキスト" name = "2 か月目の売上" placeholder = "2 か月目の売上" required = "必須" /> <button type= "submit" class= "btn btn-primary btn-block btn-large" > 3 か 月 目の 売上を予測する</button> </フォーム> <br> <br> {{予測テキスト}} </div> </本文> </html> 次に、CSS を使用して、入力ボタン、ログイン ボタン、背景のスタイルを構築しました。
url をインポートします (https://fonts.googleapis.com/css?family=Open+Sans )。 html { 幅: 100%; 高さ: 100%; オーバーフロー: 非表示; } 体 { 幅: 100%; 高さ:100%; フォントファミリ: 'Helvetica' ; 背景: #000; 色: #fff; フォントサイズ : 24px; テキスト配置:中央; 文字間隔:1.4px; } 。ログイン { 位置:絶対 ; 上位 :40% 左 :50%; マージン: -150px 0 0 -150px; 幅:400ピクセル; 高さ:400px; } .login h1 { 色: #fff; テキストシャドウ: 0 0 10px rgba(0,0,0,0.3); 文字間隔: 1px; テキスト配置: center; } 入力{ 幅: 100%; 下マージン: 10px; 背景: rgba(0,0,0,0.3); 境界線: なし; アウトライン: なし; パディング: 10px; フォントサイズ : 13px; 色: #fff; テキストシャドウ: 1px 1px 1px rgba(0,0,0,0.3); 境界線: 1px実線rgba(0,0,0,0.3); 境界線の半径: 4px; ボックスシャドウ: インセット 0 -5px 45px rgba(100,100,100,0.2), 0 1px 1px rgba(255,255,255,0.2); -webkit-transition: box-shadow .5s のイージー; -moz-transition: box-shadow .5s のイーズ; -o-transition: box-shadow .5s のイーズ; -ms-transition: ボックスシャドウ .5s の緩和; transition: box-shadow .5s のイーズ; } GitHub で ❤ で ホストされている rawstyle.css を 表示 > このプロジェクト用に、金利、最初の月の売上、2 か月目の売上、3 か月目の売上の 4 つの列を持つカスタム売上データセットを作成しました。
レート
最初の月の売上
2か月目の売上
3か月目の売上
2
500
300
4
300
650
4つ
600
200
400
九
450
320
650
セブン
600
250
350
五
550
200
700
GitHub で ❤ でホストされている 生のsales.csv を 表示
それでは、3 か月目の売上を予測する機械学習モデルを構築しましょう。まず、Pandas を使用して欠損値を処理してみましょう。 1 つ以上の項目に情報が提供されない場合、データは失われます。値が指定されていない場合は、Interest Rate 列にゼロを入力し、First Month Sales 列に列の平均値を入力します。機械学習アルゴリズムとして線形回帰を使用しています。
シリアル化/デシリアル化 簡単に言うと、シリアル化とは、Python オブジェクトをディスク上に書き込み (オブジェクトはどこにでも転送可能)、後で Python スクリプトによって逆シリアル化 (読み戻す) する方法です。
図3. シリアル化とデシリアル化
私は、ピクルリングを使用して、Python オブジェクトの形式のこのモデルを文字ストリームに変換します。この文字ストリームには、別の Python スクリプトを使用してオブジェクトを再構築するために必要なすべての情報が含まれているという考え方です。
numpyを np として インポートする matplotlib.pyplot をplt として インポートします。 pandasをpd として インポートする 輸入ピクルス データセット = pd.read_csv( 'sales.csv' ) データセット[ 'rate' ].fillna(0, inplace= True ) データセット[ 'sales_in_first_month' ].fillna(データセット[ 'sales_in_first_month' ].mean(), inplace= True ) X = データセット.iloc[:, :3] def convert_to_int(単語): word_dict = { '1' :1, '2' :2, '3' :3, '4' :4, '5' :5, '6' :6, '7' :7, '8' :8, 「9」 :9、 「10」 :10、 「11」 :11、 「12」 :12、 「0」 :0、「0: 0」} word_dict[単語] を返す X[ 'rate' ] = X[ 'rate' ].apply(lambda x : convert_to_int(x)) y = データセット.iloc[:, -1] sklearn.linear_model から LinearRegression をインポートします 回帰子 = LinearRegression() 回帰器.fit(X, y) pickle.dump(回帰器、 open ( 'model.pkl' 、 'wb' )) モデル = pickle.load ( open ( 'model.pkl' 、 'rb' )) 印刷(モデル.予測([[4, 300, 500]])) GitHub で ❤ で ホストされている rawmodel.py を 表示 次の部分は、GUI を通じて売上の詳細を受け取り、モデルに基づいて予測売上を計算する API を構築することです。これを実行するには、ピクルされたモデルを Python オブジェクトに逆シリアル化します。メインページを設定するには、index.html を使用します。フォームの値が POST を使用して /predict に送信されると、予測された売上が取得されます。
結果を表示するには、/results に別の POST リクエストを送信するだけです。 JSON 入力を受け取り、トレーニング済みのモデルを使用して予測を行い、API エンドポイントを通じてアクセスできる JSON 形式で予測を返します。
numpyを np として インポートする Flaskから Flask、request、jsonify、render_template をインポートします 輸入ピクルス アプリ = Flask(__name__) モデル = pickle.load ( open ( 'model.pkl' 、 'rb' )) @app.route( '/' ) デフホーム(): render_template( 'index.html' ) を返します @app.route( '/predict' , メソッド=[ 'POST' ]) def 予測(): int_features = [ int (x) の x をrequest.form.values () 内に格納 ] final_features = [np.array(int_features)] 予測 = model.predict(final_features) 出力 = round(予測[0], 2) return render_template( 'index.html' , prediction_text= '売上高は $ {} になるはずです' .format( output )) @app.route( '/results' , メソッド=[ 'POST' ]) def 結果(): データ = request.get_json(強制 = True ) 予測 = model.predict([np.array(list( data.values ()))]) 出力 = 予測[0] jsonify( 出力 ) を返す __name__ == "__main__" の場合: app.run(デバッグ= True ) GitHub で ❤ で ホストされている rawapp.py を表示 最後に、request モジュールを使用して、app.py で定義された APP を呼び出します。 3 か月目の返品売上が表示されます。
輸入リクエスト url = 'http://localhost:5000/結果' r = リクエスト.post(url,json={ 'レート' :5, '最初の月の売上' :200, '2番目の月の売上' :400}) 印刷(r.json()) GitHub で ❤ で ホストされている rawrequest.py を 表示 結果 このコマンドを使用して、Web アプリケーションを実行します。
$ pythonアプリ.py
図4
Web ブラウザで http://127.0.0.1:5000/ を開くと、以下に示すような GUI が表示されます。
図5. グラフィカルユーザーインターフェース
結論 この記事では、機械学習モデルをデプロイする非常に簡単な方法を説明しました。線形回帰を使用して、金利と最初の 2 か月の売上を使用して 3 か月目の売上を予測しました。この記事で学んだことを活用して、クールなモデルを構築し、それを本番環境にデプロイして、他の人がその結果を楽しめるようにすることができます。
原題: Flask を使用して機械学習モデルを簡単にデプロイする方法、著者: Abhinav Sagar
[51CTOによる翻訳。パートナーサイトに転載する場合は、元の翻訳者と出典を51CTO.comとして明記してください]