Flaskを使用した機械学習モデルのデプロイ

| | | | | | | | | | |

それらを使用して新しいデータを予測するには、インターネットを介してデータを展開し、外部が使用できるようにする必要があります。この記事では、機械学習モデルをトレーニングし、Flaskを使用してその上にウェブアプリケーションを構築した方法について説明します。

このモデルで使用される必要なライブラリを多数インストールする必要があります。 pipを使用してすべてのライブラリをインストールします。

 pip install pandas pip install numpy pip install sklearn 

デシジョンツリー—
デシジョンツリー—使いやすく、弾力性があり、柔軟性があるため、よく知られている教師あり機械学習アルゴリズムです。 UCI機械学習リポジトリから成人向けデータセットにアルゴリズムを実装しました。

データを取得します—
データセットはこのリンクで取得できます。

データセットの取得は終わりではありません。データを前処理する必要があります。つまり、データセットをクリアする必要があります。データセットのクレンジングには、欠落している値の削除、NA値の入力など、さまざまなタイプのプロセスが含まれます。


#データセットのインポート < / p>

import pandas

import numpy

from sklearn import 前処理


df = pandas.read_csv( `adult.csv`

df.head()

出力:

データセットの前処理&#8212;
14の属性と、個人の収入が年間5万未満かそれ以上かを示すクラスラベルで構成されています。これらの属性は、人の年齢、労働者階級のラベル、関係のステータス、および人が属する人種にまで及びます。すべての属性に関する情報はここにあります。

最初に、欠落しているすべての値を見つけてデータから削除します。この列では、欠落している値をモード値に置き換えました。欠落している値を置き換える方法は他にもたくさんありますが、これはこのデータセットタイプに最適のようです。


df = df.drop([ `fnlwgt` `educational- num` ]、axis = 1

col_names = df.columns


for c in col_names:

df = df.replace( "? " 、numpy。NaN)

df = df。 apply ラムダ x:x.fillna(x.value_counts()。index [ 0 ]))

機械学習アルゴリズムは、カテゴリデータ値を処理できません。数値のみを処理できます。
データを予測モデルに適合させるには、カテゴリ値を数値に変換する必要があります。これを行う前に、カテゴリ列で変換が必要かどうかを評価します。

離散性&#8212; は、カテゴリデータをより正確で意味のあるものにするための一般的な方法です。 marital_status 列に離散化を適用し、既婚または未婚の値のみに絞り込みました。後で、残りのデータ列にラベルエンコーダーを適用します。また、2つの冗長列 {&#39;教育&#39;、&#39; Educational-num&#39;} なので、そのうちの1つを削除しました。


df.replace([ `Divorced` `既婚- AF-spouse`

` Married-civ-spouse` ` Married-spouse-absent`

`未婚` `Separated` `Widowed` ]、 < / p>

[ `divorced` `既婚` `既婚` `既婚` < / p>

`結婚していない` `結婚していない` `結婚していない` ]、インプレース = True


category_col = [ `workclass` `race` `education` `marital-status` `occupation`

`関係` `性別` `native-country` `収入` ]

labelEncoder = preprocessing.LabelEncoder()


mapping_dict = {}

for col in category_col:

df [col] = labelEncoder。 fit_transform(df [col])


le_name_mapping = dict zip (labelEncoder.classes_、

labelEncoder .transform(labelEncoder.classes_)))


mapping_dict [col] = le_name_mapping

print (mapping_dict)

出力:

{`workclass`:{`? `:0、`連邦政府`:1、`地方政府`:2、`未就職`:3、`私立`:4、`自己-emp-inc`:5、`自己-emp-not -inc`:6、` State-gov`:7、` Without-pay`:8}、` ra ce`:{` Amer-Indian-Eskimo`:0、` Asian-Pac-Islander`:1、`黒`:2、`その他`:3、`白`:4}、`教育`:{` 10日`:0、` 11日`:1、` 12日`:2、` 1日-4日`:3、` 5日から6日`:4、` 7日から8日`:5、` 9日`:6、` Assoc-acdm`:7、` Assoc-voc`:8、`学士号`:9、`博士号`:10、` HS-grad`:11、` Masters`:12、` Preschool`:13、` Prof-school`:14、` Some-college`:15}、` marital-status`:{` Divorced`:0、`既婚-AF-配偶者`:1、`既婚-市民-配偶者`:2、`既婚-配偶者-不在`:3、`未婚`:4、`離婚`:5、`未亡人`:6}、 ` 職業 `: {`? `:0、` Adm-clerical`:1、` Armed-Forces`:2、` Craft-repair`:3、` Exec-managerial`:4、` Farming-fishing`:5、` Handlers-cleaners`: 6、`Machine-op-inspct`:7、`Other-service`:8、`Priv-house-serv`:9、`Prof-specialty`:10、`Protective-serv`:11、`Sales`: 12、`Tech-support`:13、`Transport-moving`:14}、`relationship`:{`Husband`:0、`Not-in-family`:1、`Other-relative`:2、`Own -子供`:3、`未婚`:4、`妻`:5}、`性別`:{`女性`:0、`男性`:1}、`母国`:{`? `:0、`カンボジア`:1、`カナダ`:2、`中国`:3、`コロンビア`:4、`キューバ`:5、`ドミニカ共和国`:6、`エクアドル`:7、`エル-サルバドール`:8、`イングランド`:9、`フランス`:10、`ドイツ`:11、`ギリシャ`:12、`グアテマラ`:13、`ハイチ`:14、`ホーランド-オランダ`:15 「ホンジュラス」:16、「ホン」:17、「ハンガリー」:18、「インド」:19、「イラン」:20、「アイルランド」:21、「イタリア」:22、「ジャマイカ」:23、「日本」 `:24、`ラオス`:25、`メキシコ`:26、`ニカラグア`:27、`米国外(グアム-USVIなど)`:28、`ペルー`:29、`フィリピン`:30、 `ポーランド`:31、`ポルトガル`:32、`プエルトリコ`:33、`スコットランド`:34、`南`:35、`台湾`:36、`タイ`:37、`トリナダード&アンプ;トバゴ`:38、`米国`:39、`ベトナム`:40、`ユゴスラビア`:41}、`収入`:{` 50K`:1}}


モデルのフィッティング&#8212;
前処理後、データを機械学習アルゴリズムに転送する準備が整います。次に、属性を持つラベルを削除してデータをスライスします。これで、データセットを2つに分割しました。1つはトレーニング用、もう1つはテスト用です。これは、 train_test_split()sklearn関数を使用して実現されます。


from sklearn。 model_selection import train_test_split

from sklearn.tree import DecisionTreeClassifier

from sklearn.metrics import Accurate_score


X = df.values 、、 0 12 ]

Y = df.values、Äã‚Äã [:、 12 ]

< / td>

ここではdecを使用しました予測モデルとしてのisionツリー分類器。トレーニング部分にモデルをトレーニングするためのデータを提供しました。
トレーニングが完了すると、モデルをテストするためのデータの一部を提供することにより、モデルの精度を検証します。
これにより、精度を達成します。約84%の。ここで、このモデルを新しい未知のデータで使用するには、モデルを保存して、後で値を予測できるようにする必要があります。これを行うには、Pythonで Pickle を使用します。これは、Pythonオブジェクトの構造をシリアル化および逆シリアル化するための強力なアルゴリズムです。


< / p>

X_train、X_test、y_train、y_test = train_test_split(

X、Y、test_size = 0.3 、random_state = 100


dt_clf_gini = DecisionTreeClassifier (基準 = "gini"

random_state = 100

max_depth = 5

min_samples_leaf = 5


dt_clf_gini.fit(X_train、y_train)

y_pred_gini = dt_clf_gini.predict(X_test)


print "Giniインデックス精度を使用した乾燥ツリーは"

Accuracy_score(y_test、y_pred_gini) * 100

出力:

ジニ係数の精度を使用したデシジョンツリーは83.13031016480704です

これで、注入&#8212;
フラスコ&#8212;これは、小さなWebサイトの開発に使用されるPythonベースのマイクロフレームワークです。 Flaskは、Pythonを使用してRestfulAPIを非常に簡単に構築できます。この時点で、さまざまなデータ属性に基づいてデータクラスを予測できる model.pklモデルを開発しました。クラスラベル&#8212; 給与&gt; = 50Kまたは&lt; 50K
次に、ユーザーがすべての属性値を入力し、モデルに与えられたトレーニングに基づいてデータがモデルによって受信されるWebアプリケーションを設計します。データが提供された人の給与を予測します。

HTMLフォーム&#8212;
さまざまな属性からの収入を予測するには、最初にデータ(新しい属性値)を収集してから、上記で構築したデシジョンツリーモデルを使用して、収入が5万を超えるかどうかを予測する必要があります。したがって、データを収集するために、各属性から選択するすべての異なるオプションを含むHTMLフォームを作成します。ここでは、HTMLのみを使用して単純なフォームを作成しました。フォームをよりインタラクティブにしたい場合は、そうすることができます。


&lt; html &gt;

&lt; 本文&gt;

&lt; h3 &gt;収入予測フォーム&lt; / h3 &gt;


&lt; div &gt;

&lt; フォームアクション = "/ result" method = "POST" &gt;

&lt; ラベル for = "age" &gt;年齢&lt; / ラベル&gt;

&lt; 入力タイプ = "text" id = "age" name = "age" &gt ;

&lt; br &gt;

&lt; ラベル for = "w_class" &gt;労働者階級&lt; / ラベル&gt;

&lt; select id = "w_class" name = "w_class" <コードクラス="plain">&gt;

&lt; オプション = "0" &gt;連邦政府&lt; / オプション&gt;

&lt; オプション = "1" &gt;地方政府&lt; / オプション&gt;

&lt; オプション = "2" &gt;働いたことがない&lt; / オプション&gt;

&lt; オプション = "3" &gt;プライベート&lt; / オプション&gt;

&lt; オプション = "4" &gt; Self-emp-inc&lt; / オプション&gt;

&lt; オプション = "5" &gt; Self-emp-not-inc&lt; / オプション&gt;

&lt; オプション = "6" &gt;州政府&lt; / オプション&gt;

&lt; オプション = "7" &gt;なし-支払い&lt; / オプション&gt;

&lt; / select &gt;

&lt; br &gt;

&lt; ラベル for = "edu" &gt;教育&lt; / ラベル&gt;

&lt; select id = "edu" name = "edu" <コードクラス="plain">&gt;

&lt; オプション = "0" &gt; 10日&lt; / オプション&gt;

&lt; オプション = "1" &gt; 11日&lt; / オプション&gt;

&lt; オプション = "2" &gt; 12日&lt; / オプション&gt;

&lt; オプション = "3" &gt; 1〜4位&lt; / オプション&gt;

&lt; オプション = "4" &gt; 5〜6日&lt; / オプション&gt;

&lt; オプション = "5" &gt; 7〜8日&lt; / オプション&gt;

&lt; オプション = "6" &gt; 9日&lt; / オプション&gt;

&lt; オプション = "7" &gt; Assoc-acdm&lt; / オプション&gt;

&lt; オプション = "8" &gt; Assoc-voc&lt; / オプション&gt;

&lt; オプション = "9" &gt;学士号&lt; / オプション&gt;

&lt; オプション = "10" &gt;博士号&lt; / オプション&gt;

&lt; オプション = "11" &gt; HS-grad&lt; / オプション&gt;

&lt; オプション = "12" &gt;マスターズ&lt; / オプション&gt;

&lt; オプション = "13" &gt;就学前&lt; / オプション&gt;

&lt; オプション = "14" &gt;教授学校&lt; / オプション&gt;

&lt; オプション = "15" &gt; 16-一部-大学&lt; / オプション&gt;

&lt; / select &gt;

&lt; br &gt;

&lt; ラベル for = "martial_stat" &gt;結婚状況&lt; / ラベル&gt;

&lt; select id = "martial_stat" name = "martial_stat" <コードクラス="plain">&gt;

&lt; オプション = "0" &gt;離婚&lt; / オプション&gt;

&lt; オプション = "1" &gt;既婚&lt; / オプション&gt;

&lt; オプション = "2" &gt;結婚していない&lt; / オプション&gt;

&lt; / select &gt;

&lt; br &gt;

コードクラス="plain">&gt;離婚&lt; / オプション&gt;

&lt; オプション = 「1」

Shop

Learn programming in R: courses

$

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Latest questions

NUMPYNUMPY

psycopg2: insert multiple rows with one query

12 answers

NUMPYNUMPY

How to convert Nonetype to int or string?

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Javascript Error: IPython is not defined in JupyterLab

12 answers


Wiki

Python OpenCV | cv2.putText () method

numpy.arctan2 () in Python

Python | os.path.realpath () method

Python OpenCV | cv2.circle () method

Python OpenCV cv2.cvtColor () method

Python - Move item to the end of the list

time.perf_counter () function in Python

Check if one list is a subset of another in Python

Python os.path.join () method