From 2fa3bf0a179c40bd3b319f4b8b3aa7841f26ec32 Mon Sep 17 00:00:00 2001 From: Jen Looper Date: Tue, 15 Jun 2021 09:43:26 -0400 Subject: [PATCH] testing applied lesson --- .../4-Applied/solution/index.html | 64 ++-- .../4-Applied/solution/model.onnx | Bin 0 -> 2204825 bytes .../4-Applied/solution/notebook.ipynb | 273 +++++++++++++++- .../4-Applied/solution/recipe-detector.ipynb | 305 ------------------ 4 files changed, 297 insertions(+), 345 deletions(-) create mode 100644 4-Classification/4-Applied/solution/model.onnx delete mode 100644 4-Classification/4-Applied/solution/recipe-detector.ipynb diff --git a/4-Classification/4-Applied/solution/index.html b/4-Classification/4-Applied/solution/index.html index 56992014e..99d200246 100644 --- a/4-Classification/4-Applied/solution/index.html +++ b/4-Classification/4-Applied/solution/index.html @@ -1,28 +1,36 @@ - - - - - - - - - - - - \ No newline at end of file + + +
+ ONNX Runtime JavaScript examples: Quick Start - Web (using script tag) +
+ + + + + + + diff --git a/4-Classification/4-Applied/solution/model.onnx b/4-Classification/4-Applied/solution/model.onnx new file mode 100644 index 0000000000000000000000000000000000000000..591e0c2ba839ecb969887763513fc924550e9ed8 GIT binary patch literal 2204825 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.15 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.19.2)\n", + "Requirement already satisfied: onnxconverter-common<1.9,>=1.6.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.8.1)\n", + "Requirement already satisfied: protobuf in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (3.8.0)\n", + "Requirement already satisfied: scikit-learn>=0.19 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (0.24.2)\n", + "Requirement already satisfied: scipy>=1.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.4.1)\n", + "Requirement already satisfied: six in /Users/jenlooper/Library/Python/3.7/lib/python/site-packages (from skl2onnx) (1.12.0)\n", + "Requirement already satisfied: onnx>=1.2.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.9.0)\n", + "Requirement already satisfied: setuptools in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from protobuf->skl2onnx) (45.1.0)\n", + "Requirement already satisfied: joblib>=0.11 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from scikit-learn>=0.19->skl2onnx) (0.16.0)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from scikit-learn>=0.19->skl2onnx) (2.1.0)\n", + "Requirement already satisfied: typing-extensions>=3.6.2.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from onnx>=1.2.1->skl2onnx) (3.10.0.0)\n", + "\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1.2 is available.\n", + "You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], "source": [ - "## Build a web app" + "pip install skl2onnx" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Requirement already satisfied: onnxruntime in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (1.8.0)\n", + "Requirement already satisfied: flatbuffers in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from onnxruntime) (2.0)\n", + "Requirement already satisfied: protobuf in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from onnxruntime) (3.8.0)\n", + "Requirement already satisfied: numpy>=1.16.6 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from onnxruntime) (1.19.2)\n", + "Requirement already satisfied: six>=1.9 in /Users/jenlooper/Library/Python/3.7/lib/python/site-packages (from protobuf->onnxruntime) (1.12.0)\n", + "Requirement already satisfied: setuptools in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from protobuf->onnxruntime) (45.1.0)\n", + "\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1.2 is available.\n", + "You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } ], - "cell_type": "markdown", - "metadata": {} + "source": [ + "pip install onnxruntime" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ - "pip install skl2onnx" + "import numpy as np \n", + "import pandas as pd \n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n", + "0 0 indian 0 0 0 0 0 \n", + "1 1 indian 1 0 0 0 0 \n", + "2 2 indian 0 0 0 0 0 \n", + "3 3 indian 0 0 0 0 0 \n", + "4 4 indian 0 0 0 0 0 \n", + "\n", + " apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n", + "0 0 0 0 ... 0 0 0 \n", + "1 0 0 0 ... 0 0 0 \n", + "2 0 0 0 ... 0 0 0 \n", + "3 0 0 0 ... 0 0 0 \n", + "4 0 0 0 ... 0 0 0 \n", + "\n", + " whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n", + "0 0 0 0 0 0 0 0 \n", + "1 0 0 0 0 0 0 0 \n", + "2 0 0 0 0 0 0 0 \n", + "3 0 0 0 0 0 0 0 \n", + "4 0 0 0 0 0 1 0 \n", + "\n", + "[5 rows x 382 columns]" + ], + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Unnamed: 0cuisinealmondangelicaaniseanise_seedappleapple_brandyapricotarmagnac...whiskeywhite_breadwhite_winewhole_grain_wheat_flourwinewoodyamyeastyogurtzucchini
00indian00000000...0000000000
11indian10000000...0000000000
22indian00000000...0000000000
33indian00000000...0000000000
44indian00000000...0000000010
\n

