From 7609666fb2e52a1528832b3188ecb9d035f081ad Mon Sep 17 00:00:00 2001 From: Jen Looper Date: Mon, 7 Jun 2021 18:11:05 -0400 Subject: [PATCH] classification 1 --- 1-Introduction/1-intro-to-ML/README.md | 2 + 4-Classification/1-Introduction/README.md | 195 ++- .../1-Introduction/images/cuisine-dist.png | Bin 0 -> 4869 bytes .../1-Introduction/images/indian.png | Bin 0 -> 8174 bytes .../1-Introduction/images/japanese.png | Bin 0 -> 7755 bytes .../1-Introduction/images/korean.png | Bin 0 -> 9108 bytes .../1-Introduction/images/thai.png | Bin 0 -> 7844 bytes .../1-Introduction/notebook.ipynb | 28 + .../solution/data-prep-visual.ipynb | 1521 ----------------- .../solution/intro-classification.ipynb | 563 ------ .../1-Introduction/solution/notebook.ipynb | 164 +- .../README.md | 0 .../assignment.md | 0 .../notebook.ipynb} | 0 .../2-Classifiers-1/solution/notebook.ipynb | 336 ++++ .../translations/README.es.md | 0 .../README.md | 0 .../assignment.md | 0 .../3-Classifiers-2/notebook.ipynb | 0 .../3-Classifiers-2/solution/notebook.ipynb | 0 .../3-Classifiers-2/translations/README.es.md | 0 4-Classification/4-Applied/notebook.ipynb | 0 .../4-Applied/solution/notebook.ipynb | 0 4-Classification/README.md | 9 +- 24 files changed, 653 insertions(+), 2165 deletions(-) create mode 100644 4-Classification/1-Introduction/images/cuisine-dist.png create mode 100644 4-Classification/1-Introduction/images/indian.png create mode 100644 4-Classification/1-Introduction/images/japanese.png create mode 100644 4-Classification/1-Introduction/images/korean.png create mode 100644 4-Classification/1-Introduction/images/thai.png delete mode 100644 4-Classification/1-Introduction/solution/data-prep-visual.ipynb delete mode 100644 4-Classification/1-Introduction/solution/intro-classification.ipynb rename 4-Classification/{2-Discriminative => 2-Classifiers-1}/README.md (100%) rename 4-Classification/{2-Discriminative => 2-Classifiers-1}/assignment.md (100%) rename 4-Classification/{2-Discriminative/translations/README.es.md => 2-Classifiers-1/notebook.ipynb} (100%) create mode 100644 4-Classification/2-Classifiers-1/solution/notebook.ipynb rename 4-Classification/{3-Generative => 2-Classifiers-1}/translations/README.es.md (100%) rename 4-Classification/{3-Generative => 3-Classifiers-2}/README.md (100%) rename 4-Classification/{3-Generative => 3-Classifiers-2}/assignment.md (100%) create mode 100644 4-Classification/3-Classifiers-2/notebook.ipynb create mode 100644 4-Classification/3-Classifiers-2/solution/notebook.ipynb create mode 100644 4-Classification/3-Classifiers-2/translations/README.es.md create mode 100644 4-Classification/4-Applied/notebook.ipynb create mode 100644 4-Classification/4-Applied/solution/notebook.ipynb diff --git a/1-Introduction/1-intro-to-ML/README.md b/1-Introduction/1-intro-to-ML/README.md index 8e431fdbb..1d7a03697 100644 --- a/1-Introduction/1-intro-to-ML/README.md +++ b/1-Introduction/1-intro-to-ML/README.md @@ -2,6 +2,8 @@ [![ML, AI, Deep Learning - What's the difference?](https://img.youtube.com/vi/lTd9RSxS9ZE/0.jpg)](https://youtu.be/lTd9RSxS9ZE "ML, AI, Deep Learning - What's the difference?") +python path: https://docs.microsoft.com/en-us/learn/paths/python-language/ + > ๐ŸŽฅ Click the image above for a video discussing the difference between Machine Learning, AI, and Deep Learning. ## [Pre-lecture quiz](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/1/) ### Introduction diff --git a/4-Classification/1-Introduction/README.md b/4-Classification/1-Introduction/README.md index bc0c7aa4a..446fecef4 100644 --- a/4-Classification/1-Introduction/README.md +++ b/4-Classification/1-Introduction/README.md @@ -1,32 +1,205 @@ # Introduction to Classification -In these four lessons, you will discover the 'meat and potatoes' of classic machine learning - Classification. No pun intended - we will walk through using various classification algorithms with a dataset all about the brilliant cuisines of Asia. Hope you're hungry! +In these four lessons, you will discover the 'meat and potatoes' of classic machine learning - Classification. No pun intended - we will walk through using various classification algorithms with a dataset all about the brilliant cuisines of Asia and India. Hope you're hungry! Classification is a form of [supervised learning](https://wikipedia.org/wiki/Supervised_learning) that bears a lot in common with Regression techniques. If machine learning is all about assigning names to things via datasets, then classification generally falls into two groups: binary classification and multiclass classfication. -Remember, Linear Regression helped you predict relationships between variables and make accurate predictions on where a new datapoint would fall in relationship to that line. So, you could predict what price a pumpkin would be in September vs. December, for example. Logistic Regression helped you discover binary categories: at this price point, is this pumpkin orange or not-orange? - -Classification uses various algorithms to determine other ways of determining a data point's label or class. Let's work with this recipe data to see whether, by observing a group of ingredients, we can determine its cuisine of origin. - [![Introduction to Classification](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "Introduction to Classification") > ๐ŸŽฅ Click the image above for a video: MIT's John Guttag introduces Classification +Remember, Linear Regression helped you predict relationships between variables and make accurate predictions on where a new datapoint would fall in relationship to that line. So, you could predict what price a pumpkin would be in September vs. December, for example. Logistic Regression helped you discover binary categories: at this price point, is this pumpkin orange or not-orange? + +Classification uses various algorithms to determine other ways of determining a data point's label or class. Let's work with this recipe data to see whether, by observing a group of ingredients, we can determine its cuisine of origin. ## [Pre-lecture quiz](link-to-quiz-app) ### Introduction -Before working to clean the data and prepare it for analysis, it's useful to understand several of the algorithms that you will use. +Classification is one of the fundamental activities of the machine learning researcher and data scientist. From basic classification of a binary value ("is this email spam or not?") to complex image classification and segmentation using computer vision, it's always useful to be able to sort data into classes and ask questions of it. Or, to state the process in a more scientific way, your classification method creates a predictive model that enables you to map the relationship between input variables to output variables. + +Before starting the process of cleaning our data, visualizing it, and prepping it for our ML tasks, let's learn a bit about the various ways machine learning can be leveraged to classify data. + +Derived from [statistics](https://wikipedia.org/wiki/Statistical_classification), classification using classic machine learning uses features, such as 'smoker','weight', and 'age' to determine 'likelihood of developing X disease'. As a supervised learning technique similar to the Regression exercises you performed earlier, your data is labeled and the ML algorithms use those labels to classify and predict classes (or 'features') of a dataset and assign them to a group or outcome. + +โœ… Take a moment to imagine a dataset about recipes. What would a multiclass model be able to answer? What would a binary model be able to answer? What if you wanted to determine whether a given cuisine was likely to contain Fenugreek? What if you wanted to see if, given a present of a grocery bag full of star anise, artichokes, cauliflower, and horseradish, you could create a typical Indian dish? + +## Hello 'classifier' + +The question we want to ask of this recipe dataset is actually a **multiclass question**, as we have several potential national cuisines to work with. Given a batch of ingredients, which of these many classes will the data fit? + +Scikit-Learn offers several different algorithms to use to classify data, depending on the kind of problem you want to solve. In the next two lessons, you'll learn about several of these algorithms. + +## Clean and Balance Your Data + +The first task at hand before starting this project is to clean and **balance** your data to get better results. Start with the blank `notebook.ipynb` file ini the root of this folder. + +The first think to install is [imblearn](https://imbalanced-learn.org/stable/). This is a Scikit-Learn package that will allow you to better balance the data (you will learn more about this task in a minute). + +```python +pip install imblearn +``` + +Then, import the packages you need to import your data and visualize it. Import SMOTE from imblearn. + +```python +import pandas as pd +import matplotlib.pyplot as plt +import matplotlib as mpl +import numpy as np +from imblearn.over_sampling import SMOTE +``` +The next task will be to import the data: + +```python +df = pd.read_csv('../data/recipes.csv') +``` + +Check the data's shape: + +```python +df.head() +``` -- Support-vector machines -- Naive Bayes -- Decision trees -- K-nearest neighbor algorithm +The first five rows look like this: +| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | +| 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | -โœ… Knowledge Check - use this moment to stretch students' knowledge with open questions +Get info about this data: +```python +df.info() +``` +``` + +RangeIndex: 2448 entries, 0 to 2447 +Columns: 385 entries, Unnamed: 0 to zucchini +dtypes: int64(384), object(1) +memory usage: 7.2+ MB +``` +## Learning about cuisines + +Now the work starts to become more interesting. Let's discover the distribution of data, per cuisine: + +```python +df.cuisine.value_counts().plot.barh() +``` + +![cuisine data distribution](images/cuisine-dist.png) + +There are a finite number of cuisines, but the distribution of data is uneven. You can fix that! Before doing so, explore a little more. How much data exactly is available per cuisine? + +```python +thai_df = df[(df.cuisine == "thai")] +japanese_df = df[(df.cuisine == "japanese")] +chinese_df = df[(df.cuisine == "chinese")] +indian_df = df[(df.cuisine == "indian")] +korean_df = df[(df.cuisine == "korean")] + +print(f'thai df: {thai_df.shape}') +print(f'japanese df: {japanese_df.shape}') +print(f'chinese df: {chinese_df.shape}') +print(f'indian df: {indian_df.shape}') +print(f'korean df: {korean_df.shape}') +``` +thai df: (289, 385) +japanese df: (320, 385) +chinese df: (442, 385) +indian df: (598, 385) +korean df: (799, 385) + +## Discovering ingredients + +Now you can dig deeper into the data and learn what are the typical ingredients per cuisine. You should clean out recurrent data that creates confusion between cuisines, so let's learn about this problem. + +Create a function in Python to create an ingredient dataframe. This function will start by dropping an unhelpful column and sort through ingredients by their count: + +```python +def create_ingredient_df(df): + ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value') + ingredient_df = ingredient_df[(ingredient_df.T != 0).any()] + ingredient_df = ingredient_df.sort_values(by='value', ascending=False + inplace=False) + return ingredient_df +``` +Now you can use that function to get an idea of top ten most popular ingredients by cuisine: + +```python +thai_ingredient_df = create_ingredient_df(thai_df) +thai_ingredient_df.head(10).plot.barh() +``` +![thai](images/thai.png) + +```python +japanese_ingredient_df = create_ingredient_df(japanese_df) +japanese_ingredient_df.head(10).plot.barh() +``` +![japanese](images/japanese.png) + +```python +chinese_ingredient_df = create_ingredient_df(chinese_df) +chinese_ingredient_df.head(10).plot.barh() +``` +![chinese](images/chinese.png) + +```python +indian_ingredient_df = create_ingredient_df(indian_df) +indian_ingredient_df.head(10).plot.barh() +``` +![indian](images/indian.png) + +```python +korean_ingredient_df = create_ingredient_df(korean_df) +korean_ingredient_df.head(10).plot.barh() +``` +![korean](images/korean.png) + +Now, drop the most common ingredients that create confusion between distinct cuisines. Everyone loves rice, garlic and ginger! + +```python +feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) +labels_df = df.cuisine #.unique() +feature_df.head() +``` +## Balance the dataset + +Now that you have cleaned the data, use [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "Synthetic Minority Over-sampling Technique" - to balance it. This strategy generates new samples by interpolation. + +```python +oversample = SMOTE() +transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df) +``` +By balancing your data, you'll have better results when classifying it. Now you can check the numbers of labels per ingredient: + +```python +print(f'new label count: {transformed_label_df.value_counts()}') +print(f'old label count: {df.cuisine.value_counts()}') +``` +new label count: korean 799 +chinese 799 +indian 799 +japanese 799 +thai 799 +Name: cuisine, dtype: int64 +old label count: korean 799 +indian 598 +chinese 442 +japanese 320 +thai 289 +Name: cuisine, dtype: int64 + +The data is nice and clean, balanced, and very delicious! You can take one more look at the data using `transformed_df.head()` and `transformed_df.info()`. Save a copy of this data for use in future lessons: + +```python +transformed_df.to_csv("../../data/cleaned_cuisine.csv") +``` +This fresh CSV can now be found in the root data folder. ## ๐Ÿš€Challenge ## [Post-lecture quiz](link-to-quiz-app) diff --git a/4-Classification/1-Introduction/images/cuisine-dist.png b/4-Classification/1-Introduction/images/cuisine-dist.png new file mode 100644 index 0000000000000000000000000000000000000000..41ed93add1cdae27bb0ac9e0eab769eb8034a122 GIT binary patch literal 4869 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 bZ`dh2kje3G8AS0fD*$phVqfuv|6l$NCM`tr literal 0 HcmV?d00001 diff --git a/4-Classification/1-Introduction/images/indian.png b/4-Classification/1-Introduction/images/indian.png new file mode 100644 index 0000000000000000000000000000000000000000..bd3f8b7da69b8104820de78ce12cbefabb911aac GIT binary patch literal 8174 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 F`aiFVs7e3; literal 0 HcmV?d00001 diff --git a/4-Classification/1-Introduction/images/korean.png b/4-Classification/1-Introduction/images/korean.png new file mode 100644 index 0000000000000000000000000000000000000000..18d77efd3ff1943572961c0a8d0fc852ee586b35 GIT binary patch literal 9108 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 SrtNKJ2w-s(Q*s!4@xK5LmgwpL literal 0 HcmV?d00001 diff --git a/4-Classification/1-Introduction/notebook.ipynb b/4-Classification/1-Introduction/notebook.ipynb index e69de29bb..8fe41283d 100644 --- a/4-Classification/1-Introduction/notebook.ipynb +++ b/4-Classification/1-Introduction/notebook.ipynb @@ -0,0 +1,28 @@ +{ + "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 + }, + "orig_nbformat": 2 + }, + "nbformat": 4, + "nbformat_minor": 2, + "cells": [ + { + "source": [ + "# Delicious Asian Recipes " + ], + "cell_type": "markdown", + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/4-Classification/1-Introduction/solution/data-prep-visual.ipynb b/4-Classification/1-Introduction/solution/data-prep-visual.ipynb deleted file mode 100644 index a62ec2542..000000000 --- a/4-Classification/1-Introduction/solution/data-prep-visual.ipynb +++ /dev/null @@ -1,1521 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "\r\n", - "import pandas as pd\r\n", - "import matplotlib.pyplot as plt\r\n", - "import matplotlib as mpl\r\n", - "import numpy as np\r\n", - "from imblearn.over_sampling import SMOTE" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.read_csv('.data/asian_indian_recipes.csv')" - ] - }, - { - "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
065indian00000000...0000000000
166indian10000000...0000000000
267indian00000000...0000000000
368indian00000000...0000000000
469indian00000000...0000000010
\n", - "

5 rows ร— 385 columns

\n", - "
" - ], - "text/plain": [ - " Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n", - "0 65 indian 0 0 0 0 0 \n", - "1 66 indian 1 0 0 0 0 \n", - "2 67 indian 0 0 0 0 0 \n", - "3 68 indian 0 0 0 0 0 \n", - "4 69 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 385 columns]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 2448 entries, 0 to 2447\n", - "Columns: 385 entries, Unnamed: 0 to zucchini\n", - "dtypes: int64(384), object(1)\n", - "memory usage: 7.2+ MB\n" - ] - } - ], - "source": [ - "df.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "korean 799\n", - "indian 598\n", - "chinese 442\n", - "japanese 320\n", - "thai 289\n", - "Name: cuisine, dtype: int64" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.cuisine.value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "#df.keys().values" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "#display classes in bar graph\r\n", - "df.cuisine.value_counts().plot.barh()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "thai df: (289, 385)\n", - "japanese df: (320, 385)\n", - "chinese df: (442, 385)\n", - "indian df: (598, 385)\n", - "korean df: (799, 385)\n" - ] - } - ], - "source": [ - "# ingrediant counts by class count\r\n", - "# filter to thai food, display ingredients graph\r\n", - "\r\n", - "thai_df = df[(df.cuisine == \"thai\")]\r\n", - "japanese_df = df[(df.cuisine == \"japanese\")]\r\n", - "chinese_df = df[(df.cuisine == \"chinese\")]\r\n", - "indian_df = df[(df.cuisine == \"indian\")]\r\n", - "korean_df = df[(df.cuisine == \"korean\")]\r\n", - "\r\n", - "print(f'thai df: {thai_df.shape}')\r\n", - "print(f'japanese df: {japanese_df.shape}')\r\n", - "print(f'chinese df: {chinese_df.shape}')\r\n", - "print(f'indian df: {indian_df.shape}')\r\n", - "print(f'korean df: {korean_df.shape}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## What are the top ingredients by class" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def create_ingredient_df(df):\r\n", - " #transpose df, drop cuisine and unnamed rows, sum the row to get total for ingredient and add value header to new df\r\n", - " ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value')\r\n", - " # drop ingredients that have a 0 sum\r\n", - " ingredient_df = ingredient_df[(ingredient_df.T != 0).any()]\r\n", - " # sort df\r\n", - " ingredient_df = ingredient_df.sort_values(by='value', ascending=False, inplace=False)\r\n", - " return ingredient_df\r\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "thai_ingredient_df = create_ingredient_df(thai_df)\r\n", - "thai_ingredient_df.head(10).plot.barh()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "japanese_ingredient_df = create_ingredient_df(japanese_df)\r\n", - "japanese_ingredient_df.head(10).plot.barh()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "chinese_ingredient_df = create_ingredient_df(chinese_df)\r\n", - "chinese_ingredient_df.head(10).plot.barh()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "indian_ingredient_df = create_ingredient_df(indian_df)\r\n", - "indian_ingredient_df.head(10).plot.barh()" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "korean_ingredient_df = create_ingredient_df(korean_df)\r\n", - "korean_ingredient_df.head(10).plot.barh()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "# TODO add categorical labels to food items - calculated columns to improve accuracy" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "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": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# set x and y features\r\n", - "# dropping common ingredients to improve accuracy\r\n", - "#feature_df= df.drop(['cuisine','Unnamed: 0'], axis=1)\r\n", - "feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1)\r\n", - "labels_df = df.cuisine #.unique()\r\n", - "feature_df.head()\r\n" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# balance data with SMOTE oversamplling to the highest class. Read more here: https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html\r\n", - "oversample = SMOTE()\r\n", - "transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "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": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "transformed_feature_df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "new label count: chinese 799\n", - "korean 799\n", - "indian 799\n", - "thai 799\n", - "japanese 799\n", - "Name: cuisine, dtype: int64\n", - "old label count: korean 799\n", - "indian 598\n", - "chinese 442\n", - "japanese 320\n", - "thai 289\n", - "Name: cuisine, dtype: int64\n" - ] - } - ], - "source": [ - "print(f'new label count: {transformed_label_df.value_counts()}')\r\n", - "print(f'old label count: {df.cuisine.value_counts()}')" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "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", - "
cuisinealmondangelicaaniseanise_seedappleapple_brandyapricotarmagnacartemisia...whiskeywhite_breadwhite_winewhole_grain_wheat_flourwinewoodyamyeastyogurtzucchini
0indian000000000...0000000000
1indian100000000...0000000000
2indian000000000...0000000000
3indian000000000...0000000000
4indian000000000...0000000010
\n", - "

5 rows ร— 381 columns

\n", - "
" - ], - "text/plain": [ - " cuisine almond angelica anise anise_seed apple apple_brandy apricot \\\n", - "0 indian 0 0 0 0 0 0 0 \n", - "1 indian 1 0 0 0 0 0 0 \n", - "2 indian 0 0 0 0 0 0 0 \n", - "3 indian 0 0 0 0 0 0 0 \n", - "4 indian 0 0 0 0 0 0 0 \n", - "\n", - " armagnac artemisia ... whiskey white_bread white_wine \\\n", - "0 0 0 ... 0 0 0 \n", - "1 0 0 ... 0 0 0 \n", - "2 0 0 ... 0 0 0 \n", - "3 0 0 ... 0 0 0 \n", - "4 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 381 columns]" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# export transformed data to new csv for classification\r\n", - "transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')\r\n", - "transformed_df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [ - "transformed_feature_df.to_csv(\".data/features_dataset.csv\")\r\n", - "transformed_label_df.to_csv(\".data/labels_dataset.csv\")\r\n", - "transformed_df.to_csv(\".data/processed.csv\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Build classification model" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.linear_model import LogisticRegression\r\n", - "from sklearn.model_selection import train_test_split, cross_val_score\r\n", - "from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve\r\n", - "from sklearn.svm import SVC" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "X_train, X_test, y_train, y_test = train_test_split(transformed_feature_df, transformed_label_df, test_size=0.3)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Accuracy is 0.7973311092577148\n" - ] - } - ], - "source": [ - "lr = LogisticRegression(multi_class='ovr',solver='lbfgs')\r\n", - "model = lr.fit(X_train, y_train)\r\n", - "\r\n", - "accuracy = model.score(X_test, y_test)\r\n", - "print (\"Accuracy is {}\".format(accuracy))" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ingredients: Index(['bean', 'carrot', 'cayenne', 'pea', 'sake', 'scallion', 'sesame_oil',\n", - " 'shrimp', 'starch', 'vegetable_oil', 'vinegar'],\n", - " dtype='object')\n", - "cusine: chinese\n" - ] - } - ], - "source": [ - "# test an item\r\n", - "print(f'ingredients: {X_test.iloc[20][X_test.iloc[20]!=0].keys()}')\r\n", - "print(f'cusine: {y_test.iloc[20]}')" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "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", - "
0
chinese0.848156
japanese0.110072
korean0.033688
thai0.005013
indian0.003072
\n", - "
" - ], - "text/plain": [ - " 0\n", - "chinese 0.848156\n", - "japanese 0.110072\n", - "korean 0.033688\n", - "thai 0.005013\n", - "indian 0.003072" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#rehsape to 2d array and transpose\r\n", - "test= X_test.iloc[20].values.reshape(-1, 1).T\r\n", - "# predict with score\r\n", - "proba = model.predict_proba(test)\r\n", - "classes = model.classes_\r\n", - "# create df with classes and scores\r\n", - "resultdf = pd.DataFrame(data=proba, columns=classes)\r\n", - "\r\n", - "# create df to show results\r\n", - "topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])\r\n", - "topPrediction.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "y_pred = model.predict(X_test)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " precision recall f1-score support\n", - "\n", - " chinese 0.78 0.75 0.76 243\n", - " indian 0.91 0.92 0.91 233\n", - " japanese 0.67 0.77 0.71 244\n", - " korean 0.84 0.78 0.81 241\n", - " thai 0.82 0.77 0.80 238\n", - "\n", - " accuracy 0.80 1199\n", - " macro avg 0.80 0.80 0.80 1199\n", - "weighted avg 0.80 0.80 0.80 1199\n", - "\n" - ] - } - ], - "source": [ - "print(classification_report(y_test,y_pred))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Try different classifiers" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "\r\n", - "C = 10\r\n", - "# Create different classifiers.\r\n", - "classifiers = {\r\n", - " 'L1 logistic': LogisticRegression(C=C, penalty='l1',\r\n", - " solver='saga',\r\n", - " multi_class='multinomial',\r\n", - " max_iter=10000),\r\n", - " 'L2 logistic (Multinomial)': LogisticRegression(C=C, penalty='l2',\r\n", - " solver='saga',\r\n", - " multi_class='multinomial',\r\n", - " max_iter=10000),\r\n", - " 'L2 logistic (OvR)': LogisticRegression(C=C, penalty='l2',\r\n", - " solver='saga',\r\n", - " multi_class='ovr',\r\n", - " max_iter=10000),\r\n", - " 'Linear SVC': SVC(kernel='linear', C=C, probability=True,\r\n", - " random_state=0)\r\n", - "}\r\n" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Accuracy (train) for L1 logistic: 80.7% \n", - "Accuracy (train) for L2 logistic (Multinomial): 80.9% \n", - "Accuracy (train) for L2 logistic (OvR): 80.7% \n", - "Accuracy (train) for Linear SVC: 79.9% \n" - ] - } - ], - "source": [ - "n_classifiers = len(classifiers)\r\n", - "\r\n", - "for index, (name, classifier) in enumerate(classifiers.items()):\r\n", - " classifier.fit(X_train, y_train)\r\n", - "\r\n", - " y_pred = classifier.predict(X_test)\r\n", - " accuracy = accuracy_score(y_test, y_pred)\r\n", - " print(\"Accuracy (train) for %s: %0.1f%% \" % (name, accuracy * 100))\r\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "interpreter": { - "hash": "dd61f40108e2a19f4ef0d3ebbc6b6eea57ab3c4bc13b15fe6f390d3d86442534" - }, - "kernelspec": { - "display_name": "Python 3.8.5 64-bit ('onnxwine': conda)", - "name": "python3" - }, - "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.8.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} \ No newline at end of file diff --git a/4-Classification/1-Introduction/solution/intro-classification.ipynb b/4-Classification/1-Introduction/solution/intro-classification.ipynb deleted file mode 100644 index 997e18258..000000000 --- a/4-Classification/1-Introduction/solution/intro-classification.ipynb +++ /dev/null @@ -1,563 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Build Classification Model" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.linear_model import LogisticRegression\r\n", - "from sklearn.model_selection import train_test_split, cross_val_score\r\n", - "from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve\r\n", - "from sklearn.svm import SVC\r\n", - "import pandas as pd\r\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "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": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "transformed_feature_df = pd.read_csv(\".data/features_dataset.csv\")\r\n", - "transformed_feature_df= transformed_feature_df.drop(['Unnamed: 0'], axis=1)\r\n", - "transformed_feature_df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "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": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "transformed_label_df = pd.read_csv(\".data/labels_dataset.csv\")\r\n", - "transformed_label_df= transformed_label_df.drop(['Unnamed: 0'], axis=1)\r\n", - "transformed_label_df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "X_train, X_test, y_train, y_test = train_test_split(transformed_feature_df, transformed_label_df, test_size=0.3)" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Accuracy is 0.8031693077564637\n" - ] - } - ], - "source": [ - "lr = LogisticRegression(multi_class='ovr',solver='lbfgs')\r\n", - "model = lr.fit(X_train, np.ravel(y_train))\r\n", - "\r\n", - "accuracy = model.score(X_test, y_test)\r\n", - "print (\"Accuracy is {}\".format(accuracy))" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ingredients: Index(['corn'], dtype='object')\n", - "cusine: cuisine thai\n", - "Name: 3816, dtype: object\n" - ] - } - ], - "source": [ - "# test an item\r\n", - "print(f'ingredients: {X_test.iloc[20][X_test.iloc[20]!=0].keys()}')\r\n", - "print(f'cusine: {y_test.iloc[20]}')" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "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", - "
0
thai0.475724
chinese0.201912
japanese0.152046
korean0.110980
indian0.059338
\n", - "
" - ], - "text/plain": [ - " 0\n", - "thai 0.475724\n", - "chinese 0.201912\n", - "japanese 0.152046\n", - "korean 0.110980\n", - "indian 0.059338" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#rehsape to 2d array and transpose\r\n", - "test= X_test.iloc[20].values.reshape(-1, 1).T\r\n", - "# predict with score\r\n", - "proba = model.predict_proba(test)\r\n", - "classes = model.classes_\r\n", - "# create df with classes and scores\r\n", - "resultdf = pd.DataFrame(data=proba, columns=classes)\r\n", - "\r\n", - "# create df to show results\r\n", - "topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])\r\n", - "topPrediction.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " precision recall f1-score support\n", - "\n", - " chinese 0.77 0.70 0.74 239\n", - " indian 0.88 0.88 0.88 240\n", - " japanese 0.76 0.79 0.77 227\n", - " korean 0.86 0.78 0.82 240\n", - " thai 0.75 0.86 0.80 253\n", - "\n", - " accuracy 0.80 1199\n", - " macro avg 0.81 0.80 0.80 1199\n", - "weighted avg 0.81 0.80 0.80 1199\n", - "\n" - ] - } - ], - "source": [ - "y_pred = model.predict(X_test)\r\n", - "print(classification_report(y_test,y_pred))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Try different classifiers" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [], - "source": [ - "\r\n", - "C = 10\r\n", - "# Create different classifiers.\r\n", - "classifiers = {\r\n", - " 'L1 logistic': LogisticRegression(C=C, penalty='l1',\r\n", - " solver='saga',\r\n", - " multi_class='multinomial',\r\n", - " max_iter=10000),\r\n", - " 'L2 logistic (Multinomial)': LogisticRegression(C=C, penalty='l2',\r\n", - " solver='saga',\r\n", - " multi_class='multinomial',\r\n", - " max_iter=10000),\r\n", - " 'L2 logistic (OvR)': LogisticRegression(C=C, penalty='l2',\r\n", - " solver='saga',\r\n", - " multi_class='ovr',\r\n", - " max_iter=10000),\r\n", - " 'Linear SVC': SVC(kernel='linear', C=C, probability=True,\r\n", - " random_state=0)\r\n", - "}\r\n" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Accuracy (train) for L1 logistic: 79.9% \n", - "Accuracy (train) for L2 logistic (Multinomial): 79.7% \n", - "Accuracy (train) for L2 logistic (OvR): 79.8% \n", - "Accuracy (train) for Linear SVC: 77.9% \n" - ] - } - ], - "source": [ - "n_classifiers = len(classifiers)\r\n", - "\r\n", - "for index, (name, classifier) in enumerate(classifiers.items()):\r\n", - " classifier.fit(X_train, np.ravel(y_train))\r\n", - "\r\n", - " y_pred = classifier.predict(X_test)\r\n", - " accuracy = accuracy_score(y_test, y_pred)\r\n", - " print(\"Accuracy (train) for %s: %0.1f%% \" % (name, accuracy * 100))\r\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "interpreter": { - "hash": "dd61f40108e2a19f4ef0d3ebbc6b6eea57ab3c4bc13b15fe6f390d3d86442534" - }, - "kernelspec": { - "display_name": "Python 3.8.5 64-bit ('onnxwine': conda)", - "name": "python3" - }, - "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.8.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} \ No newline at end of file diff --git a/4-Classification/1-Introduction/solution/notebook.ipynb b/4-Classification/1-Introduction/solution/notebook.ipynb index 0d08010ca..84f6b3826 100644 --- a/4-Classification/1-Introduction/solution/notebook.ipynb +++ b/4-Classification/1-Introduction/solution/notebook.ipynb @@ -11,12 +11,14 @@ "source": [ "Install Imblearn which will enable SMOTE. This is a Scikit-Learn package that helps handle imbalanced data when performing classification. (https://imbalanced-learn.org/stable/)" ], - "cell_type": "markdown", - "metadata": {} + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -26,8 +28,8 @@ "Requirement already satisfied: imblearn in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (0.0)\n", "Requirement already satisfied: imbalanced-learn in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from imblearn) (0.8.0)\n", "Requirement already satisfied: numpy>=1.13.3 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from imbalanced-learn->imblearn) (1.19.2)\n", - "Requirement already satisfied: joblib>=0.11 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from imbalanced-learn->imblearn) (0.16.0)\n", "Requirement already satisfied: scipy>=0.19.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from imbalanced-learn->imblearn) (1.4.1)\n", + "Requirement already satisfied: joblib>=0.11 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from imbalanced-learn->imblearn) (0.16.0)\n", "Requirement already satisfied: scikit-learn>=0.24 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from imbalanced-learn->imblearn) (0.24.2)\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.24->imbalanced-learn->imblearn) (2.1.0)\n", "\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1.2 is available.\n", @@ -42,11 +44,10 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ - "\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import matplotlib as mpl\n", @@ -56,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -72,7 +73,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -105,7 +106,7 @@ "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
065indian00000000...0000000000
166indian10000000...0000000000
267indian00000000...0000000000
368indian00000000...0000000000
469indian00000000...0000000010
\n

5 rows ร— 385 columns

\n
" }, "metadata": {}, - "execution_count": 20 + "execution_count": 5 } ], "source": [ @@ -114,7 +115,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -131,7 +132,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -147,7 +148,7 @@ ] }, "metadata": {}, - "execution_count": 22 + "execution_count": 7 } ], "source": [ @@ -163,24 +164,24 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 8, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ - "" + "" ] }, "metadata": {}, - "execution_count": 23 + "execution_count": 8 }, { "output_type": "display_data", "data": { "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { @@ -194,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -229,40 +230,40 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ - "def create_ingredient_df(df):\r\n", - " #transpose df, drop cuisine and unnamed rows, sum the row to get total for ingredient and add value header to new df\r\n", - " ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value')\r\n", - " # drop ingredients that have a 0 sum\r\n", - " ingredient_df = ingredient_df[(ingredient_df.T != 0).any()]\r\n", - " # sort df\r\n", - " ingredient_df = ingredient_df.sort_values(by='value', ascending=False, inplace=False)\r\n", - " return ingredient_df\r\n" + "def create_ingredient_df(df):\n", + " # transpose df, drop cuisine and unnamed rows, sum the row to get total for ingredient and add value header to new df\n", + " ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value')\n", + " # drop ingredients that have a 0 sum\n", + " ingredient_df = ingredient_df[(ingredient_df.T != 0).any()]\n", + " # sort df\n", + " ingredient_df = ingredient_df.sort_values(by='value', ascending=False, inplace=False)\n", + " return ingredient_df\n" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 11, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ - "" + "" ] }, "metadata": {}, - "execution_count": 26 + "execution_count": 11 }, { "output_type": "display_data", "data": { "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { @@ -277,24 +278,24 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 12, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ - "" + "" ] }, "metadata": {}, - "execution_count": 27 + "execution_count": 12 }, { "output_type": "display_data", "data": { "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { @@ -309,24 +310,24 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 13, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ - "" + "" ] }, "metadata": {}, - "execution_count": 28 + "execution_count": 13 }, { "output_type": "display_data", "data": { "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { @@ -341,24 +342,24 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 14, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ - "" + "" ] }, "metadata": {}, - "execution_count": 29 + "execution_count": 14 }, { "output_type": "display_data", "data": { "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { @@ -373,24 +374,24 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 15, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ - "" + "" ] }, "metadata": {}, - "execution_count": 30 + "execution_count": 15 }, { "output_type": "display_data", "data": { "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { @@ -412,7 +413,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -445,7 +446,7 @@ "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": 31 + "execution_count": 16 } ], "source": [ @@ -456,14 +457,14 @@ }, { "source": [ - "Balance data with SMOTE oversamplling to the highest class. Read more here: https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html" + "Balance data with SMOTE oversampling to the highest class. Read more here: https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html" ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -473,14 +474,14 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 19, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ - "new label count: chinese 799\nkorean 799\njapanese 799\nthai 799\nindian 799\nName: cuisine, dtype: int64\nold label count: korean 799\nindian 598\nchinese 442\njapanese 320\nthai 289\nName: cuisine, dtype: int64\n" + "new label count: korean 799\nchinese 799\nindian 799\njapanese 799\nthai 799\nName: cuisine, dtype: int64\nold label count: korean 799\nindian 598\nchinese 442\njapanese 320\nthai 289\nName: cuisine, dtype: int64\n" ] } ], @@ -491,7 +492,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -524,23 +525,16 @@ "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": 34 + "execution_count": 20 } ], "source": [ "transformed_feature_df.head()" ] }, - { - "source": [ - "todo: explain this concatenation?" - ], - "cell_type": "markdown", - "metadata": {} - }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -568,7 +562,7 @@ "4 0 0 0 ... 0 0 0 \n", "... ... ... ... ... ... ... ... \n", "3990 0 0 0 ... 0 0 0 \n", - "3991 0 0 0 ... 0 0 1 \n", + "3991 0 0 0 ... 0 0 0 \n", "3992 0 0 0 ... 0 0 0 \n", "3993 0 0 0 ... 0 0 0 \n", "3994 0 0 0 ... 0 0 0 \n", @@ -588,10 +582,10 @@ "\n", "[3995 rows x 381 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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
cuisinealmondangelicaaniseanise_seedappleapple_brandyapricotarmagnacartemisia...whiskeywhite_breadwhite_winewhole_grain_wheat_flourwinewoodyamyeastyogurtzucchini
0indian000000000...0000000000
1indian100000000...0000000000
2indian000000000...0000000000
3indian000000000...0000000000
4indian000000000...0000000010
..................................................................
3990thai000000000...0000000000
3991thai000000000...0010000000
3992thai000000000...0000000000
3993thai000000000...0000000000
3994thai000000000...0000000000
\n

3995 rows ร— 381 columns

\n
" + "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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
cuisinealmondangelicaaniseanise_seedappleapple_brandyapricotarmagnacartemisia...whiskeywhite_breadwhite_winewhole_grain_wheat_flourwinewoodyamyeastyogurtzucchini
0indian000000000...0000000000
1indian100000000...0000000000
2indian000000000...0000000000
3indian000000000...0000000000
4indian000000000...0000000010
..................................................................
3990thai000000000...0000000000
3991thai000000000...0000000000
3992thai000000000...0000000000
3993thai000000000...0000000000
3994thai000000000...0000000000
\n

3995 rows ร— 381 columns

\n
" }, "metadata": {}, - "execution_count": 35 + "execution_count": 21 } ], "source": [ @@ -599,6 +593,46 @@ "transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')\n", "transformed_df" ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\nRangeIndex: 3995 entries, 0 to 3994\nColumns: 381 entries, cuisine to zucchini\ndtypes: int64(380), object(1)\nmemory usage: 11.6+ MB\n" + ] + } + ], + "source": [ + "transformed_df.info()" + ] + }, + { + "source": [ + "Save the file for future use" + ], + "cell_type": "markdown", + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "transformed_df.to_csv(\"../../data/cleaned_cuisine.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/4-Classification/2-Discriminative/README.md b/4-Classification/2-Classifiers-1/README.md similarity index 100% rename from 4-Classification/2-Discriminative/README.md rename to 4-Classification/2-Classifiers-1/README.md diff --git a/4-Classification/2-Discriminative/assignment.md b/4-Classification/2-Classifiers-1/assignment.md similarity index 100% rename from 4-Classification/2-Discriminative/assignment.md rename to 4-Classification/2-Classifiers-1/assignment.md diff --git a/4-Classification/2-Discriminative/translations/README.es.md b/4-Classification/2-Classifiers-1/notebook.ipynb similarity index 100% rename from 4-Classification/2-Discriminative/translations/README.es.md rename to 4-Classification/2-Classifiers-1/notebook.ipynb diff --git a/4-Classification/2-Classifiers-1/solution/notebook.ipynb b/4-Classification/2-Classifiers-1/solution/notebook.ipynb new file mode 100644 index 000000000..aeba09710 --- /dev/null +++ b/4-Classification/2-Classifiers-1/solution/notebook.ipynb @@ -0,0 +1,336 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Build Classification Model" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.model_selection import train_test_split, cross_val_score\n", + "from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve\n", + "from sklearn.svm import SVC\n", + "import pandas as pd\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "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": 26 + } + ], + "source": [ + "recipes_df = pd.read_csv(\"../../data/cleaned_cuisine.csv\")\n", + "recipes_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0 indian\n", + "1 indian\n", + "2 indian\n", + "3 indian\n", + "4 indian\n", + "Name: cuisine, dtype: object" + ] + }, + "metadata": {}, + "execution_count": 27 + } + ], + "source": [ + "recipes_label_df = recipes_df['cuisine']\n", + "recipes_label_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "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": 28 + } + ], + "source": [ + "recipes_feature_df = recipes_df.drop(['Unnamed: 0', 'cuisine'], axis=1)\n", + "recipes_feature_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "X_train, X_test, y_train, y_test = train_test_split(recipes_feature_df, recipes_label_df, test_size=0.3)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Accuracy is 0.810675562969141\n" + ] + } + ], + "source": [ + "lr = LogisticRegression(multi_class='ovr',solver='lbfgs')\n", + "model = lr.fit(X_train, np.ravel(y_train))\n", + "\n", + "accuracy = model.score(X_test, y_test)\n", + "print (\"Accuracy is {}\".format(accuracy))" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "ingredients: Index(['bean', 'coriander', 'cumin', 'fenugreek', 'pepper', 'turmeric',\n 'vegetable_oil'],\n dtype='object')\ncusine: thai\n" + ] + } + ], + "source": [ + "# test an item\n", + "print(f'ingredients: {X_test.iloc[20][X_test.iloc[20]!=0].keys()}')\n", + "print(f'cuisine: {y_test.iloc[20]}')" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " 0\n", + "indian 0.530435\n", + "thai 0.344293\n", + "japanese 0.108792\n", + "chinese 0.015001\n", + "korean 0.001480" + ], + "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
0
indian0.530435
thai0.344293
japanese0.108792
chinese0.015001
korean0.001480
\n
" + }, + "metadata": {}, + "execution_count": 32 + } + ], + "source": [ + "#rehsape to 2d array and transpose\r\n", + "test= X_test.iloc[20].values.reshape(-1, 1).T\r\n", + "# predict with score\r\n", + "proba = model.predict_proba(test)\r\n", + "classes = model.classes_\r\n", + "# create df with classes and scores\r\n", + "resultdf = pd.DataFrame(data=proba, columns=classes)\r\n", + "\r\n", + "# create df to show results\r\n", + "topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])\r\n", + "topPrediction.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n\n chinese 0.75 0.67 0.70 231\n indian 0.91 0.90 0.90 255\n japanese 0.77 0.82 0.79 260\n korean 0.83 0.83 0.83 220\n thai 0.79 0.83 0.81 233\n\n accuracy 0.81 1199\n macro avg 0.81 0.81 0.81 1199\nweighted avg 0.81 0.81 0.81 1199\n\n" + ] + } + ], + "source": [ + "y_pred = model.predict(X_test)\r\n", + "print(classification_report(y_test,y_pred))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Try different classifiers" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "\r\n", + "C = 10\r\n", + "# Create different classifiers.\r\n", + "classifiers = {\r\n", + " 'L1 logistic': LogisticRegression(C=C, penalty='l1',\r\n", + " solver='saga',\r\n", + " multi_class='multinomial',\r\n", + " max_iter=10000),\r\n", + " 'L2 logistic (Multinomial)': LogisticRegression(C=C, penalty='l2',\r\n", + " solver='saga',\r\n", + " multi_class='multinomial',\r\n", + " max_iter=10000),\r\n", + " 'L2 logistic (OvR)': LogisticRegression(C=C, penalty='l2',\r\n", + " solver='saga',\r\n", + " multi_class='ovr',\r\n", + " max_iter=10000),\r\n", + " 'Linear SVC': SVC(kernel='linear', C=C, probability=True,\r\n", + " random_state=0)\r\n", + "}\r\n" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Accuracy (train) for L1 logistic: 79.4% \n", + "Accuracy (train) for L2 logistic (Multinomial): 79.2% \n", + "Accuracy (train) for L2 logistic (OvR): 80.2% \n", + "Accuracy (train) for Linear SVC: 79.1% \n" + ] + } + ], + "source": [ + "n_classifiers = len(classifiers)\r\n", + "\r\n", + "for index, (name, classifier) in enumerate(classifiers.items()):\r\n", + " classifier.fit(X_train, np.ravel(y_train))\r\n", + "\r\n", + " y_pred = classifier.predict(X_test)\r\n", + " accuracy = accuracy_score(y_test, y_pred)\r\n", + " print(\"Accuracy (train) for %s: %0.1f%% \" % (name, accuracy * 100))\r\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "interpreter": { + "hash": "dd61f40108e2a19f4ef0d3ebbc6b6eea57ab3c4bc13b15fe6f390d3d86442534" + }, + "kernelspec": { + "name": "python37364bit8d3b438fb5fc4430a93ac2cb74d693a7", + "display_name": "Python 3.7.0 64-bit ('3.7')" + }, + "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" + }, + "metadata": { + "interpreter": { + "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} \ No newline at end of file diff --git a/4-Classification/3-Generative/translations/README.es.md b/4-Classification/2-Classifiers-1/translations/README.es.md similarity index 100% rename from 4-Classification/3-Generative/translations/README.es.md rename to 4-Classification/2-Classifiers-1/translations/README.es.md diff --git a/4-Classification/3-Generative/README.md b/4-Classification/3-Classifiers-2/README.md similarity index 100% rename from 4-Classification/3-Generative/README.md rename to 4-Classification/3-Classifiers-2/README.md diff --git a/4-Classification/3-Generative/assignment.md b/4-Classification/3-Classifiers-2/assignment.md similarity index 100% rename from 4-Classification/3-Generative/assignment.md rename to 4-Classification/3-Classifiers-2/assignment.md diff --git a/4-Classification/3-Classifiers-2/notebook.ipynb b/4-Classification/3-Classifiers-2/notebook.ipynb new file mode 100644 index 000000000..e69de29bb diff --git a/4-Classification/3-Classifiers-2/solution/notebook.ipynb b/4-Classification/3-Classifiers-2/solution/notebook.ipynb new file mode 100644 index 000000000..e69de29bb diff --git a/4-Classification/3-Classifiers-2/translations/README.es.md b/4-Classification/3-Classifiers-2/translations/README.es.md new file mode 100644 index 000000000..e69de29bb diff --git a/4-Classification/4-Applied/notebook.ipynb b/4-Classification/4-Applied/notebook.ipynb new file mode 100644 index 000000000..e69de29bb diff --git a/4-Classification/4-Applied/solution/notebook.ipynb b/4-Classification/4-Applied/solution/notebook.ipynb new file mode 100644 index 000000000..e69de29bb diff --git a/4-Classification/README.md b/4-Classification/README.md index a313fc477..dbf584363 100644 --- a/4-Classification/README.md +++ b/4-Classification/README.md @@ -1,20 +1,19 @@ # Getting Started with Classification ## Regional topic: Delicious Asian Recipes ๐Ÿœ -In Asia, food traditions are extremely diverse, and very delicious! Let's look at data about regional recipes to try to guess where they originated. +In Asia and India, food traditions are extremely diverse, and very delicious! Let's look at data about regional recipes to try to guess where they originated. ![Thai food seller](./images/thai-food.jpg) > Photo by Lisheng Chang on Unsplash - ## What you will learn -In this section, you will build on the skills you learned in Lesson 1 (Regression) to learn about more classifiers you can use that will help you learn about your data. +In this section, you will build on the skills you learned in Lesson 1 (Regression) to learn about other classifiers you can use that will help you learn about your data. ## Lessons 1. [Introduction to Classification](1-Introduction/README.md) -2. [Build a Discriminative Model](2-Discriminative/README.md) -3. [Build a Generative Model](3-Generative/README.md) +2. [More Classifiers](2-Classifiers-1/README.md) +3. [Yet Other Classifiers](3-Classifiers-2/README.md) 4. [Applied ML: Build a Web App](4-Applied/README.md) ## Credits