ai/polynomial regression/tasks.ipynb

257 lines
30 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "code",
"execution_count": 3,
"id": "1de279dc-5473-447c-ac66-f8763f46a6dc",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "eaa95790-7210-4265-8978-fbf18de821fc",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Price</th>\n",
" <th>BuildingArea</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1035000.0</td>\n",
" <td>79.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1465000.0</td>\n",
" <td>150.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1600000.0</td>\n",
" <td>142.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>1876000.0</td>\n",
" <td>210.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>1636000.0</td>\n",
" <td>107.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13572</th>\n",
" <td>650000.0</td>\n",
" <td>79.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13573</th>\n",
" <td>635000.0</td>\n",
" <td>172.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13576</th>\n",
" <td>1031000.0</td>\n",
" <td>133.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13578</th>\n",
" <td>2500000.0</td>\n",
" <td>157.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13579</th>\n",
" <td>1285000.0</td>\n",
" <td>112.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>7130 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" Price BuildingArea\n",
"1 1035000.0 79.0\n",
"2 1465000.0 150.0\n",
"4 1600000.0 142.0\n",
"6 1876000.0 210.0\n",
"7 1636000.0 107.0\n",
"... ... ...\n",
"13572 650000.0 79.0\n",
"13573 635000.0 172.0\n",
"13576 1031000.0 133.0\n",
"13578 2500000.0 157.0\n",
"13579 1285000.0 112.0\n",
"\n",
"[7130 rows x 2 columns]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"table = pd.read_csv('melb_data.csv', usecols=[\"BuildingArea\", \"Price\"])\n",
"table.dropna(subset=['BuildingArea'], inplace=True)\n",
"\n",
"area = np.array(table['BuildingArea'][:100])\n",
"price = np.array(table['Price'][:100])\n",
"\n",
"table"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "cbe04c37-d75e-4ec2-b00e-5f879d15db8b",
"metadata": {},
"outputs": [],
"source": [
"# Create one feature array for \"building area\".\n",
"# Prepend x_0 = 1\n",
"X=[]\n",
"for row in area:\n",
" X.append([1, row])\n",
"\n",
"X = np.array(X)\n",
"Y = np.array(price)"
]
},
{
"cell_type": "code",
"execution_count": 70,
"id": "2a811123-df41-4096-916b-57a58e4c4bfc",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Axes: >"
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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TDNnztSaNWv8vVm2oiskACQlJWngwIHKzc1Vjx495HQ6VVhY2OQ+3377rXr06OGfDQxAdfvi2IrpxvupR48eysvLa3J7dXW1Dh8+zL78Xr9+/ZSamqrc3FxJ4b3P5syZozfffFMffPCBevXqVX+9J5/JHj16uHwv1t0WytztN1dGjBghSU3eb+G232JiYpSZmanTTjtNCxcu1LBhw/SHP/whpN5nBIsAUFpaqt27d6tnz5467bTTFB0drZUrV9bfvnPnTu3bt08jR47041YGloyMDPXo0aPJfiouLtbGjRvr99PIkSNVWFiozZs3199n1apVqq2trf+CC3dff/21CgoK1LNnT0nhuc8sy9KcOXO0fPlyrVq1ShkZGU1u9+QzOXLkSG3btq1JKHvvvfeUkJCgwYMH++aF+Fhr+82VLVu2SFKT91u47bdj1dbWqrKyMrTeZ/6uHg1Ht9xyi7V69Wprz5491vr1663x48dbqampVl5enmVZlnXNNddYffr0sVatWmVt2rTJGjlypDVy5Eg/b7XvlZSUWDk5OVZOTo4lyXrsscesnJwca+/evZZlWdaiRYuspKQk67XXXrO2bt1qTZkyxcrIyLDKy8vrH2PChAnW8OHDrY0bN1rr1q2zBgwYYE2fPt1fL8nrWtpnJSUl1q233mpt2LDB2rNnj/X+++9bp556qjVgwACroqKi/jHCbZ9de+21VmJiorV69Wrr4MGD9ZeysrL6+7T2mayurraGDBlinXfeedaWLVusf//731b37t2t+fPn++Ml+URr+y03N9e69957rU2bNll79uyxXnvtNatfv37WmDFj6h8j3PbbvHnzrDVr1lh79uyxtm7das2bN89yOBzWu+++a1lW6LzPCBZ+8LOf/czq2bOnFRMTYx1//PHWz372Mys3N7f+9vLycuu6666zkpOTrbi4OGvq1KnWwYMH/bjF/vHBBx9YkppdZs6caVmWGXJ65513Wscdd5wVGxtrjRs3ztq5c2eTxygoKLCmT59uxcfHWwkJCdbll19ulZSU+OHV+EZL+6ysrMw677zzrO7du1vR0dFW3759rauuuqrJ0DXLCr995mp/SbIWL15cfx9PPpNfffWVNXHiRKtz585Wamqqdcstt1hVVVU+fjW+09p+27dvnzVmzBirW7duVmxsrJWZmWnddtttVlFRUZPHCaf9NmvWLKtv375WTEyM1b17d2vcuHH1ocKyQud9xrLpAADANtRYAAAA2xAsAACAbQgWAADANgQLAABgG4IFAACwDcECAADYhmABAABsQ7AAAAC2IVgAAADbECwAAIBtCBYAAMA2BAsAAGCb/w8ZXqDVKEN8OAAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Solve for theta with scikit learn\n",
"# Linear regression\n",
"from sklearn.linear_model import LinearRegression\n",
"from sklearn.preprocessing import PolynomialFeatures\n",
"\n",
"poly = PolynomialFeatures(degree=4, include_bias=False)\n",
"poly_features = poly.fit_transform(np.array(area).reshape(-1,1))\n",
"model = LinearRegression()\n",
"\n",
"model.fit(poly_features, Y)\n",
"\n",
"y_predicted = model.predict(poly_features)\n",
"\n",
"# Plot solution.\n",
"fig, ax = plt.subplots()\n",
"sns.scatterplot(x=area, y=price, ax=ax)\n",
"sns.lineplot(x=area, y=y_predicted, c=\"red\")"
]
},
{
"cell_type": "code",
"execution_count": 71,
"id": "a4384ef4-fc89-483b-8f31-7736b100b211",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.float64(-4.174098651738424)"
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def J(theta, x, y):\n",
" '''Quadratic error function used by linear regression'''\n",
" return sum([(sum([theta[j] * x[i][j] for j in range(len(theta))]) - y[i])**2 for i in range(len(x))]) * 0.5 / len(y)\n",
"\n",
"MSE = 2 * J(model.coef_, poly_features, Y)\n",
"\n",
"average_price = sum(Y)/len(Y)\n",
"variance = sum([(y - average_price)**2 for y in Y]) / len(Y)\n",
"R2 = 1 - MSE / variance\n",
"R2"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.11"
}
},
"nbformat": 4,
"nbformat_minor": 5
}