5 rows × 382 columns

\n
" + }, + "metadata": {}, + "execution_count": 28 + } + ], + "source": [ + "data = pd.read_csv('../../data/cleaned_cuisine.csv')\n", + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " almond angelica anise anise_seed apple apple_brandy apricot \\\n", + "0 0 0 0 0 0 0 0 \n", + "1 1 0 0 0 0 0 0 \n", + "2 0 0 0 0 0 0 0 \n", + "3 0 0 0 0 0 0 0 \n", + "4 0 0 0 0 0 0 0 \n", + "\n", + " armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n", + "0 0 0 0 ... 0 0 0 \n", + "1 0 0 0 ... 0 0 0 \n", + "2 0 0 0 ... 0 0 0 \n", + "3 0 0 0 ... 0 0 0 \n", + "4 0 0 0 ... 0 0 0 \n", + "\n", + " whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n", + "0 0 0 0 0 0 0 0 \n", + "1 0 0 0 0 0 0 0 \n", + "2 0 0 0 0 0 0 0 \n", + "3 0 0 0 0 0 0 0 \n", + "4 0 0 0 0 0 1 0 \n", + "\n", + "[5 rows x 380 columns]" + ], + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
almondangelicaaniseanise_seedappleapple_brandyapricotarmagnacartemisiaartichoke...whiskeywhite_breadwhite_winewhole_grain_wheat_flourwinewoodyamyeastyogurtzucchini
00000000000...0000000000
11000000000...0000000000
20000000000...0000000000
30000000000...0000000000
40000000000...0000000010
\n

5 rows × 380 columns

