From 607a9e0fd186f0a8b41892a2559e4b82cf920a8e Mon Sep 17 00:00:00 2001 From: WHQWHQWHQ <117834283+WHQWHQWHQ@users.noreply.github.com> Date: Tue, 16 Jan 2024 05:48:37 +0800 Subject: [PATCH 1/7] Delete open-machine-learning-jupyter-book/assignments/machine-learning-productionization/data-engineering.ipynb --- .../data-engineering.ipynb | 506 ------------------ 1 file changed, 506 deletions(-) delete mode 100644 open-machine-learning-jupyter-book/assignments/machine-learning-productionization/data-engineering.ipynb diff --git a/open-machine-learning-jupyter-book/assignments/machine-learning-productionization/data-engineering.ipynb b/open-machine-learning-jupyter-book/assignments/machine-learning-productionization/data-engineering.ipynb deleted file mode 100644 index 07628dbab..000000000 --- a/open-machine-learning-jupyter-book/assignments/machine-learning-productionization/data-engineering.ipynb +++ /dev/null @@ -1,506 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Data engineering\n", - "\n", - "This assignment focuses on techniques for cleaning and transforming the data to handle challenges of missing, inaccurate, or incomplete data. Please refer to [Machine Learning productionization - Data engineering](#data-engineering) to learn more.\n", - "\n", - "Fill `____` pieces of the below implementation in order to pass the assertions.\n", - "\n", - "\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exploring dataset\n", - "\n", - "> **Learning goal**: By the end of this subsection, you should be comfortable finding general information about the data stored in pandas DataFrames.\n", - "\n", - "In order to explore this functionality, we will import the modefined version of Python scikit-learn library's iconic dataset **Iris**." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "from sklearn.datasets import load_iris\n", - "import math\n", - "\n", - "iris_df = pd.read_csv('../../assets/data/modefined_sklearn_iris_dataset.csv', index_col=0)\n", - "iris_df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To start off, print the summary of a DataFrame." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "iris_df.____" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```{quizdown}\n", - "\n", - "## How many entries the Iris dataset has?\n", - "\n", - "> Please refer to the output of above cell. \n", - "\n", - "- [ ] 50\n", - "- [ ] 100\n", - "- [x] 150\n", - "- [ ] 200\n", - "\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, let's check the actual content of the `DataFrame`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# displying first 5 rows of our iris_df\n", - "iris_df____\n", - "\n", - "# in the first five rows, which one's spepal length is 5.0cm?\n", - "assert iris_df.iloc[____, 0] == 5.0" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Conversely, we can check the last few rows of the DataFrame." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# displying last 5 rows of our `iris_df`.\n", - "iris_df.____\n", - "\n", - "# in the last five rows, which one's spepal width is 2.5cm?\n", - "assert iris_df.iloc[____, 1] == 2.5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Takeaway**: Even just by looking at the metadata about the information in a DataFrame or the first and last few values in one, you can get an immediate idea about the size, shape, and content of the data you are dealing with." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Dealing with missing data\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Missing data can cause inaccuracies as well as weak or biased results. Sometimes these can be resolved by a \"reload\" of the data, filling in the missing values with computation and code like Python, or simply just removing the value and corresponding data. There are numerous reasons for why data may be missing and the actions that are taken to resolve these missing values can be dependent on how and why they went missing in the first place.\n", - "\n", - "> **Learning goal**: By the end of this subsection, you should know how to replace or remove null values from DataFrames.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In pandas, the `isnull()` and `notnull()` methods are your primary methods for detecting null data. Both return Boolean masks over your data. We will be using numpy for NaN values:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "iris_isnull_df = iris_df.isnull()\n", - "\n", - "print(iris_isnull_df)\n", - "\n", - "# find one row with missing value\n", - "assert iris_isnull_df.iloc[____, ____] == True\n", - "assert math.isnan(iris_df.iloc[____, ____]) == True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# get all the rows with missing data\n", - "iris_with_missing_value_df = iris_df____\n", - "\n", - "assert iris_with_missing_value_df.shape[0] == 16" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Dropping null values**: Beyond identifying missing values, pandas provides a convenient means `dropna` to remove null values from Series and DataFrames. (Particularly on large data sets, it is often more advisable to simply remove missing [NA] values from your analysis than deal with them in other ways.) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# remove all the rows with missing values\n", - "iris_with_dropna_on_row_df = iris_df.____\n", - "\n", - "assert iris_with_dropna_on_row_df.shape[0] == 134" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# remove all the columns with missing values\n", - "iris_with_dropna_on_column_df = iris_df.____\n", - "\n", - "assert iris_with_dropna_on_column_df.columns.shape[0] == 0" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# remove all the rows with 2 missing values\n", - "iris_with_dropna_2_values_on_rows_df = iris_df.____\n", - "\n", - "assert iris_with_dropna_2_values_on_rows_df.shape[0] == 144\n", - "\n", - "# remove all the rows with 1 missing values\n", - "iris_with_dropna_1_values_on_rows_df = iris_df.____\n", - "\n", - "assert iris_with_dropna_1_values_on_rows_df.shape[0] == 147" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Filling null values**: Depending on your dataset, it can sometimes make more sense to fill null values with valid ones rather than drop them. You could use `isnull` to do this in place, but that can be laborious, particularly if you have a lot of values to fill. Because this is such a common task in data science, pandas provides `fillna`, which returns a copy of the Series or DataFrame with the missing values replaced with one of your choosing. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# fll all the missing values with 0\n", - "iris_with_fillna_df = iris_df.____\n", - "\n", - "# get all the rows with missing data\n", - "iris_with_missing_value_after_fillna_df = iris_with_fillna_df____\n", - "\n", - "assert iris_with_missing_value_after_fillna_df.shape[0] == 0\n", - "assert iris_with_fillna_df.iloc[____, 3] == -1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# forward-fill null values, which is to use the last valid value to fill a null:\n", - "iris_with_fillna_forward_df = iris_df.____\n", - "\n", - "# get all the rows with missing data\n", - "iris_with_missing_value_after_fillna_forward_df = iris_with_fillna_forward_df____\n", - "\n", - "assert iris_with_missing_value_after_fillna_forward_df.shape[0] == 0\n", - "assert float(iris_with_fillna_forward_df.iloc[3, 3]) == 0.2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# back-fill null values, which is to use the next valid value to fill a null:\n", - "iris_with_fillna_back_df = iris_df.____\n", - "\n", - "# get all the rows with missing data\n", - "iris_with_missing_value_after_fillna_back_df = iris_with_fillna_back_df____\n", - "\n", - "assert iris_with_missing_value_after_fillna_back_df.shape[0] == 0\n", - "assert float(iris_with_fillna_back_df.iloc[3, 3]) == 0.1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Removing duplicate data\n", - "\n", - "Data that has more than one occurrence can produce inaccurate results and usually should be removed. This can be a common occurrence when joining two or more datasets together. However, there are instances where duplication in joined datasets contain pieces that can provide additional information and may need to be preserved.\n", - "\n", - "> **Learning goal**: By the end of this subsection, you should be comfortable identifying and removing duplicate values from DataFrames.\n", - "\n", - "In addition to missing data, you will often encounter duplicated data in real-world datasets. Fortunately, pandas provides an easy means of detecting and removing duplicate entries." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Identifying duplicates**: You can easily spot duplicate values using the `duplicated` method in pandas, which returns a Boolean mask indicating whether an entry in a DataFrame is a duplicate of an earlier one. Let's create another example DataFrame to see this in action." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "iris_isduplicated_df = iris_df.____\n", - "\n", - "print(iris_isduplicated_df)\n", - "\n", - "# find one row with duplicated value\n", - "assert iris_isduplicated_df.iloc[____, ____] == True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Dropping duplicates**: `drop_duplicates` simply returns a copy of the data for which all of the duplicated values are False:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# remove all the rows with duplicated values\n", - "iris_with_drop_duplicates_on_df = iris_df.drop_duplicates()\n", - "\n", - "assert iris_with_drop_duplicates_on_df.shape[0] == 143" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Both `duplicated` and `drop_duplicates` default to consider all columns but you can specify that they examine only a subset of columns in your DataFrame:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# remove all the rows with duplicated values on column 'petal width (cm)'\n", - "iris_with_drop_duplicates_on_column_df = iris_df.____\n", - "\n", - "assert iris_with_drop_duplicates_on_column_df.shape[0] == 27" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Handle inconsistent data\n", - "\n", - "Depending on the source, data can have inconsistencies in how it’s presented. This can cause problems in searching for and representing the value, where it’s seen within the dataset but is not properly represented in visualizations or query results. Common formatting problems involve resolving whitespace, dates, and data types. Resolving formatting issues is typically up to the people who are using the data. For example, standards on how dates and numbers are presented can differ by country.\n", - "\n", - "> **Learning goal**: By the end of this subsection, you should know how to handle the inconsistent data format in the DataFrame." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's cleaning up the **4th** column `petal width (cm)` to make sure there's no data entry inconsistencies in it. Firstly, we will use a convenient method `unique` from pandas to check the unique values of this column\n", - "\n", - "In pandas, the `unique` method is a convenient way to unique values based on a hash table:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "column_to_format = ____\n", - "column_to_format_unique = column_to_format.____\n", - "\n", - "print(column_to_format_unique)\n", - "\n", - "# find one row with duplicated value\n", - "assert column_to_format_unique.shape[0] == 27" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Regardless the `nan` value, you may find the numeric valus are in different precision. More specifically, `1.` or `1.5012` are not in the same precision as other numbers. We want to append tailing `0` to numbers like `1.`, and round numbers like `1.5012` to `1.5`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# firstly, let's apply `round`` to the values to make the precision all as .1f\n", - "formatted_column = column_to_format.____\n", - "\n", - "print(formatted_column.unique())\n", - "\n", - "assert formatted_column.unique().shape[0] == 23" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# now, let's add tailing 0 if needed to make numbers like 1. to be 1.0. \n", - "# You may need to filter the nan value while processing.\n", - "formatted_column = formatted_column.____\n", - "\n", - "print(formatted_column.unique())\n", - "\n", - "assert formatted_column.unique().shape[0] == 23" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## At last\n", - "\n", - "Let's apply all the methods above to make the data to be clean." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# remove all rows with missing values\n", - "no_missing_data_df = iris_df.____\n", - "\n", - "# remove all rows with duplicated values\n", - "no_missing_dup_data_df = no_missing_data_df.____\n", - "\n", - "# apply the precision .1f to all the numbers\n", - "cleand_df = no_missing_dup_data_df.____\n", - "\n", - "assert no_missing_data_df.shape[0] == 134\n", - "assert no_missing_dup_data_df.shape[0] == 129\n", - "assert cleand_df[cleand_df.columns[3]].unique().shape[0] == 22" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Also, you could refer to below for more about how to handle data quality.\n", - "\n", - "- missing data - [pandas - Working with missing data](https://pandas.pydata.org/docs/user_guide/missing_data.html)\n", - "- duplicate data - [pandas - Duplicate Labels](https://pandas.pydata.org/docs/user_guide/duplicates.html)\n", - "- outlier\n", - " - [Ways to Detect and Remove the Outliers](https://towardsdatascience.com/ways-to-detect-and-remove-the-outliers-404d16608dba)\n", - " - [Outlier!!! The Silent Killer](https://www.kaggle.com/code/nareshbhat/outlier-the-silent-killer)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Acknowledgments\n", - "\n", - "Thanks to Microsoft for creating the open source course [Data Science for Beginners](https://github.com/microsoft/Data-Science-For-Beginners). It contributes some of the content in this chapter." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.9.13 64-bit", - "language": "python", - "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.11.5" - }, - "vscode": { - "interpreter": { - "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" - } - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} From 60550282e04a033b398f36db30f9b7eca7c723f5 Mon Sep 17 00:00:00 2001 From: WHQWHQWHQ <117834283+WHQWHQWHQ@users.noreply.github.com> Date: Tue, 16 Jan 2024 05:50:51 +0800 Subject: [PATCH 2/7] Delete open-machine-learning-jupyter-book/environment.yml --- .../environment.yml | 36 ------------------- 1 file changed, 36 deletions(-) delete mode 100644 open-machine-learning-jupyter-book/environment.yml diff --git a/open-machine-learning-jupyter-book/environment.yml b/open-machine-learning-jupyter-book/environment.yml deleted file mode 100644 index 7030b0e52..000000000 --- a/open-machine-learning-jupyter-book/environment.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: open-machine-learning-jupyter-book -channels: - - conda-forge -dependencies: - - python=3.9 - - nbmake - - pip - - pip: - - sphinx==5.0 - - pytest==7.2.0 - - pandas==1.5.2 - - numpy==1.24.1 - - jsonschema==2.6.0 - - matplotlib==3.6.2 - - pywaffle==1.1.0 - - scikit-learn==1.2.0 - - scipy==1.10.0 - - seaborn==0.12.2 - - tensorflow==2.11.0 - - jupyter-book==0.13.1 - - notebook==6.5.2 - - xgboost==1.6.2 - - imblearn - - jupyter_contrib_nbextensions==0.7.0 - - sphinxcontrib-mermaid==0.7.1 - - sphinxcontrib-wavedrom==3.0.4 - - sphinxcontrib-plantuml==0.24.1 - - sphinxcontrib-tikz==0.4.16 - - sphinxcontrib-blockdiag==3.0.0 - - sphinxcontrib-drawio==0.0.16 - - git+https://github.com/innovationOUtside/ipython_magic_tikz.git - - git+https://github.com/bonartm/sphinxcontrib-quizdown.git - - tqdm - - fastai - - skl2onnx - From 97c04ff26bdb74981c04ab4f5cc60a60c9d25129 Mon Sep 17 00:00:00 2001 From: 296406598 <296406598@qq.com> Date: Mon, 4 Mar 2024 04:04:17 +0800 Subject: [PATCH 3/7] improve rnn.ipynb --- .../deep-learning/rnn.ipynb | 68 +++++++++++-------- 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/open-machine-learning-jupyter-book/deep-learning/rnn.ipynb b/open-machine-learning-jupyter-book/deep-learning/rnn.ipynb index 120aaebc4..7b77ca566 100644 --- a/open-machine-learning-jupyter-book/deep-learning/rnn.ipynb +++ b/open-machine-learning-jupyter-book/deep-learning/rnn.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "4f92eda8", "metadata": { "tags": [ @@ -298,54 +298,66 @@ "Vocabulary Size: 8630\n", "80-20 Train Test split: 4459 -- 1115\n", "Epoch 1/20\n", - "15/15 [==============================] - 2s 41ms/step - loss: 0.6142 - accuracy: 0.7062 - val_loss: 0.4936 - val_accuracy: 0.8879\n", + "15/15 [==============================] - 4s 107ms/step - loss: 0.5348 - accuracy: 0.7951 - val_loss: 0.4411 - val_accuracy: 0.9025\n", "Epoch 2/20\n", - "15/15 [==============================] - 0s 16ms/step - loss: 0.4652 - accuracy: 0.8623 - val_loss: 0.3963 - val_accuracy: 0.9215\n", + "15/15 [==============================] - 0s 20ms/step - loss: 0.4310 - accuracy: 0.8814 - val_loss: 0.3498 - val_accuracy: 0.9540\n", "Epoch 3/20\n", - "15/15 [==============================] - 0s 16ms/step - loss: 0.3839 - accuracy: 0.8980 - val_loss: 0.3211 - val_accuracy: 0.9361\n", + "15/15 [==============================] - 0s 24ms/step - loss: 0.3542 - accuracy: 0.9277 - val_loss: 0.2880 - val_accuracy: 0.9664\n", "Epoch 4/20\n", - "15/15 [==============================] - 0s 16ms/step - loss: 0.3174 - accuracy: 0.9322 - val_loss: 0.2614 - val_accuracy: 0.9585\n", + "15/15 [==============================] - 1s 45ms/step - loss: 0.3058 - accuracy: 0.9445 - val_loss: 0.2443 - val_accuracy: 0.9675\n", "Epoch 5/20\n", - "15/15 [==============================] - 0s 16ms/step - loss: 0.2671 - accuracy: 0.9448 - val_loss: 0.2177 - val_accuracy: 0.9630\n", + "15/15 [==============================] - 1s 45ms/step - loss: 0.2615 - accuracy: 0.9588 - val_loss: 0.2178 - val_accuracy: 0.9630\n", "Epoch 6/20\n", - "15/15 [==============================] - 0s 15ms/step - loss: 0.2230 - accuracy: 0.9619 - val_loss: 0.1832 - val_accuracy: 0.9686\n", + "15/15 [==============================] - 1s 46ms/step - loss: 0.2295 - accuracy: 0.9610 - val_loss: 0.1918 - val_accuracy: 0.9686\n", "Epoch 7/20\n", - "15/15 [==============================] - 0s 16ms/step - loss: 0.1839 - accuracy: 0.9770 - val_loss: 0.1638 - val_accuracy: 0.9641\n", + "15/15 [==============================] - 1s 36ms/step - loss: 0.2096 - accuracy: 0.9703 - val_loss: 0.1826 - val_accuracy: 0.9608\n", "Epoch 8/20\n", - "15/15 [==============================] - 0s 16ms/step - loss: 0.1537 - accuracy: 0.9849 - val_loss: 0.1778 - val_accuracy: 0.9462\n", + "15/15 [==============================] - 0s 17ms/step - loss: 0.1889 - accuracy: 0.9692 - val_loss: 0.1677 - val_accuracy: 0.9652\n", "Epoch 9/20\n", - "15/15 [==============================] - 0s 16ms/step - loss: 0.1351 - accuracy: 0.9885 - val_loss: 0.1349 - val_accuracy: 0.9630\n", + "15/15 [==============================] - 0s 17ms/step - loss: 0.1708 - accuracy: 0.9725 - val_loss: 0.1676 - val_accuracy: 0.9574\n", "Epoch 10/20\n", - "15/15 [==============================] - 0s 16ms/step - loss: 0.1164 - accuracy: 0.9885 - val_loss: 0.1393 - val_accuracy: 0.9540\n", + "15/15 [==============================] - 0s 20ms/step - loss: 0.1553 - accuracy: 0.9779 - val_loss: 0.1753 - val_accuracy: 0.9507\n", "Epoch 11/20\n", - "15/15 [==============================] - 0s 16ms/step - loss: 0.1019 - accuracy: 0.9936 - val_loss: 0.1193 - val_accuracy: 0.9574\n", + "15/15 [==============================] - 0s 33ms/step - loss: 0.1445 - accuracy: 0.9809 - val_loss: 0.1642 - val_accuracy: 0.9563\n", "Epoch 12/20\n", - "15/15 [==============================] - 0s 16ms/step - loss: 0.0907 - accuracy: 0.9924 - val_loss: 0.1223 - val_accuracy: 0.9596\n", + "15/15 [==============================] - 1s 46ms/step - loss: 0.1305 - accuracy: 0.9840 - val_loss: 0.1633 - val_accuracy: 0.9574\n", "Epoch 13/20\n", - "15/15 [==============================] - 0s 16ms/step - loss: 0.0807 - accuracy: 0.9947 - val_loss: 0.1254 - val_accuracy: 0.9574\n", + "15/15 [==============================] - 0s 32ms/step - loss: 0.1298 - accuracy: 0.9857 - val_loss: 0.1663 - val_accuracy: 0.9585\n", "Epoch 14/20\n", - "15/15 [==============================] - 0s 16ms/step - loss: 0.0712 - accuracy: 0.9952 - val_loss: 0.1198 - val_accuracy: 0.9563\n", + "15/15 [==============================] - 0s 20ms/step - loss: 0.1245 - accuracy: 0.9843 - val_loss: 0.1730 - val_accuracy: 0.9518\n", "Epoch 15/20\n", - "15/15 [==============================] - 0s 16ms/step - loss: 0.0657 - accuracy: 0.9952 - val_loss: 0.1182 - val_accuracy: 0.9608\n", + "15/15 [==============================] - 0s 25ms/step - loss: 0.1124 - accuracy: 0.9874 - val_loss: 0.1755 - val_accuracy: 0.9518\n", "Epoch 16/20\n", - "15/15 [==============================] - 0s 16ms/step - loss: 0.0618 - accuracy: 0.9961 - val_loss: 0.1213 - val_accuracy: 0.9596\n", + "15/15 [==============================] - 1s 42ms/step - loss: 0.1072 - accuracy: 0.9868 - val_loss: 0.1609 - val_accuracy: 0.9585\n", "Epoch 17/20\n", - "15/15 [==============================] - 0s 16ms/step - loss: 0.0541 - accuracy: 0.9972 - val_loss: 0.1225 - val_accuracy: 0.9596\n", + "15/15 [==============================] - 1s 40ms/step - loss: 0.1012 - accuracy: 0.9891 - val_loss: 0.1768 - val_accuracy: 0.9529\n", "Epoch 18/20\n", - "15/15 [==============================] - 0s 15ms/step - loss: 0.0467 - accuracy: 0.9978 - val_loss: 0.1207 - val_accuracy: 0.9552\n", + "15/15 [==============================] - 1s 42ms/step - loss: 0.0920 - accuracy: 0.9882 - val_loss: 0.1894 - val_accuracy: 0.9496\n", "Epoch 19/20\n", - "15/15 [==============================] - 0s 16ms/step - loss: 0.0455 - accuracy: 0.9972 - val_loss: 0.1106 - val_accuracy: 0.9563\n", + "15/15 [==============================] - 0s 23ms/step - loss: 0.1018 - accuracy: 0.9863 - val_loss: 0.1943 - val_accuracy: 0.9484\n", "Epoch 20/20\n", - "15/15 [==============================] - 0s 17ms/step - loss: 0.0407 - accuracy: 0.9975 - val_loss: 0.1170 - val_accuracy: 0.9552\n" + "15/15 [==============================] - 0s 30ms/step - loss: 0.0914 - accuracy: 0.9893 - val_loss: 0.1985 - val_accuracy: 0.9496\n" ] }, { - "ename": "", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31mThe Kernel crashed while executing code in the the current cell or a previous cell. Please review the code in the cell(s) to identify a possible cause of the failure. Click here for more info. View Jupyter log for further details." - ] + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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1oKkw4HbREREREYwJBEREREZwZDUCCkUCsybNw8KhcLUVal3vFbL1ZSul9dquZrS9Tala60uDtwmIiIiMoItSURERERGMCQRERERGcGQRERERGQEQxIRERGREQxJJrJixQoEBwfDxsYGYWFhOHjwYJXl9+/fj7CwMNjY2KBFixb497//3UA1rb3Fixeje/fucHR0hKenJ8aMGYNLly5Vuc++ffsgkUgqPP76668GqnXtzJ8/v0Kdvb29q9zHHD9TnaCgIKOf08svv2y0vDl9rgcOHMCoUaPg6+sLiUSC7du3G7wvCALmz58PX19f2Nraon///rhw4cJDj/vDDz8gJCQECoUCISEh2LZtWz1dQfVVda1qtRrvvPMOOnbsCHt7e/j6+mLChAm4fft2lcdct26d0c+6pKSknq/m4R722U6aNKlCvXv27PnQ45rbZwvA6GckkUjwySefVHrMxvzZ1heGJBOIi4tDTEwMZs+ejdOnTyMyMhLDhw9HSkqK0fLJycl44oknEBkZidOnT+O9997DjBkz8MMPPzRwzWtm//79ePnll3H06FHEx8ejrKwMQ4YMQWFh4UP3vXTpEtLS0vSPVq1aNUCNH0379u0N6nzu3LlKy5rrZ6pz4sQJg2uNj48HAPztb3+rcj9z+FwLCwsRGhqK5cuXG31/yZIlWLp0KZYvX44TJ07A29sbjz/+uH49R2OOHDmCqKgoREdH4+zZs4iOjsYzzzyDY8eO1ddlVEtV11pUVIRTp05hzpw5OHXqFLZu3YrLly/jySeffOhxnZycDD7ntLQ02NjY1Mcl1MjDPlsAGDZsmEG9d+7cWeUxzfGzBVDh81mzZg0kEgnGjh1b5XEb62dbbwRqcD169BCmT59usK1t27bCu+++a7T822+/LbRt29Zg20svvST07Nmz3upYHzIzMwUAwv79+ysts3fvXgGAkJOT03AVqwPz5s0TQkNDq13eUj5Tnddee01o2bKloNVqjb5vrp8rAGHbtm3611qtVvD29hY++ugj/baSkhLB2dlZ+Pe//13pcZ555hlh2LBhBtuGDh0qjB8/vs7rXFsPXqsxx48fFwAIN27cqLTM2rVrBWdn57qtXD0wdr0TJ04URo8eXaPjWMpnO3r0aGHgwIFVljGXz7YusSWpgZWWliIhIQFDhgwx2D5kyBAcPnzY6D5HjhypUH7o0KE4efIk1Gp1vdW1ruXl5QEAmjVr9tCyXbp0gY+PDwYNGoS9e/fWd9XqRFJSEnx9fREcHIzx48fj2rVrlZa1lM8UEH+nv/vuO7zwwgsPXezZHD/X+yUnJyM9Pd3gs1MoFOjXr1+lf3+Byj/vqvZpjPLy8iCRSODi4lJluYKCAgQGBsLPzw8jR47E6dOnG6aCdWDfvn3w9PRE69atMW3aNGRmZlZZ3hI+24yMDOzYsQNTpkx5aFlz/mxrgyGpgWVlZUGj0cDLy8tgu5eXF9LT043uk56ebrR8WVkZsrKy6q2udUkQBMycORN9+vRBhw4dKi3n4+ODlStX4ocffsDWrVvRpk0bDBo0CAcOHGjA2tZceHg4NmzYgF9//RWrVq1Ceno6IiIikJ2dbbS8JXymOtu3b0dubi4mTZpUaRlz/VwfpPs7WpO/v7r9arpPY1NSUoJ3330Xf//736tc/LRt27ZYt24dfvrpJ3z//fewsbFB7969kZSU1IC1rZ3hw4dj48aN2LNnDz777DOcOHECAwcOhEqlqnQfS/hs169fD0dHRzz99NNVljPnz7a2rE1dgabqwf9xC4JQ5f/CjZU3tr2xeuWVV/Dnn3/i0KFDVZZr06YN2rRpo3/dq1cv3Lx5E59++in69u1b39WsteHDh+ufd+zYEb169ULLli2xfv16zJw50+g+5v6Z6qxevRrDhw+Hr69vpWXM9XOtTE3//tZ2n8ZCrVZj/Pjx0Gq1WLFiRZVle/bsaTDYuXfv3ujatSu+/PJLfPHFF/Vd1UcSFRWlf96hQwd069YNgYGB2LFjR5UBwpw/WwBYs2YNnnvuuYeOLTLnz7a22JLUwNzd3SGVSiv8LyMzM7PC/0Z0vL29jZa3traGm5tbvdW1rrz66qv46aefsHfvXvj5+dV4/549e5rd/1Ts7e3RsWPHSutt7p+pzo0bN7B7925MnTq1xvua4+equ2OxJn9/dfvVdJ/GQq1W45lnnkFycjLi4+OrbEUyxsrKCt27dze7zxoQW0ADAwOrrLs5f7YAcPDgQVy6dKlWf4fN+bOtLoakBiaXyxEWFqa/G0gnPj4eERERRvfp1atXhfK//fYbunXrBplMVm91fVSCIOCVV17B1q1bsWfPHgQHB9fqOKdPn4aPj08d165+qVQqXLx4sdJ6m+tn+qC1a9fC09MTI0aMqPG+5vi5BgcHw9vb2+CzKy0txf79+yv9+wtU/nlXtU9joAtISUlJ2L17d60CvCAIOHPmjNl91gCQnZ2NmzdvVll3c/1sdVavXo2wsDCEhobWeF9z/myrzVQjxpuyTZs2CTKZTFi9erWQmJgoxMTECPb29sL169cFQRCEd999V4iOjtaXv3btmmBnZye8/vrrQmJiorB69WpBJpMJW7ZsMdUlVMs//vEPwdnZWdi3b5+QlpamfxQVFenLPHitn3/+ubBt2zbh8uXLwvnz54V3331XACD88MMPpriEanvjjTeEffv2CdeuXROOHj0qjBw5UnB0dLS4z/R+Go1GCAgIEN55550K75nz55qfny+cPn1aOH36tABAWLp0qXD69Gn9HV0fffSR4OzsLGzdulU4d+6c8Oyzzwo+Pj6CUqnUHyM6OtrgbtU//vhDkEqlwkcffSRcvHhR+OijjwRra2vh6NGjDX5996vqWtVqtfDkk08Kfn5+wpkzZwz+DqtUKv0xHrzW+fPnC7t27RKuXr0qnD59Wpg8ebJgbW0tHDt2zBSXaKCq683PzxfeeOMN4fDhw0JycrKwd+9eoVevXkLz5s0t7rPVycvLE+zs7ITY2FijxzCnz7a+MCSZyFdffSUEBgYKcrlc6Nq1q8Ft8RMnThT69etnUH7fvn1Cly5dBLlcLgQFBVX6S92YADD6WLt2rb7Mg9f68ccfCy1bthRsbGwEV1dXoU+fPsKOHTsavvI1FBUVJfj4+AgymUzw9fUVnn76aeHChQv69y3lM73fr7/+KgAQLl26VOE9c/5cddMVPPiYOHGiIAjiNADz5s0TvL29BYVCIfTt21c4d+6cwTH69eunL6+zefNmoU2bNoJMJhPatm3bKAJiVdeanJxc6d/hvXv36o/x4LXGxMQIAQEBglwuFzw8PIQhQ4YIhw8fbviLM6Kq6y0qKhKGDBkieHh4CDKZTAgICBAmTpwopKSkGBzDEj5bna+//lqwtbUVcnNzjR7DnD7b+iIRhPLRokRERESkxzFJREREREYwJBEREREZwZBEREREZARDEhEREZERDElERERERjAkERERERnBkERERERkBEMSEdEjkEgk2L59u6mrQUT1gCGJiMzWpEmTIJFIKjyGDRtm6qoRkQWwNnUFiIgexbBhw7B27VqDbQqFwkS1ISJLwpYkIjJrCoUC3t7eBg9XV1cAYldYbGwshg8fDltbWwQHB2Pz5s0G+587dw4DBw6Era0t3Nzc8OKLL6KgoMCgzJo1a9C+fXsoFAr4+PjglVdeMXg/KysLTz31FOzs7NCqVSv89NNP+vdycnLw3HPPwcPDA7a2tmjVqlWFUEdEjRNDEhFZtDlz5mDs2LE4e/Ysnn/+eTz77LO4ePEiAKCoqAjDhg2Dq6srTpw4gc2bN2P37t0GISg2NhYvv/wyXnzxRZw7dw4//fQTHnvsMYNzLFiwAM888wz+/PNPPPHEE3juuedw9+5d/fkTExPxyy+/4OLFi4iNjYW7u3vD/QEQUe2ZeoVdIqLamjhxoiCVSgV7e3uDx8KFCwVBEAQAwvTp0w32CQ8PF/7xj38IgiAIK1euFFxdXYWCggL9+zt27BCsrKyE9PR0QRAEwdfXV5g9e3aldQAgvP/++/rXBQUFgkQiEX755RdBEARh1KhRwuTJk+vmgomoQXFMEhGZtQEDBiA2NtZgW7NmzfTPe/XqZfBer169cObMGQDAxYsXERoaCnt7e/37vXv3hlarxaVLlyCRSHD79m0MGjSoyjp06tRJ/9ze3h6Ojo7IzMwEAPzjH//A2LFjcerUKQwZMgRjxoxBREREra6ViBoWQxIRmTV7e/sK3V8PI5FIAACCIOifGytja2tbrePJZLIK+2q1WgDA8OHDcePGDezYsQO7d+/GoEGD8PLLL+PTTz+tUZ2JqOFxTBIRWbSjR49WeN22bVsAQEhICM6cOYPCwkL9+3/88QesrKzQunVrODo6IigoCL///vsj1cHDwwOTJk3Cd999h2XLlmHlypWPdDwiahhsSSIis6ZSqZCenm6wzdraWj84evPmzejWrRv69OmDjRs34vjx41i9ejUA4LnnnsO8efMwceJEzJ8/H3fu3MGrr76K6OhoeHl5AQDmz5+P6dOnw9PTE8OHD0d+fj7++OMPvPrqq9Wq39y5cxEWFob27dtDpVLhf//7H9q1a1eHfwJEVF8YkojIrO3atQs+Pj4G29q0aYO//voLgHjn2aZNm/DPf/4T3t7e2LhxI0JCQgAAdnZ2+PXXX/Haa6+he/fusLOzw9ixY7F06VL9sSZOnIiSkhJ8/vnnePPNN+Hu7o5x48ZVu35yuRyzZs3C9evXYWtri8jISGzatKkOrpyI6ptEEATB1JUgIqoPEokE27Ztw5gxY0xdFSIyQxyTRERERGQEQxIRERGRERyTREQWi6MJiOhRsCWJiIiIyAiGJCIiIiIjGJKIiIiIjGBIIiIiIjKCIYmIiIjICIYkIiIiIiMYkoiIiIiMYEgiIiIiMoIhiYiIiMiI/wcWa+UZ9UzfdAAAAABJRU5ErkJggg==", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -459,7 +471,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.15" + "version": "3.9.13" } }, "nbformat": 4, From d935049662a8ccca657645b1e02bfa9e0bb7f2ed Mon Sep 17 00:00:00 2001 From: Lola-jo <120191238+Lola-jo@users.noreply.github.com> Date: Thu, 7 Mar 2024 14:21:13 +0800 Subject: [PATCH 4/7] Update _toc.yml From c942ec6cbbdcaedf2de360666faf84e1df1c27f2 Mon Sep 17 00:00:00 2001 From: Lola-jo <120191238+Lola-jo@users.noreply.github.com> Date: Thu, 7 Mar 2024 14:22:07 +0800 Subject: [PATCH 5/7] Update environment.yml --- open-machine-learning-jupyter-book/environment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/open-machine-learning-jupyter-book/environment.yml b/open-machine-learning-jupyter-book/environment.yml index b86bda3fd..d3be367b8 100644 --- a/open-machine-learning-jupyter-book/environment.yml +++ b/open-machine-learning-jupyter-book/environment.yml @@ -49,4 +49,4 @@ dependencies: - git+https://github.com/innovationOUtside/ipython_magic_tikz.git - git+https://github.com/bonartm/sphinxcontrib-quizdown.git - tqdm - - fastai \ No newline at end of file + - fastai From 0fa86e34c504943c2552ad341fea072f7d2d85f5 Mon Sep 17 00:00:00 2001 From: Lola-jo <120191238+Lola-jo@users.noreply.github.com> Date: Thu, 7 Mar 2024 14:23:58 +0800 Subject: [PATCH 6/7] Update data-engineering.ipynb --- .../data-engineering.ipynb | 4403 ++--------------- 1 file changed, 506 insertions(+), 3897 deletions(-) diff --git a/open-machine-learning-jupyter-book/assignments/machine-learning-productionization/data-engineering.ipynb b/open-machine-learning-jupyter-book/assignments/machine-learning-productionization/data-engineering.ipynb index e910af9ec..ba5a478a8 100644 --- a/open-machine-learning-jupyter-book/assignments/machine-learning-productionization/data-engineering.ipynb +++ b/open-machine-learning-jupyter-book/assignments/machine-learning-productionization/data-engineering.ipynb @@ -1,3897 +1,506 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - machine-learning/open-machine-learning-jupyter-book/assignments/machine-learning-productionization/data-engineering.ipynb at main · ocademy-ai/machine-learning - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Skip to content - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Global navigation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Home - - - - - - - - - - - - - - - - - - Issues - - - - - - - - - - - - - - - - - - Pull requests - - - - - - - - - - - - - - - - - - Projects - - - - - - - - - - - - - - - - - - Discussions - - - - - - - - - - - - - - - - - - Codespaces - - - - - - - - - - - - - - - - - - - - Explore - - - - - - - - - - - - - - - - - - Marketplace - - - - - - - - - - - - - - - - - - - © 2024 GitHub, Inc. - - - About - Blog - Terms - Privacy - Security - Status - - - - - - - - - - - - - - - - - - - - - ocademy-ai - / - - - - - machine-learning - - - - - - - - - - - - Navigate back to - - - - - - - - - - - - - - - - - - - ocademy-ai - - - - - - - - - - - - machine-learning - - - - - - - - - - - - - - - - - - - - ocademy-ai - - - - / - - - - - - machine-learning - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Type / to search - - - - - - - - - - - - - - Command palette - - - - - - - - - Search code, repositories, users, issues, pull requests... - - - - - - - - Search - - - - - - - - - - - - - - - Clear - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Search syntax tips - - - Give feedback - - - - - - - - - - - - - - - - - - - Provide feedback - - - - - - - - - - - - We read every piece of feedback, and take your input very seriously. - - - Include my email address so I can be contacted - - - - - - - - - - - - - - Saved searches - - Use saved searches to filter your results more quickly - - - - - - - - - - - - - - - - - - - Name - - - - - - - - Query - - - - - To see all available qualifiers, see our documentation. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Create new... - - - - - - - - - - - - - - - - - - New repository - - - - - - - - - - - - - - - - Import repository - - - - - - - - - - - - - - - - - New codespace - - - - - - - - - - - - - - - - New gist - - - - - - - - - - - - - - - - - New organization - - - - - - - - - - - - - - - - - -Issues - - - - -Pull requests - - - - - - - - - - - Notifications - - - - - - - - - - - - - - - - - - - - Account menu - - - - - - - - WHQWHQWHQ - - - - - - - - - - - - - - -Create new... - - - - - - - - - - - - - - - - - - New repository - - - - - - - - - - - - - - - - Import repository - - - - - - - - - - - - - - - - - New codespace - - - - - - - - - - - - - - - - New gist - - - - - - - - - - - - - - - - - New organization - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Loading... - - - - - - - - - - - - - - - - - - - - - - Your profile - - - - - - - - - - - - - - - - - - - - - - - Loading... - - - - - - - - - - - - - - - - - - - - - - Your repositories - - - - - - - - - - - - - - - - - - Your projects - - - - - - - - - - - - - - - - - - - - - - - Loading... - - - - - - - - - - - - - - - - - - - - Your stars - - - - - - - - - - - - - - - - - - Your sponsors - - - - - - - - - - - - - - - - - - Your gists - - - - - - - - - - - - - - - - - - - - - - - - - Loading... - - - - - - - - - - - - - - - - - - - - - - - - - Loading... - - - - - - - - - - - - - - - - - - - - - - - - - Loading... - - - - - - - - - - - - - - - - - - - - Settings - - - - - - - - - - - - - - - - - - - - GitHub Docs - - - - - - - - - - - - - - - - - - GitHub Support - - - - - - - - - - - - - - - Sign out - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Code - - - - - - - - - - - - Issues - 110 - - - - - - - - - - - Pull requests - 5 - - - - - - - - - - - Discussions - - - - - - - - - - - - Actions - - - - - - - - - - - - Projects - 1 - - - - - - - - - - - Wiki - - - - - - - - - - - - Security - - - - - - - - - - - Insights - - - - - - - - - - - -Additional navigation options - - - - - - - - - - - - - - - - - - Code - - - - - - - - - - - - - - - Issues - - - - - - - - - - - - - - - Pull requests - - - - - - - - - - - - - - - Discussions - - - - - - - - - - - - - - - Actions - - - - - - - - - - - - - - - Projects - - - - - - - - - - - - - - - Wiki - - - - - - - - - - - - - - - Security - - - - - - - - - - - - - - - Insights - - - - - - - - - - - - - - - - - - - - - - You signed in with another tab or window. Reload to refresh your session. - You signed out in another tab or window. Reload to refresh your session. - You switched accounts on another tab or window. Reload to refresh your session. - - - - -Dismiss alert - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {{ message }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - / ... / - ocademy-ai / - machine-learning / - - - - - - - - - - - - - - - Clear Command Palette - - - - - - - - Tip: - Type # to search pull requests - - - Type ? for help and tips - - - - - - - Tip: - Type # to search issues - - - Type ? for help and tips - - - - - - - Tip: - Type # to search discussions - - - Type ? for help and tips - - - - - - - Tip: - Type ! to search projects - - - Type ? for help and tips - - - - - - - Tip: - Type @ to search teams - - - Type ? for help and tips - - - - - - - Tip: - Type @ to search people and organizations - - - Type ? for help and tips - - - - - - - Tip: - Type > to activate command mode - - - Type ? for help and tips - - - - - - - Tip: - Go to your accessibility settings to change your keyboard shortcuts - - - Type ? for help and tips - - - - - - - Tip: - Type author:@me to search your content - - - Type ? for help and tips - - - - - - - Tip: - Type is:pr to filter to pull requests - - - Type ? for help and tips - - - - - - - Tip: - Type is:issue to filter to issues - - - Type ? for help and tips - - - - - - - Tip: - Type is:project to filter to projects - - - Type ? for help and tips - - - - - - - Tip: - Type is:open to filter to open content - - - Type ? for help and tips - - - - - - - - - - - We’ve encountered an error and some results aren't available at this time. Type a new search or try again later. - - - - No results matched your search - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Search for issues and pull requests - - # - - - - Search for issues, pull requests, discussions, and projects - - # - - - - Search for organizations, repositories, and users - - @ - - - - Search for projects - - ! - - - - Search for files - - / - - - - Activate command mode - - > - - - - Search your issues, pull requests, and discussions - - # author:@me - - - - Search your issues, pull requests, and discussions - - # author:@me - - - - Filter to pull requests - - # is:pr - - - - Filter to issues - - # is:issue - - - - Filter to discussions - - # is:discussion - - - - Filter to projects - - # is:project - - - - Filter to open issues, pull requests, and discussions - - # is:open - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Open in github.dev - Open in a new github.dev tab - Open in codespace - - - - - - - - - - - - - - - FilesFiles maint.githubassignmentsawesomedrawiogenerative-aiimagesopen-machine-learning-jupyter-book_staticassetsassignmentsdata-sciencedeep-learningmachine-learning-productionizationcounterintuitive-challenges-in-ml-debugging.ipynbdata-engineering.ipynbdebugging-in-classification.ipynbdebugging-in-regression.ipynbml-advancedml-fundamentalsset-up-envproject-plan-template.ipynbdata-sciencedeep-learningmachine-learning-productionizationml-advancedml-fundamentalsprerequisitesslidesCNAMECONTRIBUTING.mdREADME.mdSTYLE_GUIDE.md_config.yml_toc.ymlbuild-force-all.shbuild-local.shbuild.shenvironment.ymlfavicon.icointro.mdlogo-long.pnglogo.pngpost-build.shreferences.bibtutorials.gitignoreCODE_OF_CONDUCT.mdCONTRIBUTING.mdISSUE_TEMPLATE.mdLICENSE-CODELICENSE-TEXTNOTATION.mdREADME.mdSECURITY.mdSTYLE_GUIDE.mdSUPPORT.mdTRANSLATIONS.mdpostBuildpull_request_template.mdrequirements.txtFiles main Blame Breadcrumbsmachine-learning/open-machine-learning-jupyter-book/assignments/machine-learning-productionization/data-engineering.ipynbBreadcrumbsmachine-learning/open-machine-learning-jupyter-book/assignments/machine-learning-productionization/data-engineering.ipynb Blame Latest commit HistoryHistory506 lines (506 loc) · 17.3 KBBreadcrumbsmachine-learning/open-machine-learning-jupyter-book/assignments/machine-learning-productionization/data-engineering.ipynbTopFile metadata and controlsPreviewCodeBlame506 lines (506 loc) · 17.3 KBRaw - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - You can’t perform that action at this time. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data engineering\n", + "\n", + "This assignment focuses on techniques for cleaning and transforming the data to handle challenges of missing, inaccurate, or incomplete data. Please refer to [Machine Learning productionization - Data engineering](#data-engineering) to learn more.\n", + "\n", + "Fill `____` pieces of the below implementation in order to pass the assertions.\n", + "\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exploring dataset\n", + "\n", + "> **Learning goal**: By the end of this subsection, you should be comfortable finding general information about the data stored in pandas DataFrames.\n", + "\n", + "In order to explore this functionality, we will import the modefined version of Python scikit-learn library's iconic dataset **Iris**." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from sklearn.datasets import load_iris\n", + "import math\n", + "\n", + "iris_df = pd.read_csv('../../assets/data/modefined_sklearn_iris_dataset.csv', index_col=0)\n", + "iris_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To start off, print the summary of a DataFrame." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "iris_df.____" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```{quizdown}\n", + "\n", + "## How many entries the Iris dataset has?\n", + "\n", + "> Please refer to the output of above cell. \n", + "\n", + "- [ ] 50\n", + "- [ ] 100\n", + "- [x] 150\n", + "- [ ] 200\n", + "\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, let's check the actual content of the `DataFrame`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# displying first 5 rows of our iris_df\n", + "iris_df____\n", + "\n", + "# in the first five rows, which one's spepal length is 5.0cm?\n", + "assert iris_df.iloc[____, 0] == 5.0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Conversely, we can check the last few rows of the DataFrame." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# displying last 5 rows of our `iris_df`.\n", + "iris_df.____\n", + "\n", + "# in the last five rows, which one's spepal width is 2.5cm?\n", + "assert iris_df.iloc[____, 1] == 2.5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Takeaway**: Even just by looking at the metadata about the information in a DataFrame or the first and last few values in one, you can get an immediate idea about the size, shape, and content of the data you are dealing with." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Dealing with missing data\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Missing data can cause inaccuracies as well as weak or biased results. Sometimes these can be resolved by a \"reload\" of the data, filling in the missing values with computation and code like Python, or simply just removing the value and corresponding data. There are numerous reasons for why data may be missing and the actions that are taken to resolve these missing values can be dependent on how and why they went missing in the first place.\n", + "\n", + "> **Learning goal**: By the end of this subsection, you should know how to replace or remove null values from DataFrames.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In pandas, the `isnull()` and `notnull()` methods are your primary methods for detecting null data. Both return Boolean masks over your data. We will be using numpy for NaN values:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "iris_isnull_df = iris_df.isnull()\n", + "\n", + "print(iris_isnull_df)\n", + "\n", + "# find one row with missing value\n", + "assert iris_isnull_df.iloc[____, ____] == True\n", + "assert math.isnan(iris_df.iloc[____, ____]) == True" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# get all the rows with missing data\n", + "iris_with_missing_value_df = iris_df____\n", + "\n", + "assert iris_with_missing_value_df.shape[0] == 16" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Dropping null values**: Beyond identifying missing values, pandas provides a convenient means `dropna` to remove null values from Series and DataFrames. (Particularly on large data sets, it is often more advisable to simply remove missing [NA] values from your analysis than deal with them in other ways.) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# remove all the rows with missing values\n", + "iris_with_dropna_on_row_df = iris_df.____\n", + "\n", + "assert iris_with_dropna_on_row_df.shape[0] == 134" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# remove all the columns with missing values\n", + "iris_with_dropna_on_column_df = iris_df.____\n", + "\n", + "assert iris_with_dropna_on_column_df.columns.shape[0] == 0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# remove all the rows with 2 missing values\n", + "iris_with_dropna_2_values_on_rows_df = iris_df.____\n", + "\n", + "assert iris_with_dropna_2_values_on_rows_df.shape[0] == 144\n", + "\n", + "# remove all the rows with 1 missing values\n", + "iris_with_dropna_1_values_on_rows_df = iris_df.____\n", + "\n", + "assert iris_with_dropna_1_values_on_rows_df.shape[0] == 147" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Filling null values**: Depending on your dataset, it can sometimes make more sense to fill null values with valid ones rather than drop them. You could use `isnull` to do this in place, but that can be laborious, particularly if you have a lot of values to fill. Because this is such a common task in data science, pandas provides `fillna`, which returns a copy of the Series or DataFrame with the missing values replaced with one of your choosing. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# fll all the missing values with 0\n", + "iris_with_fillna_df = iris_df.____\n", + "\n", + "# get all the rows with missing data\n", + "iris_with_missing_value_after_fillna_df = iris_with_fillna_df____\n", + "\n", + "assert iris_with_missing_value_after_fillna_df.shape[0] == 0\n", + "assert iris_with_fillna_df.iloc[____, 3] == -1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# forward-fill null values, which is to use the last valid value to fill a null:\n", + "iris_with_fillna_forward_df = iris_df.____\n", + "\n", + "# get all the rows with missing data\n", + "iris_with_missing_value_after_fillna_forward_df = iris_with_fillna_forward_df____\n", + "\n", + "assert iris_with_missing_value_after_fillna_forward_df.shape[0] == 0\n", + "assert float(iris_with_fillna_forward_df.iloc[3, 3]) == 0.2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# back-fill null values, which is to use the next valid value to fill a null:\n", + "iris_with_fillna_back_df = iris_df.____\n", + "\n", + "# get all the rows with missing data\n", + "iris_with_missing_value_after_fillna_back_df = iris_with_fillna_back_df____\n", + "\n", + "assert iris_with_missing_value_after_fillna_back_df.shape[0] == 0\n", + "assert float(iris_with_fillna_back_df.iloc[3, 3]) == 0.1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Removing duplicate data\n", + "\n", + "Data that has more than one occurrence can produce inaccurate results and usually should be removed. This can be a common occurrence when joining two or more datasets together. However, there are instances where duplication in joined datasets contain pieces that can provide additional information and may need to be preserved.\n", + "\n", + "> **Learning goal**: By the end of this subsection, you should be comfortable identifying and removing duplicate values from DataFrames.\n", + "\n", + "In addition to missing data, you will often encounter duplicated data in real-world datasets. Fortunately, pandas provides an easy means of detecting and removing duplicate entries." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Identifying duplicates**: You can easily spot duplicate values using the `duplicated` method in pandas, which returns a Boolean mask indicating whether an entry in a DataFrame is a duplicate of an earlier one. Let's create another example DataFrame to see this in action." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "iris_isduplicated_df = iris_df.____\n", + "\n", + "print(iris_isduplicated_df)\n", + "\n", + "# find one row with duplicated value\n", + "assert iris_isduplicated_df.iloc[____, ____] == True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Dropping duplicates**: `drop_duplicates` simply returns a copy of the data for which all of the duplicated values are False:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# remove all the rows with duplicated values\n", + "iris_with_drop_duplicates_on_df = iris_df.drop_duplicates()\n", + "\n", + "assert iris_with_drop_duplicates_on_df.shape[0] == 143" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Both `duplicated` and `drop_duplicates` default to consider all columns but you can specify that they examine only a subset of columns in your DataFrame:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# remove all the rows with duplicated values on column 'petal width (cm)'\n", + "iris_with_drop_duplicates_on_column_df = iris_df.____\n", + "\n", + "assert iris_with_drop_duplicates_on_column_df.shape[0] == 27" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Handle inconsistent data\n", + "\n", + "Depending on the source, data can have inconsistencies in how it’s presented. This can cause problems in searching for and representing the value, where it’s seen within the dataset but is not properly represented in visualizations or query results. Common formatting problems involve resolving whitespace, dates, and data types. Resolving formatting issues is typically up to the people who are using the data. For example, standards on how dates and numbers are presented can differ by country.\n", + "\n", + "> **Learning goal**: By the end of this subsection, you should know how to handle the inconsistent data format in the DataFrame." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's cleaning up the **4th** column `petal width (cm)` to make sure there's no data entry inconsistencies in it. Firstly, we will use a convenient method `unique` from pandas to check the unique values of this column\n", + "\n", + "In pandas, the `unique` method is a convenient way to unique values based on a hash table:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "column_to_format = ____\n", + "column_to_format_unique = column_to_format.____\n", + "\n", + "print(column_to_format_unique)\n", + "\n", + "# find one row with duplicated value\n", + "assert column_to_format_unique.shape[0] == 27" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Regardless the `nan` value, you may find the numeric valus are in different precision. More specifically, `1.` or `1.5012` are not in the same precision as other numbers. We want to append tailing `0` to numbers like `1.`, and round numbers like `1.5012` to `1.5`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# firstly, let's apply `round`` to the values to make the precision all as .1f\n", + "formatted_column = column_to_format.____\n", + "\n", + "print(formatted_column.unique())\n", + "\n", + "assert formatted_column.unique().shape[0] == 23" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# now, let's add tailing 0 if needed to make numbers like 1. to be 1.0. \n", + "# You may need to filter the nan value while processing.\n", + "formatted_column = formatted_column.____\n", + "\n", + "print(formatted_column.unique())\n", + "\n", + "assert formatted_column.unique().shape[0] == 23" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## At last\n", + "\n", + "Let's apply all the methods above to make the data to be clean." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# remove all rows with missing values\n", + "no_missing_data_df = iris_df.____\n", + "\n", + "# remove all rows with duplicated values\n", + "no_missing_dup_data_df = no_missing_data_df.____\n", + "\n", + "# apply the precision .1f to all the numbers\n", + "cleand_df = no_missing_dup_data_df.____\n", + "\n", + "assert no_missing_data_df.shape[0] == 134\n", + "assert no_missing_dup_data_df.shape[0] == 129\n", + "assert cleand_df[cleand_df.columns[3]].unique().shape[0] == 22" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Also, you could refer to below for more about how to handle data quality.\n", + "\n", + "- missing data - [pandas - Working with missing data](https://pandas.pydata.org/docs/user_guide/missing_data.html)\n", + "- duplicate data - [pandas - Duplicate Labels](https://pandas.pydata.org/docs/user_guide/duplicates.html)\n", + "- outlier\n", + " - [Ways to Detect and Remove the Outliers](https://towardsdatascience.com/ways-to-detect-and-remove-the-outliers-404d16608dba)\n", + " - [Outlier!!! The Silent Killer](https://www.kaggle.com/code/nareshbhat/outlier-the-silent-killer)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Acknowledgments\n", + "\n", + "Thanks to Microsoft for creating the open source course [Data Science for Beginners](https://github.com/microsoft/Data-Science-For-Beginners). It contributes some of the content in this chapter." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.13 64-bit", + "language": "python", + "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.9.13 (main, May 24 2022, 21:28:31) \n[Clang 13.1.6 (clang-1316.0.21.2)]" + }, + "vscode": { + "interpreter": { + "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 3060f9c930ffc68dea454530e1fbda14d87f4f3e Mon Sep 17 00:00:00 2001 From: Lola-jo <120191238+Lola-jo@users.noreply.github.com> Date: Thu, 7 Mar 2024 14:24:57 +0800 Subject: [PATCH 7/7] Update data-engineering.ipynb
© 2024 GitHub, Inc.
We read every piece of feedback, and take your input very seriously.
- To see all available qualifiers, see our documentation. -