diff --git a/6307_Trofimov/idz/IDZ.ipynb b/6307_Trofimov/idz/IDZ.ipynb new file mode 100644 index 0000000..b155981 --- /dev/null +++ b/6307_Trofimov/idz/IDZ.ipynb @@ -0,0 +1,1873 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 264, + "metadata": {}, + "outputs": [], + "source": [ + "from collections import Counter\n", + "from math import modf\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import seaborn as sns\n", + "\n", + "from sklearn.preprocessing import OneHotEncoder, LabelEncoder\n", + "from sklearn.model_selection import cross_val_score, train_test_split\n", + "from sklearn.metrics import accuracy_score, precision_recall_fscore_support, confusion_matrix\n", + "from sklearn.metrics import max_error, mean_absolute_error, mean_squared_error" + ] + }, + { + "cell_type": "code", + "execution_count": 224, + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.read_csv(\"idz_data/flavors_of_cacao.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 225, + "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", + "
Company \\n(Maker-if known)Specific Bean Origin\\nor Bar NameREFReview\\nDateCocoa\\nPercentCompany\\nLocationRatingBean\\nTypeBroad Bean\\nOrigin
0A. MorinAgua Grande1876201663%France3.75Sao Tome
1A. MorinKpime1676201570%France2.75Togo
2A. MorinAtsane1676201570%France3.00Togo
3A. MorinAkata1680201570%France3.50Togo
4A. MorinQuilla1704201570%France3.50Peru
\n", + "
" + ], + "text/plain": [ + " Company \\n(Maker-if known) Specific Bean Origin\\nor Bar Name REF \\\n", + "0 A. Morin Agua Grande 1876 \n", + "1 A. Morin Kpime 1676 \n", + "2 A. Morin Atsane 1676 \n", + "3 A. Morin Akata 1680 \n", + "4 A. Morin Quilla 1704 \n", + "\n", + " Review\\nDate Cocoa\\nPercent Company\\nLocation Rating Bean\\nType \\\n", + "0 2016 63% France 3.75   \n", + "1 2015 70% France 2.75   \n", + "2 2015 70% France 3.00   \n", + "3 2015 70% France 3.50   \n", + "4 2015 70% France 3.50   \n", + "\n", + " Broad Bean\\nOrigin \n", + "0 Sao Tome \n", + "1 Togo \n", + "2 Togo \n", + "3 Togo \n", + "4 Peru " + ] + }, + "execution_count": 225, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 229, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "maker object\n", + "bar_name object\n", + "ref int64\n", + "review_date int64\n", + "cocoa_percent object\n", + "location object\n", + "rating float64\n", + "bean_type object\n", + "broad_bean_origin object\n", + "percent float64\n", + "dtype: object" + ] + }, + "execution_count": 229, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.dtypes" + ] + }, + { + "cell_type": "code", + "execution_count": 227, + "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", + "
makerbar_namerefreview_datecocoa_percentlocationratingbean_typebroad_bean_origin
0A. MorinAgua Grande1876201663%France3.75Sao Tome
1A. MorinKpime1676201570%France2.75Togo
2A. MorinAtsane1676201570%France3.00Togo
3A. MorinAkata1680201570%France3.50Togo
4A. MorinQuilla1704201570%France3.50Peru
\n", + "
" + ], + "text/plain": [ + " maker bar_name ref review_date cocoa_percent location rating \\\n", + "0 A. Morin Agua Grande 1876 2016 63% France 3.75 \n", + "1 A. Morin Kpime 1676 2015 70% France 2.75 \n", + "2 A. Morin Atsane 1676 2015 70% France 3.00 \n", + "3 A. Morin Akata 1680 2015 70% France 3.50 \n", + "4 A. Morin Quilla 1704 2015 70% France 3.50 \n", + "\n", + " bean_type broad_bean_origin \n", + "0   Sao Tome \n", + "1   Togo \n", + "2   Togo \n", + "3   Togo \n", + "4   Peru " + ] + }, + "execution_count": 227, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_columns = [\n", + " \"maker\", \n", + " \"bar_name\", \n", + " \"ref\", \n", + " \"review_date\", \n", + " \"cocoa_percent\", \n", + " \"location\",\n", + " \"rating\",\n", + " \"bean_type\",\n", + " \"broad_bean_origin\"\n", + "]\n", + "\n", + "data.columns = new_columns\n", + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 228, + "metadata": {}, + "outputs": [], + "source": [ + "data[\"percent\"] = data.cocoa_percent.apply(lambda x: float(x.split(\"%\")[0])/100)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "sns.countplot(data.rating)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "rating_cocoa_percent = data.groupby(['rating']).mean()\n", + "\n", + "plt.figure(figsize=(16, 10))\n", + "plt.plot(rating_cocoa_percent['percent'])\n", + "\n", + "plt.xticks(np.arange(1, 5.1, 0.25))\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "data.bean_type = data.bean_type.fillna('\\xa0')\n", + "data.broad_bean_origin = data.broad_bean_origin.fillna('\\xa0')" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "maker object\n", + "bar_name object\n", + "ref int64\n", + "review_date int64\n", + "cocoa_percent object\n", + "location object\n", + "rating float64\n", + "bean_type object\n", + "broad_bean_origin object\n", + "percent float64\n", + "dtype: object" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.dtypes" + ] + }, + { + "cell_type": "code", + "execution_count": 257, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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cky3fVx+/H0/m28m+c1u+5g1dQQAADYNEw1G304yv6puS7Jtko+P3dlaW5HkjzJ6idutSW5qrV3aWrs1o5e5LU3y6STXdv2fTPKOJFd0D1/4zgRquCHJFRkNHn/WWvu31tqXMnq52nVVdXuSC5P8VJIrM/rAiNuS/Fl3zLr4wyRv7c7z20lOnsAxpyR5d1XdkGQoiacmAADAJq7+66oy1oeqmprkB621VlXHJDm2tXbkCz3vlkMz2tD8M194gZPAspF5gy4BAIAXqapa0j0c7hnc17L+7Zfko1VVSb6b5MQB1wMAADyPTSoYVdVb8+OXq13bWvv9DTzuB5K8eVzzwtbah9f2XK21ryfZe70UBgAAbBSbVDBqrX0myWcGMO6Hk6x1CAIAACaHiT58AQAAYNISjAAAgN4TjAAAgN4TjAAAgN4TjAAAgN4TjAAAgN4TjAAAgN4TjAAAgN4TjAAAgN4TjAAAgN4TjAAAgN4TjAAAgN4TjAAAgN4TjAAAgN6bMugCmJg9d9wmi0fmDboMAACYlKwYAQAAvScYAQAAvScYAQAAvScYAQAAvScYAQAAvScYAQAAvScYAQAAvScYAQAAvScYAQAAvScYAQAAvScYAQAAvTdl0AUwMbff/2iGT71io423bGTeRhsLAAAGzYoRAADQe4IRE7Jq1arss88+Ofzww5MkCxcuzKxZs7LZZptl8eLFA64OAABeGMGICTnrrLMyc+bM1a9nz56diy66KAceeOAAqwIAgPVDMOJ5LV++PFdccUVOOumk1W0zZ87MbrvtNsCqAABg/RGMeF6nnHJKzjjjjGy2mekCAMDk5F+6rNHll1+eadOmZb/99ht0KQAAsMEIRqzRtddem8suuyzDw8M55phjctVVV+X4448fdFkAALBeCUas0emnn57ly5dn2bJlueCCC3LQQQflvPPOG3RZAACwXglGrJOLL74406dPz3XXXZd58+blsMMOG3RJAACwzqq1NugamIAth2a0oflnbrTxlo3M22hjAQDAxlJVS1prc8e3WzECAAB6TzACAAB6TzACAAB6TzACAAB6TzACAAB6TzACAAB6TzACAAB6TzACAAB6TzACAAB6TzACAAB6TzACAAB670UfjKpquKruGMCYv7UxxwQAADacF30wGpDhJIIRAABMEpMlGE2pqgVVdVtVXVhVU6tqv6r6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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "s = (data.dtypes == 'object')\n", + "objectives = list(s[s].index)\n", + "\n", + "obj_cols_nunique = []\n", + "for col in objectives:\n", + " obj_cols_nunique.append(data[col].nunique())\n", + "\n", + " \n", + "fig, ax = plt.subplots(figsize=(13, 7))\n", + "\n", + "ax.barh(objectives, obj_cols_nunique)\n", + "# ax.figure()\n", + "for i, v in enumerate(obj_cols_nunique):\n", + " ax.text(v+3, i+.25, str(v))\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "s = (data.dtypes == 'object')\n", + "object_columns = list(s[s].index)\n", + "object_columns.remove(\"bar_name\")\n", + "object_columns.remove(\"cocoa_percent\")\n", + "# object_columns.pop(object_columns.index(\"bean_type\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "# ONE HOT ENCODING and LABEL ENCODER\n", + "\n", + "\n", + "encoded_data = data.copy()\n", + "\n", + "label_encoder = LabelEncoder()\n", + "OH_encoder = OneHotEncoder(sparse=False)\n", + "\n", + "encoded_data[\"bar_name\"] = label_encoder.fit_transform(encoded_data[\"bar_name\"])\n", + "\n", + "\n", + "data_encoded_matrix = pd.DataFrame(\n", + " OH_encoder.fit_transform(encoded_data[object_columns]),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
bar_namerefreview_datecocoa_percentratingpercent0123...607608609610611612613614615616
0141876201663%3.750.631.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
14921676201570%2.750.701.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
2671676201570%3.000.701.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
3151680201570%3.500.701.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
48091704201570%3.500.701.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
..................................................................
1790754647201170%3.750.700.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
1791258749201165%3.000.650.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
1792483749201165%3.500.650.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
1793483781201162%3.250.620.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
1794137486201065%3.000.650.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
\n", + "

1795 rows × 623 columns

\n", + "
" + ], + "text/plain": [ + " bar_name ref review_date cocoa_percent rating percent 0 1 \\\n", + "0 14 1876 2016 63% 3.75 0.63 1.0 0.0 \n", + "1 492 1676 2015 70% 2.75 0.70 1.0 0.0 \n", + "2 67 1676 2015 70% 3.00 0.70 1.0 0.0 \n", + "3 15 1680 2015 70% 3.50 0.70 1.0 0.0 \n", + "4 809 1704 2015 70% 3.50 0.70 1.0 0.0 \n", + "... ... ... ... ... ... ... ... ... \n", + "1790 754 647 2011 70% 3.75 0.70 0.0 0.0 \n", + "1791 258 749 2011 65% 3.00 0.65 0.0 0.0 \n", + "1792 483 749 2011 65% 3.50 0.65 0.0 0.0 \n", + "1793 483 781 2011 62% 3.25 0.62 0.0 0.0 \n", + "1794 137 486 2010 65% 3.00 0.65 0.0 0.0 \n", + "\n", + " 2 3 ... 607 608 609 610 611 612 613 614 615 616 \n", + "0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "1 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "3 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "4 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "... ... ... ... ... ... ... ... ... ... ... ... ... ... \n", + "1790 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "1791 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "1792 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "1793 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "1794 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "\n", + "[1795 rows x 623 columns]" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_numeric = encoded_data.drop(object_columns, axis=1)\n", + "\n", + "encoded_data = pd.concat([data_numeric, data_encoded_matrix], axis=1)\n", + "\n", + "encoded_data" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
bar_nameratingpercent0123456...607608609610611612613614615616
0143.750.631.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
14922.750.701.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
2673.000.701.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
3153.500.701.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
48093.500.701.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
..................................................................
17907543.750.700.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
17912583.000.650.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
17924833.500.650.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
17934833.250.620.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
17941373.000.650.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
\n", + "

1795 rows × 620 columns

\n", + "
" + ], + "text/plain": [ + " bar_name rating percent 0 1 2 3 4 5 6 ... 607 \\\n", + "0 14 3.75 0.63 1.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", + "1 492 2.75 0.70 1.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", + "2 67 3.00 0.70 1.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", + "3 15 3.50 0.70 1.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", + "4 809 3.50 0.70 1.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", + "... ... ... ... ... ... ... ... ... ... ... ... ... \n", + "1790 754 3.75 0.70 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", + "1791 258 3.00 0.65 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", + "1792 483 3.50 0.65 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", + "1793 483 3.25 0.62 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", + "1794 137 3.00 0.65 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 \n", + "\n", + " 608 609 610 611 612 613 614 615 616 \n", + "0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "... ... ... ... ... ... ... ... ... ... \n", + "1790 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "1791 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "1792 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "1793 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "1794 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "\n", + "[1795 rows x 620 columns]" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# drop REF column (and review_date)\n", + "\n", + "encoded_data = encoded_data.drop(columns=[\"ref\", \"review_date\", \"cocoa_percent\"])\n", + "encoded_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Learning" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor\n", + "from sklearn.model_selection import GridSearchCV" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "X, Y = encoded_data.drop(columns=[\"rating\"]), encoded_data[\"rating\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "def round_rating_75(rating):\n", + " if rating < 1.75:\n", + " return 1\n", + " elif rating < 2.75:\n", + " return 2\n", + " elif rating < 3.75:\n", + " return 3\n", + " elif rating < 4.75:\n", + " return 4\n", + " return 5\n", + "\n", + "\n", + "def round_rating(rating):\n", + " if rating < 2:\n", + " return 1\n", + " if rating < 3:\n", + " return 2\n", + " if rating < 4:\n", + " return 3\n", + " if rating < 5:\n", + " return 4\n", + " return 5\n", + "\n", + "Y_rounded = Y.apply(round_rating_75)\n", + "\n", + "def round_rating_regression(rating):\n", + " remainder, integer = modf(rating)\n", + " \n", + " if integer < 5:\n", + " if remainder < 0.125:\n", + " return int(integer)\n", + " if remainder <= 0.25:\n", + " value = f\"{int(integer)}.25\"\n", + " return float(value)\n", + " if remainder <= 0.5:\n", + " value = f\"{int(integer)}.5\"\n", + " return float(value)\n", + " if remainder <= 0.75:\n", + " value = f\"{int(integer)}.75\"\n", + " return float(value)\n", + " return 5\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 159, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "sns.countplot(Y_rounded)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "x_train, x_test, y_train, y_test = train_test_split(\n", + " X, \n", + " Y_rounded, \n", + " test_size=0.3,\n", + " random_state=1\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\kittr\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:670: UserWarning: The least populated class in y has only 2 members, which is less than n_splits=5.\n", + " warnings.warn((\"The least populated class in y has only %d\"\n" + ] + }, + { + "data": { + "text/plain": [ + "GridSearchCV(cv=5, estimator=RandomForestClassifier(),\n", + " param_grid={'max_depth': [3, 4, 5, 6, 7, 8, 9, 10, 11],\n", + " 'min_samples_leaf': [1, 2, 3, 4, 5],\n", + " 'n_estimators': [2, 14, 26, 38, 50, 62, 74, 86, 98,\n", + " 110, 122, 134, 146]})" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "forest_ = RandomForestClassifier()\n", + "\n", + "parameters = {\n", + " \"n_estimators\": [*range(2, 150, 12)],\n", + " \"max_depth\": [*range(3, 12)],\n", + " \"min_samples_leaf\": [1, 2, 3, 4, 5],\n", + "# \"n_jobs\": [-1],\n", + " \n", + " \n", + "}\n", + "\n", + "\n", + "grid = GridSearchCV(\n", + " forest_,\n", + " parameters,\n", + " cv=5\n", + ")\n", + "\n", + "grid.fit(x_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'max_depth': 8, 'min_samples_leaf': 5, 'n_estimators': 2}\n" + ] + }, + { + "data": { + "text/plain": [ + "0.7217068645640075" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "estimator_75 = grid.best_estimator_\n", + "print(grid.best_params_)\n", + "estimator_75.score(x_test, y_test) # 0.7217068645640075\n", + "# {'max_depth': 11, 'min_samples_leaf': 3, 'n_estimators': 2}" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'max_depth': 3, 'min_samples_leaf': 3, 'n_estimators': 2}\n" + ] + }, + { + "data": { + "text/plain": [ + "0.7087198515769945" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# estimator = grid.best_estimator_\n", + "# print(grid.best_params_)\n", + "# estimator.score(x_test, y_test) # 0.7087198515769945\n", + "# {'max_depth': 3, 'min_samples_leaf': 3, 'n_estimators': 2}" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.7235621521335807" + ] + }, + "execution_count": 112, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "random_forest_classifier = RandomForestClassifier(\n", + " n_estimators=2,\n", + " min_samples_leaf=3,\n", + " max_depth=11,\n", + " n_jobs=-1,\n", + " random_state=12\n", + ")\n", + "\n", + "random_forest_classifier.fit(x_train, y_train)\n", + "\n", + "random_forest_classifier.score(x_test, y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": {}, + "outputs": [], + "source": [ + "predictions = random_forest_classifier.predict(x_test)\n", + "\n", + "accuracy = accuracy_score(y_test, predictions)\n", + "precision, recall, f1, _ = precision_recall_fscore_support(\n", + " y_test, \n", + " predictions, \n", + " average=\"weighted\",\n", + " zero_division=0\n", + ")\n", + "\n", + "metrics_df = pd.DataFrame(\n", + " {\n", + " \"accuracy\": [accuracy],\n", + " \"precision\": [precision],\n", + " \"recall\": [recall],\n", + " \"f_measure\": [f1]\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 156, + "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", + "
accuracyprecisionrecallf_measure
00.7235620.6328980.7235620.621553
\n", + "
" + ], + "text/plain": [ + " accuracy precision recall f_measure\n", + "0 0.723562 0.632898 0.723562 0.621553" + ] + }, + "execution_count": 156, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "metrics_df" + ] + }, + { + "cell_type": "code", + "execution_count": 158, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Prediction classes: Counter({3: 529, 4: 8, 2: 2}) \n", + "Original classes: Counter({3: 388, 4: 94, 2: 55, 1: 2})\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist([predictions, y_test], label=[\"predictions\", \"origin\"])\n", + "\n", + "plt.legend()\n", + "plt.xticks(np.arange(1, 5, 1))\n", + "\n", + "print(f\"Prediction classes: {Counter(predictions)} \\nOriginal classes: {Counter(y_test)}\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 191, + "metadata": {}, + "outputs": [], + "source": [ + "conf_mtrx = confusion_matrix(y_test, predictions)\n", + "tp = np.diag(conf_mtrx)\n", + "fn = conf_mtrx.sum(axis=1) - np.diag(conf_mtrx)\n", + "fp = conf_mtrx.sum(axis=0) - np.diag(conf_mtrx)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 192, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0, 0, 385, 5], dtype=int64)" + ] + }, + "execution_count": 192, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tp" + ] + }, + { + "cell_type": "code", + "execution_count": 193, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0, 2, 144, 3], dtype=int64)" + ] + }, + "execution_count": 193, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fp" + ] + }, + { + "cell_type": "code", + "execution_count": 194, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 2, 55, 3, 89], dtype=int64)" + ] + }, + "execution_count": 194, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fn" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 221, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "\n", + "ax.bar(np.arange(1, 5), tp, width=0.3, label=\"TP\")\n", + "ax.bar(np.arange(1, 5)-0.2, fp, width=0.3, label=\"FP\")\n", + "ax.bar(np.arange(1, 5)+0.2, fn, width=0.3, label=\"FN\")\n", + "\n", + "plt.legend()\n", + "plt.xticks(np.arange(1, 5))\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x_train, x_test, y_train, y_test = train_test_split(\n", + " X, \n", + " Y, \n", + " test_size=0.3,\n", + " random_state=1\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "forest_ = RandomForestRegressor()\n", + "\n", + "parameters = {\n", + " \"n_estimators\": [*range(2, 150, 12)],\n", + " \"max_depth\": [*range(3, 12)],\n", + " \"min_samples_leaf\": [1, 2, 3, 4, 5],\n", + " \"n_jobs\": [-1],\n", + " \n", + " \n", + "}\n", + "\n", + "\n", + "grid = GridSearchCV(\n", + " forest_,\n", + " parameters,\n", + " cv=5\n", + ")\n", + "\n", + "grid.fit(x_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "random_forest_regressor = RandomForestRegressor(\n", + " n_estimators=62,\n", + " min_samples_leaf=2,\n", + " max_depth=11,\n", + " n_jobs=-1,\n", + " random_state=12\n", + ")\n", + "\n", + "random_forest_regressor.fit(x_train, y_train)\n", + "\n", + "random_forest_regressor.score(x_test, y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "predictions = random_forest_regressor.predict(x_test)\n", + "\n", + "predictions = list(map(round_rating_regression, predictions))\n", + "\n", + "metrics_df = pd.DataFrame(\n", + " {\n", + " \"mae\": [mean_absolute_error(y_test, predictions)],\n", + " \"mse\": [mean_squared_error(y_test, predictions)],\n", + " \"max_error\": [max_error(y_test, predictions)],\n", + " }\n", + ")\n", + "\n", + "metrics_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/6307_Trofimov/idz/IDZ.pdf b/6307_Trofimov/idz/IDZ.pdf new file mode 100644 index 0000000..7d2eff5 Binary files /dev/null and b/6307_Trofimov/idz/IDZ.pdf differ