\n
" + }, + "metadata": {}, + "execution_count": 29 + } + ], + "source": [ + "X = data.iloc[:,2:]\n", + "X.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " cuisine\n", + "0 indian\n", + "1 indian\n", + "2 indian\n", + "3 indian\n", + "4 indian" + ], + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
cuisine
0indian
1indian
2indian
3indian
4indian
\n
" + }, + "metadata": {}, + "execution_count": 30 + } + ], + "source": [ + "y = data[['cuisine']]\n", + "y.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ - "pip install onnxruntime" + "from sklearn.model_selection import train_test_split\n", + "from sklearn.svm import SVC\n", + "from sklearn.model_selection import cross_val_score\n", + "from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ - "import numpy as np \n", - "import pandas as pd " + "X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "SVC(C=10, kernel='linear', probability=True, random_state=0)" + ] + }, + "metadata": {}, + "execution_count": 33 + } + ], + "source": [ + "model = SVC(kernel='linear', C=10, probability=True,random_state=0)\n", + "model.fit(X_train,y_train.values.ravel())\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "y_pred = model.predict(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n\n chinese 0.67 0.68 0.67 243\n indian 0.90 0.87 0.89 238\n japanese 0.75 0.73 0.74 251\n korean 0.84 0.74 0.79 242\n thai 0.74 0.86 0.80 225\n\n accuracy 0.77 1199\n macro avg 0.78 0.78 0.78 1199\nweighted avg 0.78 0.77 0.78 1199\n\n" + ] + } + ], + "source": [ + "print(classification_report(y_test,y_pred))" ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "from skl2onnx import convert_sklearn\n", + "from skl2onnx.common.data_types import FloatTensorType\n", + "\n", + "initial_type = [('float_input', FloatTensorType([None, 10]))]\n", + "options = {id(model): {'nocl': True, 'zipmap': False}}\n", + "onx = convert_sklearn(model, initial_types=initial_type,options=options)\n", + "with open(\"./model2.onnx\", \"wb\") as f:\n", + " f.write(onx.SerializeToString())\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ] } \ No newline at end of file diff --git a/4-Classification/4-Applied/solution/recipe-detector.ipynb b/4-Classification/4-Applied/solution/recipe-detector.ipynb deleted file mode 100644 index 6d466b60e..000000000 --- a/4-Classification/4-Applied/solution/recipe-detector.ipynb +++ /dev/null @@ -1,305 +0,0 @@ -{ - "metadata": { - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.0" - }, - "orig_nbformat": 2, - "kernelspec": { - "name": "python3", - "display_name": "Python 3.7.0 64-bit ('3.7')" - }, - "metadata": { - "interpreter": { - "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d" - } - }, - "interpreter": { - "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d" - } - }, - "nbformat": 4, - "nbformat_minor": 2, - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Requirement already satisfied: skl2onnx in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (1.8.0)\n", - "Requirement already satisfied: scikit-learn>=0.19 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (0.24.2)\n", - "Requirement already satisfied: scipy>=1.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.4.1)\n", - "Requirement already satisfied: six in /Users/jenlooper/Library/Python/3.7/lib/python/site-packages (from skl2onnx) (1.12.0)\n", - "Requirement already satisfied: onnx>=1.2.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.9.0)\n", - "Requirement already satisfied: onnxconverter-common<1.9,>=1.6.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.8.1)\n", - "Requirement already satisfied: protobuf in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (3.8.0)\n", - "Requirement already satisfied: numpy>=1.15 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.19.2)\n", - "Requirement already satisfied: joblib>=0.11 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from scikit-learn>=0.19->skl2onnx) (0.16.0)\n", - "Requirement already satisfied: threadpoolctl>=2.0.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from scikit-learn>=0.19->skl2onnx) (2.1.0)\n", - "Requirement already satisfied: typing-extensions>=3.6.2.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from onnx>=1.2.1->skl2onnx) (3.10.0.0)\n", - "Requirement already satisfied: setuptools in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from protobuf->skl2onnx) (45.1.0)\n", - "\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1.2 is available.\n", - "You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "pip install skl2onnx" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Requirement already satisfied: onnxruntime in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (1.8.0)\n", - "Requirement already satisfied: protobuf in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from onnxruntime) (3.8.0)\n", - "Requirement already satisfied: flatbuffers in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from onnxruntime) (2.0)\n", - "Requirement already satisfied: numpy>=1.16.6 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from onnxruntime) (1.19.2)\n", - "Requirement already satisfied: six>=1.9 in /Users/jenlooper/Library/Python/3.7/lib/python/site-packages (from protobuf->onnxruntime) (1.12.0)\n", - "Requirement already satisfied: setuptools in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from protobuf->onnxruntime) (45.1.0)\n", - "\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1.2 is available.\n", - "You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "pip install onnxruntime" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np \n", - "import pandas as pd \n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n", - "0 0 indian 0 0 0 0 0 \n", - "1 1 indian 1 0 0 0 0 \n", - "2 2 indian 0 0 0 0 0 \n", - "3 3 indian 0 0 0 0 0 \n", - "4 4 indian 0 0 0 0 0 \n", - "\n", - " apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n", - "0 0 0 0 ... 0 0 0 \n", - "1 0 0 0 ... 0 0 0 \n", - "2 0 0 0 ... 0 0 0 \n", - "3 0 0 0 ... 0 0 0 \n", - "4 0 0 0 ... 0 0 0 \n", - "\n", - " whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n", - "0 0 0 0 0 0 0 0 \n", - "1 0 0 0 0 0 0 0 \n", - "2 0 0 0 0 0 0 0 \n", - "3 0 0 0 0 0 0 0 \n", - "4 0 0 0 0 0 1 0 \n", - "\n", - "[5 rows x 382 columns]" - ], - "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Unnamed: 0cuisinealmondangelicaaniseanise_seedappleapple_brandyapricotarmagnac...whiskeywhite_breadwhite_winewhole_grain_wheat_flourwinewoodyamyeastyogurtzucchini
00indian00000000...0000000000
11indian10000000...0000000000
22indian00000000...0000000000
33indian00000000...0000000000
44indian00000000...0000000010
\n

