From 640cbb34cd47356292678f1f35e1a640c29d9620 Mon Sep 17 00:00:00 2001 From: Paskal Date: Sat, 13 Sep 2025 19:13:28 +0545 Subject: [PATCH] change --- .../1-Introduction/notebook.ipynb | 2 +- 4-Classification/4-Applied/model.onnx | Bin 0 -> 2141514 bytes 4-Classification/4-Applied/notebook.ipynb | 1094 ++++++++++++++++- 3 files changed, 1083 insertions(+), 13 deletions(-) create mode 100644 4-Classification/4-Applied/model.onnx diff --git a/4-Classification/1-Introduction/notebook.ipynb b/4-Classification/1-Introduction/notebook.ipynb index f85e06e6..fd862c35 100644 --- a/4-Classification/1-Introduction/notebook.ipynb +++ b/4-Classification/1-Introduction/notebook.ipynb @@ -747,7 +747,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.13.3" }, "orig_nbformat": 2 }, diff --git a/4-Classification/4-Applied/model.onnx b/4-Classification/4-Applied/model.onnx new file mode 100644 index 0000000000000000000000000000000000000000..4b27b87f2b99316c81ea534f237af5ba9e7d7bf4 GIT binary patch literal 2141514 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 literal 0 HcmV?d00001 diff --git a/4-Classification/4-Applied/notebook.ipynb b/4-Classification/4-Applied/notebook.ipynb index a1f5a65c..f339d469 100644 --- a/4-Classification/4-Applied/notebook.ipynb +++ b/4-Classification/4-Applied/notebook.ipynb @@ -1,5 +1,1084 @@ { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Build a cuisine recommender" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "[notice] A new release of pip is available: 25.0.1 -> 25.2\n", + "[notice] To update, run: python.exe -m pip install --upgrade pip\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: skl2onnx in d:\\ai\\machinelearning\\ml-for-beginners\\.venv\\lib\\site-packages (1.19.1)\n", + "Requirement already satisfied: onnx>=1.2.1 in d:\\ai\\machinelearning\\ml-for-beginners\\.venv\\lib\\site-packages (from skl2onnx) (1.19.0)\n", + "Requirement already satisfied: scikit-learn>=1.1 in d:\\ai\\machinelearning\\ml-for-beginners\\.venv\\lib\\site-packages (from skl2onnx) (1.6.1)\n", + "Requirement already satisfied: numpy>=1.22 in d:\\ai\\machinelearning\\ml-for-beginners\\.venv\\lib\\site-packages (from onnx>=1.2.1->skl2onnx) (2.2.6)\n", + "Requirement already satisfied: protobuf>=4.25.1 in d:\\ai\\machinelearning\\ml-for-beginners\\.venv\\lib\\site-packages (from onnx>=1.2.1->skl2onnx) (6.32.1)\n", + "Requirement already satisfied: typing_extensions>=4.7.1 in d:\\ai\\machinelearning\\ml-for-beginners\\.venv\\lib\\site-packages (from onnx>=1.2.1->skl2onnx) (4.14.0)\n", + "Requirement already satisfied: ml_dtypes in d:\\ai\\machinelearning\\ml-for-beginners\\.venv\\lib\\site-packages (from onnx>=1.2.1->skl2onnx) (0.5.3)\n", + "Requirement already satisfied: scipy>=1.6.0 in d:\\ai\\machinelearning\\ml-for-beginners\\.venv\\lib\\site-packages (from scikit-learn>=1.1->skl2onnx) (1.15.3)\n", + "Requirement already satisfied: joblib>=1.2.0 in d:\\ai\\machinelearning\\ml-for-beginners\\.venv\\lib\\site-packages (from scikit-learn>=1.1->skl2onnx) (1.5.1)\n", + "Requirement already satisfied: threadpoolctl>=3.1.0 in d:\\ai\\machinelearning\\ml-for-beginners\\.venv\\lib\\site-packages (from scikit-learn>=1.1->skl2onnx) (3.6.0)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install skl2onnx\n", + "import pandas as pd " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "
" + ], + "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]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = pd.read_csv('../data/cleaned_cuisines.csv')\n", + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Check the column names in the dataset\n", + "print(\"Column names:\")\n", + "print(data.columns.tolist())\n", + "print(\"\\nFirst few rows:\")\n", + "data.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "
" + ], + "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]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X = data.iloc[:, 2:]\n", + "X.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "
" + ], + "text/plain": [ + " cuisine\n", + "0 indian\n", + "1 indian\n", + "2 indian\n", + "3 indian\n", + "4 indian" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y = data[['cuisine']] \n", + "y.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "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": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
SVC(C=10, kernel='linear', probability=True, random_state=0)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "SVC(C=10, kernel='linear', probability=True, random_state=0)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)\n", + "model = SVC(kernel='linear', C=10, probability=True, random_state=0)\n", + "model.fit(X_train, y_train.values.ravel())" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "y_pred = model.predict(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " chinese 0.73 0.74 0.74 244\n", + " indian 0.87 0.87 0.87 240\n", + " japanese 0.76 0.75 0.75 241\n", + " korean 0.84 0.78 0.81 235\n", + " thai 0.77 0.84 0.80 239\n", + "\n", + " accuracy 0.79 1199\n", + " macro avg 0.80 0.80 0.80 1199\n", + "weighted avg 0.80 0.79 0.79 1199\n", + "\n" + ] + } + ], + "source": [ + "print(classification_report(y_test, y_pred))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "from skl2onnx import convert_sklearn\n", + "from skl2onnx.common.data_types import FloatTensorType\n", + "\n", + "initial_type = [('float_input', FloatTensorType([None, 380]))]\n", + "options = {id(model): {'nocl': True, 'zipmap': False}}" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "onx = convert_sklearn(model, initial_types=initial_type, options= options)\n", + "with open(\"./model.onnx\", \"wb\") as f:\n", + " f.write(onx.SerializeToString())" + ] + } + ], "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, "language_info": { "codemirror_mode": { "name": "ipython", @@ -10,19 +1089,10 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": 3 + "version": "3.13.3" }, "orig_nbformat": 4 }, "nbformat": 4, - "nbformat_minor": 2, - "cells": [ - { - "source": [ - "# Build a cuisine recommender" - ], - "cell_type": "markdown", - "metadata": {} - } - ] -} \ No newline at end of file + "nbformat_minor": 2 +}