diff --git a/Solutions.ipynb b/Solutions.ipynb
index 4c0e1c9..c3b01ba 100644
--- a/Solutions.ipynb
+++ b/Solutions.ipynb
@@ -16,6 +16,443 @@
"For this lab, we will be using the same dataset we used in the previous labs. We recommend using the same notebook since you will be reusing the same variables you previous created and used in labs."
]
},
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "68d5e0bc",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.neighbors import KNeighborsRegressor\n",
+ "from sklearn.preprocessing import StandardScaler\n",
+ "from sklearn.neural_network import MLPRegressor\n",
+ "from sklearn.datasets import make_regression\n",
+ "from sklearn.linear_model import LinearRegression\n",
+ "from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error\n",
+ "\n",
+ "import warnings\n",
+ "warnings.filterwarnings('ignore')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "id": "1be0d8bf",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "data = pd.read_csv(r'C:\\Users\\claud\\lab-cleaning-numerical-data\\files_for_lab\\we_fn_use_c_marketing_customer_value_analysis.csv')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "id": "b82b3e7f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Index(['customer', 'state', 'customer_lifetime_value', 'response', 'coverage',\n",
+ " 'education', 'effective_to_date', 'employmentstatus', 'gender',\n",
+ " 'income', 'location_code', 'marital_status', 'monthly_premium_auto',\n",
+ " 'months_since_last_claim', 'months_since_policy_inception',\n",
+ " 'number_of_open_complaints', 'number_of_policies', 'policy_type',\n",
+ " 'policy', 'renew_offer_type', 'sales_channel', 'total_claim_amount',\n",
+ " 'vehicle_class', 'vehicle_size'],\n",
+ " dtype='object')"
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data.columns = [x.lower().replace(\" \", \"_\") for x in data.columns]\n",
+ "data.columns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "5128b3f3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "data = data.set_index('customer')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "0bdfa37d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "data['effective_to_date'] = pd.to_datetime(data['effective_to_date'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "30349842",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "data['day'] = data['effective_to_date'].dt.day\n",
+ "data['week'] = data['effective_to_date'].dt.week\n",
+ "data['month'] = data['effective_to_date'].dt.month"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "05dd9182",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "data['day'] = pd.to_numeric(data['day'], errors='coerce')\n",
+ "data['week'] = pd.to_numeric(data['week'], errors='coerce')\n",
+ "data['month'] = pd.to_numeric(data['month'], errors='coerce')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "4de5c7df",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " state | \n",
+ " customer_lifetime_value | \n",
+ " response | \n",
+ " coverage | \n",
+ " education | \n",
+ " employmentstatus | \n",
+ " gender | \n",
+ " income | \n",
+ " location_code | \n",
+ " marital_status | \n",
+ " ... | \n",
+ " policy_type | \n",
+ " policy | \n",
+ " renew_offer_type | \n",
+ " sales_channel | \n",
+ " total_claim_amount | \n",
+ " vehicle_class | \n",
+ " vehicle_size | \n",
+ " day | \n",
+ " week | \n",
+ " month | \n",
+ "
\n",
+ " \n",
+ " | customer | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | BU79786 | \n",
+ " Washington | \n",
+ " 2763.519279 | \n",
+ " No | \n",
+ " Basic | \n",
+ " Bachelor | \n",
+ " Employed | \n",
+ " F | \n",
+ " 56274 | \n",
+ " Suburban | \n",
+ " Married | \n",
+ " ... | \n",
+ " Corporate Auto | \n",
+ " Corporate L3 | \n",
+ " Offer1 | \n",
+ " Agent | \n",
+ " 384.811147 | \n",
+ " Two-Door Car | \n",
+ " Medsize | \n",
+ " 24 | \n",
+ " 8 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | QZ44356 | \n",
+ " Arizona | \n",
+ " 6979.535903 | \n",
+ " No | \n",
+ " Extended | \n",
+ " Bachelor | \n",
+ " Unemployed | \n",
+ " F | \n",
+ " 0 | \n",
+ " Suburban | \n",
+ " Single | \n",
+ " ... | \n",
+ " Personal Auto | \n",
+ " Personal L3 | \n",
+ " Offer3 | \n",
+ " Agent | \n",
+ " 1131.464935 | \n",
+ " Four-Door Car | \n",
+ " Medsize | \n",
+ " 31 | \n",
+ " 5 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | AI49188 | \n",
+ " Nevada | \n",
+ " 12887.431650 | \n",
+ " No | \n",
+ " Premium | \n",
+ " Bachelor | \n",
+ " Employed | \n",
+ " F | \n",
+ " 48767 | \n",
+ " Suburban | \n",
+ " Married | \n",
+ " ... | \n",
+ " Personal Auto | \n",
+ " Personal L3 | \n",
+ " Offer1 | \n",
+ " Agent | \n",
+ " 566.472247 | \n",
+ " Two-Door Car | \n",
+ " Medsize | \n",
+ " 19 | \n",
+ " 7 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | WW63253 | \n",
+ " California | \n",
+ " 7645.861827 | \n",
+ " No | \n",
+ " Basic | \n",
+ " Bachelor | \n",
+ " Unemployed | \n",
+ " M | \n",
+ " 0 | \n",
+ " Suburban | \n",
+ " Married | \n",
+ " ... | \n",
+ " Corporate Auto | \n",
+ " Corporate L2 | \n",
+ " Offer1 | \n",
+ " Call Center | \n",
+ " 529.881344 | \n",
+ " SUV | \n",
+ " Medsize | \n",
+ " 20 | \n",
+ " 3 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | HB64268 | \n",
+ " Washington | \n",
+ " 2813.692575 | \n",
+ " No | \n",
+ " Basic | \n",
+ " Bachelor | \n",
+ " Employed | \n",
+ " M | \n",
+ " 43836 | \n",
+ " Rural | \n",
+ " Single | \n",
+ " ... | \n",
+ " Personal Auto | \n",
+ " Personal L1 | \n",
+ " Offer1 | \n",
+ " Agent | \n",
+ " 138.130879 | \n",
+ " Four-Door Car | \n",
+ " Medsize | \n",
+ " 3 | \n",
+ " 5 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 25 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " state customer_lifetime_value response coverage education \\\n",
+ "customer \n",
+ "BU79786 Washington 2763.519279 No Basic Bachelor \n",
+ "QZ44356 Arizona 6979.535903 No Extended Bachelor \n",
+ "AI49188 Nevada 12887.431650 No Premium Bachelor \n",
+ "WW63253 California 7645.861827 No Basic Bachelor \n",
+ "HB64268 Washington 2813.692575 No Basic Bachelor \n",
+ "\n",
+ " employmentstatus gender income location_code marital_status ... \\\n",
+ "customer ... \n",
+ "BU79786 Employed F 56274 Suburban Married ... \n",
+ "QZ44356 Unemployed F 0 Suburban Single ... \n",
+ "AI49188 Employed F 48767 Suburban Married ... \n",
+ "WW63253 Unemployed M 0 Suburban Married ... \n",
+ "HB64268 Employed M 43836 Rural Single ... \n",
+ "\n",
+ " policy_type policy renew_offer_type sales_channel \\\n",
+ "customer \n",
+ "BU79786 Corporate Auto Corporate L3 Offer1 Agent \n",
+ "QZ44356 Personal Auto Personal L3 Offer3 Agent \n",
+ "AI49188 Personal Auto Personal L3 Offer1 Agent \n",
+ "WW63253 Corporate Auto Corporate L2 Offer1 Call Center \n",
+ "HB64268 Personal Auto Personal L1 Offer1 Agent \n",
+ "\n",
+ " total_claim_amount vehicle_class vehicle_size day week month \n",
+ "customer \n",
+ "BU79786 384.811147 Two-Door Car Medsize 24 8 2 \n",
+ "QZ44356 1131.464935 Four-Door Car Medsize 31 5 1 \n",
+ "AI49188 566.472247 Two-Door Car Medsize 19 7 2 \n",
+ "WW63253 529.881344 SUV Medsize 20 3 1 \n",
+ "HB64268 138.130879 Four-Door Car Medsize 3 5 2 \n",
+ "\n",
+ "[5 rows x 25 columns]"
+ ]
+ },
+ "execution_count": 28,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data = data.drop(['effective_to_date'], axis=1)\n",
+ "data.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "bdb84a68",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "data = pd.get_dummies(data, drop_first=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "094f2e49",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "customer_lifetime_value float64\n",
+ "income int64\n",
+ "monthly_premium_auto int64\n",
+ "months_since_last_claim int64\n",
+ "months_since_policy_inception int64\n",
+ "number_of_open_complaints int64\n",
+ "number_of_policies int64\n",
+ "total_claim_amount float64\n",
+ "day int64\n",
+ "week int64\n",
+ "month int64\n",
+ "state_California uint8\n",
+ "state_Nevada uint8\n",
+ "state_Oregon uint8\n",
+ "state_Washington uint8\n",
+ "response_Yes uint8\n",
+ "coverage_Extended uint8\n",
+ "coverage_Premium uint8\n",
+ "education_College uint8\n",
+ "education_Doctor uint8\n",
+ "education_High School or Below uint8\n",
+ "education_Master uint8\n",
+ "employmentstatus_Employed uint8\n",
+ "employmentstatus_Medical Leave uint8\n",
+ "employmentstatus_Retired uint8\n",
+ "employmentstatus_Unemployed uint8\n",
+ "gender_M uint8\n",
+ "location_code_Suburban uint8\n",
+ "location_code_Urban uint8\n",
+ "marital_status_Married uint8\n",
+ "marital_status_Single uint8\n",
+ "policy_type_Personal Auto uint8\n",
+ "policy_type_Special Auto uint8\n",
+ "policy_Corporate L2 uint8\n",
+ "policy_Corporate L3 uint8\n",
+ "policy_Personal L1 uint8\n",
+ "policy_Personal L2 uint8\n",
+ "policy_Personal L3 uint8\n",
+ "policy_Special L1 uint8\n",
+ "policy_Special L2 uint8\n",
+ "policy_Special L3 uint8\n",
+ "renew_offer_type_Offer2 uint8\n",
+ "renew_offer_type_Offer3 uint8\n",
+ "renew_offer_type_Offer4 uint8\n",
+ "sales_channel_Branch uint8\n",
+ "sales_channel_Call Center uint8\n",
+ "sales_channel_Web uint8\n",
+ "vehicle_class_Luxury Car uint8\n",
+ "vehicle_class_Luxury SUV uint8\n",
+ "vehicle_class_SUV uint8\n",
+ "vehicle_class_Sports Car uint8\n",
+ "vehicle_class_Two-Door Car uint8\n",
+ "vehicle_size_Medsize uint8\n",
+ "vehicle_size_Small uint8\n",
+ "dtype: object"
+ ]
+ },
+ "execution_count": 30,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data.dtypes"
+ ]
+ },
{
"cell_type": "markdown",
"id": "2f38d5b3",
@@ -26,11 +463,50 @@
},
{
"cell_type": "code",
- "execution_count": null,
- "id": "68d5e0bc",
+ "execution_count": 31,
+ "id": "e42f6530",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "y = data['total_claim_amount']\n",
+ "X = data.drop(['total_claim_amount'],axis=1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "id": "78099df1",
"metadata": {},
"outputs": [],
- "source": []
+ "source": [
+ "transformer = StandardScaler().fit(data)\n",
+ "\n",
+ "x_standardized = transformer.transform(data)\n",
+ "x_standardized = pd.DataFrame(x_standardized, index = data.index)#, columns = ['customer_lifetime_value', 'income', 'monthly_premium_auto',\n",
+ " #'months_since_last_claim', 'months_since_policy_inception',\n",
+ " #'number_of_open_complaints', 'number_of_policies',\n",
+ " #'total_claim_amount'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "id": "071a37c0",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X = x_standardized"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "id": "09485eea",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)"
+ ]
},
{
"cell_type": "markdown",
@@ -42,11 +518,56 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 38,
"id": "947a8b4b",
"metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "LinearRegression()"
+ ]
+ },
+ "execution_count": 38,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model = LinearRegression()\n",
+ "model.fit(X_train, y_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "id": "88be841d",
+ "metadata": {},
"outputs": [],
- "source": []
+ "source": [
+ "predictions = model.predict(X_test)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "a59a3dab",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(1.0, 2.94915010568832e-13, 3.843506696994419e-13)"
+ ]
+ },
+ "execution_count": 40,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "r2_score(y_test, predictions), mean_absolute_error(y_test, predictions), mean_squared_error(y_test, predictions, squared=False)"
+ ]
},
{
"cell_type": "markdown",
@@ -58,11 +579,43 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 47,
"id": "b095dbc8",
"metadata": {},
"outputs": [],
- "source": []
+ "source": [
+ "def models(model_name, X, y, KNN_range = range(2,10)):\n",
+ " X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)\n",
+ "\n",
+ " if model_name == 'LinearRegression':\n",
+ " model = LinearRegression()\n",
+ " model.fit(X_train, y_train) \n",
+ " predictions = model.predict(X_test)\n",
+ " print('R2 score =', r2_score(y_test, predictions))\n",
+ "\n",
+ " if model_name == 'KNN':\n",
+ " scores = []\n",
+ " for i in KNN_range:\n",
+ " model = KNeighborsRegressor(n_neighbors=i)\n",
+ " model.fit(X_train, y_train)\n",
+ " scores.append(model.score(X_test, y_test))\n",
+ " print(scores)\n",
+ "\n",
+ " plt.figure(figsize=(10,6))\n",
+ " plt.plot(KNN_range,scores,color = 'darkslategrey', linestyle='dashdot',\n",
+ " marker='o', markerfacecolor='darkcyan', markersize=10)\n",
+ " plt.title('accuracy scores vs. K Value')\n",
+ " plt.xlabel('K')\n",
+ " plt.ylabel('Accuracy')\n",
+ " \n",
+ " if model_name == 'MLP':\n",
+ " model = MLPRegressor()\n",
+ " model.fit(X_train, y_train)\n",
+ "\n",
+ " expected_y = y_test\n",
+ " predicted_y = model.predict(X_test)\n",
+ " print('R2 score =',r2_score(expected_y, predicted_y))"
+ ]
},
{
"cell_type": "markdown",
@@ -74,11 +627,51 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 42,
"id": "cfb65b4b",
"metadata": {},
- "outputs": [],
- "source": []
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "R2 score = 1.0\n"
+ ]
+ }
+ ],
+ "source": [
+ "models('LinearRegression', X, y)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "id": "1ec7290e",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[0.696016943990347, 0.7302882705107913, 0.7461926073178331, 0.7509089120711043, 0.7548339068787251, 0.7603485434445362, 0.7585738788178724, 0.7527295679482957]\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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VVVfOv4tLz+fb0yezOq+feud+j1h/XpmTZ+uPWjNLJBy1txUzkREol9JaSm5y5bx98WLWfr++1RWVtLz6KMZO2oUY0eObPB4sNZox65d5G3dun+PW829b9u2b2fHrl0kJyXx9jPPYGb87P77WfPxx8z6/e8BuPInP+HVwkI+7dmz3tfosWkT3xs0iNuvvrq53pZQfznTtTVFRKRZfJyXx8PPP8+id96hpLSUozp14rILLmDsqFH069XrgKfqWotOHTrQqUOHeu8vr6hg565d+z+/M045hd41Vi/457p1FJx0UoOvsW+hXpWz6KByJiIiEVFdXc3KtWtJb9uWPj17UllZyZIVKzh/1CjGjhrFKQMG6OzFwyApMZHONa6SMGbkyC/d71VVTVqot6ToK6tVSUD0/woRETls3J3PCwsBqKyq4gd33cUTL7wAwHHHHMNrjz7Kz667jqyBA1XMmklqWhpJpaUNjkkqKyO1TRtKSkt58/33qapxooI0P/0/Q0REDtmm/HwefOYZvnHjjVx12224O0mJifzfL3/JLeGpMjMjMTEx4KStT052NpkFBQ2O6VxQQE52Nq+/8w7X3XEHH6xbB0BFZWVzRJRaNK0pIiIHpWDnTl5eupS/L17MqvXrARhywgmMGTmSqupqEuLjGXTccQGnlEnjxjF30SJ2dOjQ6EK9mUceSVpKCif16wfAfY88wofr1zPurLMYM2IEHep4vBx+OltTRESabE9REa+9/TZ/X7yYZR9+SHV1NccfeyxjR41izIgRXzr2SaLHvnXOGlqot651zma/8gpPvfgi//rPf0hISODMoUMZd9ZZnH7KKSQmaP/OodJSGiIiclBKy8oor6ggvW1b3nz/fa674w66d+4cKmQjR9Kre/fGn0QCdygL9X60cSPzFi1iweLFfL57Nx3bt2fsqFGMHz16/5UR5MCpnImIyAErLSvjvP/6L77+ta9x06RJVFZVsfbjjxnYt6+WvmiFKiorefO993jh9dfJXb6cyspKbpo0iau+/vWgo7VIWudMREQa5O58sG4df1+8mB27dnHvj39MSnIyV3/rW5zQty+AjiNr5RITEsgeNozsYcPYVVjIwiVLGDZoEADLV61i5pw53P6972l6+xCpnImItHIbPvmEBYsXs/Af/2DLZ5+RnJTEmcOG7b8M0BXjxwcdUaJQh/R0Ljn/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0FFEREQkyqicBSAuLo4RQ4YEHUNERESikKY1m9lP77+fGbNnBx1DREREopTKWTP6OC+P+YsWUVpWFnQUERERiVIqZ81o5pw5pCQlcfH55wcdRURERKKUylkz+WznTl7MzeXCc87hiPT0oOOIiIhIlFI5ayZ/nTeP6upqJo4fH3QUERERiWIqZ81gb3Exz7/0EuecdhrdOncOOo6IiIhEMZWzZjDr5ZfZW1zMtydMCDqKiIiIRDmVswirqKjgyXnzGDpoECf06RN0HBEREYlyKmcR9vY//8lnO3ZwpfaaiYiISBPoCgERNjIri6enT+f4Y48NOoqIiIi0ANpzFkHV1dUA9OvVCzMLOI2IiIi0BCpnEXTjr3/N/z75ZNAxREREpAVROYuQispKumZmcmSHDkFHERERkRZEx5xFSGJCArd/73tBxxAREZEWRnvOIiC/oID3Vq/G3YOOIiIiIi2MylkEzJg9m2t+8Qs+37076CgiIiLSwkS0nJnZGDNbZ2YbzOzWOu6famYrw1+rzKzKzDo25bHR6vPCQua++io52dl01PFmIiIicoAiVs7MLB74IzAWGABcamYDao5x93vdfbC7DwZuA3LdfWdTHhutnlmwgNLyciZddFHQUURERKQFiuSes2HABnff6O7lwNPAhQ2MvxR46iAfGxVKysp4ZsECRmVl0at796DjiIiISAsUyXLWFcircXtzeNtXmFkaMAaYdaCPjSYvvPYanxcW6lJNIiIictAiWc7qWhK/vtMXxwFL3X3ngT7WzK4xs+VmtrygoOAgYh4eVVVVPD53LoOOO46TB7SIGVgRERGJQpEsZ5uBmnN73YAt9Yy9hC+mNA/ose7+oLtnuXtWRkbGIcQ9NK+9/Tabt23jygkTdKkmEREROWiRLGfLgL5mdqyZJREqYC/UHmRm7YFsYO6BPjZauDuPzZlD9y5dOHPYsKDjiIiISAsWsSsEuHulmd0AvATEA4+4+2ozuzZ8/wPhoROAl929qLHHRirroaqsqmJUVhbdOncmPj4+6DgiIiLSglksrWKflZXly5cvDzqGiIiISKPMbIW7Z9XerisEHKL/fPopLy9dSlVVVdBRREREJAaonB2iv73yCj///e/ZU1TU+GARERGRRkTsmLPW4qaJE8k580w6pKcHHUVERERigPacHYLq6mri4+M57phjgo4iIiIi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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "models('KNN', X, y)"
+ ]
},
{
"cell_type": "markdown",
@@ -90,11 +683,21 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 48,
"id": "3283e967",
"metadata": {},
- "outputs": [],
- "source": []
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "R2 score = 0.9959792628123999\n"
+ ]
+ }
+ ],
+ "source": [
+ "models('MLP',X,y)"
+ ]
},
{
"cell_type": "markdown",
@@ -105,12 +708,16 @@
]
},
{
- "cell_type": "code",
- "execution_count": null,
- "id": "b83c06cd",
+ "cell_type": "markdown",
+ "id": "1402fd6e",
"metadata": {},
- "outputs": [],
- "source": []
+ "source": [
+ "All models seems overfitted:\n",
+ "\n",
+ "- The Linear Regression is overfitted, therefore we got r2 score = 1\n",
+ "- KNN presented best performance when k = 7 (score = 0.76)\n",
+ "- MLP Regressor also seems overfitted with r2 score = 0.99"
+ ]
}
],
"metadata": {
@@ -129,7 +736,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.8.5"
+ "version": "3.8.8"
}
},
"nbformat": 4,