5 rows × 382 columns

\n
" - }, - "metadata": {}, - "execution_count": 4 - } - ], - "source": [ - "data = pd.read_csv('../../data/cleaned_cuisine.csv')\n", - "data.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " almond angelica anise anise_seed apple apple_brandy apricot \\\n", - "0 0 0 0 0 0 0 0 \n", - "1 1 0 0 0 0 0 0 \n", - "2 0 0 0 0 0 0 0 \n", - "3 0 0 0 0 0 0 0 \n", - "4 0 0 0 0 0 0 0 \n", - "\n", - " armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n", - "0 0 0 0 ... 0 0 0 \n", - "1 0 0 0 ... 0 0 0 \n", - "2 0 0 0 ... 0 0 0 \n", - "3 0 0 0 ... 0 0 0 \n", - "4 0 0 0 ... 0 0 0 \n", - "\n", - " whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n", - "0 0 0 0 0 0 0 0 \n", - "1 0 0 0 0 0 0 0 \n", - "2 0 0 0 0 0 0 0 \n", - "3 0 0 0 0 0 0 0 \n", - "4 0 0 0 0 0 1 0 \n", - "\n", - "[5 rows x 380 columns]" - ], - "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
almondangelicaaniseanise_seedappleapple_brandyapricotarmagnacartemisiaartichoke...whiskeywhite_breadwhite_winewhole_grain_wheat_flourwinewoodyamyeastyogurtzucchini
00000000000...0000000000
11000000000...0000000000
20000000000...0000000000
30000000000...0000000000
40000000000...0000000010
\n

5 rows × 380 columns

\n
" - }, - "metadata": {}, - "execution_count": 5 - } - ], - "source": [ - "X = data.iloc[:,2:]\n", - "X.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " cuisine\n", - "0 indian\n", - "1 indian\n", - "2 indian\n", - "3 indian\n", - "4 indian" - ], - "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
cuisine
0indian
1indian
2indian
3indian
4indian
\n
" - }, - "metadata": {}, - "execution_count": 6 - } - ], - "source": [ - "y = data[['cuisine']]\n", - "y.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.model_selection import train_test_split\n", - "from sklearn.svm import SVC\n", - "from sklearn.model_selection import cross_val_score\n", - "from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "SVC(C=10, kernel='linear', probability=True, random_state=0)" - ] - }, - "metadata": {}, - "execution_count": 9 - } - ], - "source": [ - "model = SVC(kernel='linear', C=10, probability=True,random_state=0)\n", - "model.fit(X_train,y_train.values.ravel())\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "y_pred = model.predict(X_test)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - " precision recall f1-score support\n\n chinese 0.68 0.69 0.68 249\n indian 0.92 0.88 0.90 238\n japanese 0.77 0.68 0.72 236\n korean 0.84 0.79 0.82 247\n thai 0.73 0.88 0.80 229\n\n accuracy 0.78 1199\n macro avg 0.79 0.79 0.78 1199\nweighted avg 0.79 0.78 0.78 1199\n\n" - ] - } - ], - "source": [ - "print(classification_report(y_test,y_pred))" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "from skl2onnx import convert_sklearn\n", - "from skl2onnx.common.data_types import FloatTensorType\n", - "\n", - "initial_type = [('float_input', FloatTensorType([None, 4]))]\n", - "options = {id(model): {'nocl': True, 'zipmap': False}}\n", - "onx = convert_sklearn(model, initial_types=initial_type,options=options)\n", - "with open(\"./model.onnx\", \"wb\") as f:\n", - " f.write(onx.SerializeToString())\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ] -} \ No newline at end of file