ai/skalierung/tasks.ipynb

554 lines
77 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": "markdown",
"id": "eec7b0ac-eba3-4bd8-810d-259fd572d5bc",
"metadata": {},
"source": [
"# Skalierung"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "aed2b11e-27ad-408c-bce5-fd9df2ff5886",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "f4e94998-91ac-40c8-99f1-f4b47ddb175a",
"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": "180274b9-926a-4ece-aae6-fcdbddcc4505",
"metadata": {},
"outputs": [],
"source": [
"import seaborn as sns\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "0eae9196-ba36-4cf5-8584-cbaca9d58dfd",
"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": 7,
"id": "0f2150c0-7e25-4521-99fe-528ff75667fe",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Axes: >"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"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",
"model = LinearRegression()\n",
"\n",
"model.fit(X, Y)\n",
"\n",
"# Plot solution.\n",
"fig, ax = plt.subplots()\n",
"sns.scatterplot(x=area, y=price, ax=ax)\n",
"sns.lineplot(x=[min(area), max(area)], y=[model.predict([[1, min(area)]])[0], model.predict([[1, max(area)]])[0]], ax=ax, color='red') "
]
},
{
"cell_type": "markdown",
"id": "c0608d51-df49-4589-acfa-9e859dbd8e43",
"metadata": {},
"source": [
"# Normalization"
]
},
{
"cell_type": "markdown",
"id": "bee754e7-004d-489f-a614-6776dd48e579",
"metadata": {},
"source": [
"Transformation:\n",
"\n",
"$$\n",
"\\overline{x}_j = \\frac{x_j - \\min_i x_j^{(i)}}{\\max_i x_j^{(i)} - \\min_i x_j^{(i)}}\n",
"$$\n",
"\n",
"Rücktransformation:\n",
"\n",
"$$\n",
" \\overline{y} = y \\cdot (\\max_i x_j^{(i)} - \\min_i x_j^{(i)}) + \\min_i x_j^{(i)}\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "5e35fc77-f191-4495-9850-f95b648b0900",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Axes: >"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def normalize(x):\n",
"\n",
" x_min = min(x)\n",
" x_max = max(x)\n",
"\n",
" return [ (x_i - x_min) / (x_max - x_min) for x_i in x ]\n",
"\n",
"def denormalize(Y, y):\n",
" y_min = min(Y)\n",
" y_max = max(Y)\n",
"\n",
" return y * (y_max - y_min) + y_min\n",
"\n",
"# Solve for theta with scikit learn\n",
"# Linear regression\n",
"from sklearn.linear_model import LinearRegression\n",
"model = LinearRegression()\n",
"\n",
"x_norm = normalize(area)\n",
"y_norm = normalize(price)\n",
"\n",
"# Create one feature array for \"building area\".\n",
"# Prepend x_0 = 1\n",
"X_norm=[]\n",
"for row in x_norm:\n",
" X_norm.append([1, row])\n",
"\n",
"X_norm = np.array(X_norm)\n",
"Y_norm = np.array(y_norm)\n",
"\n",
"model.fit(X_norm, Y_norm)\n",
"\n",
"y_vals = [\n",
" denormalize(price, model.predict([[1, min(x_norm)]])[0]),\n",
" denormalize(price, model.predict([[1, max(x_norm)]])[0])\n",
"]\n",
"\n",
"# Plot solution.\n",
"fig, ax = plt.subplots()\n",
"sns.scatterplot(x=area, y=price, ax=ax)\n",
"sns.lineplot(x=[min(area), max(area)], y=y_vals, ax=ax, color='red') "
]
},
{
"cell_type": "markdown",
"id": "f8e6c4b6-2409-4159-a9dd-c88317a5dfb6",
"metadata": {},
"source": [
"# Standardization"
]
},
{
"cell_type": "markdown",
"id": "f5146ea0-56b2-4771-8f44-a2e980bd22bf",
"metadata": {},
"source": [
"Transformation:\n",
"$$\n",
"\\mu_j = \\frac{1}{n} \\sum_{i=1}^n x_j^{(i)}\n",
"$$\n",
"$$\n",
"\\sigma_j = \\sqrt{ \\frac{1}{n} \\sum_{i=1}^n (x_j^{(i)} - \\mu_j^{(i)}) }\n",
"$$\n",
"$$\n",
"\\overline{x_j} = \\frac{x_j - \\mu_j}{\\sigma_j}\n",
"$$\n",
"\n",
"Rücktransformation:\n",
"\n",
"$$\n",
" y = \\overline{y} \\cdot \\sigma_y + \\mu_y\n",
"$$\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "0aa001cb-c22a-4067-b169-77a83812cf03",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Axes: >"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import math\n",
"\n",
"def standardize(x):\n",
"\n",
" u = sum(x)/len(x)\n",
"\n",
" o = math.sqrt(sum( (xj - u)**2 for xj in x)/len(x))\n",
"\n",
" return [(xj - u) / o for xj in x]\n",
"\n",
"def denstandardize(Y, y):\n",
" u = sum(Y)/len(Y)\n",
"\n",
" o = math.sqrt(sum( (xj - u)**2 for xj in Y)/len(Y))\n",
"\n",
" return y * o + u\n",
"\n",
"# Solve for theta with scikit learn\n",
"# Linear regression\n",
"from sklearn.linear_model import LinearRegression\n",
"model = LinearRegression()\n",
"\n",
"x_norm = standardize(area)\n",
"y_norm = standardize(price)\n",
"\n",
"# Create one feature array for \"building area\".\n",
"# Prepend x_0 = 1\n",
"X_norm=[]\n",
"for row in x_norm:\n",
" X_norm.append([1, row])\n",
"\n",
"X_norm = np.array(X_norm)\n",
"Y_norm = np.array(y_norm)\n",
"\n",
"model.fit(X_norm, Y_norm)\n",
"\n",
"y_vals = [\n",
" denstandardize(price, model.predict([[1, min(x_norm)]])[0]),\n",
" denstandardize(price, model.predict([[1, max(x_norm)]])[0])\n",
"]\n",
"\n",
"# Plot solution.\n",
"fig, ax = plt.subplots()\n",
"sns.scatterplot(x=area, y=price, ax=ax)\n",
"sns.lineplot(x=[min(area), max(area)], y=y_vals, ax=ax, color='red') "
]
},
{
"cell_type": "markdown",
"id": "f76072a1-d75d-4ea7-a8cf-53b9ffd0318b",
"metadata": {},
"source": [
"# R2 für unskalierte Daten"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "155895f2-3c84-4982-aba6-652e343db838",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.float64(-0.29961445678393317)"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.linear_model import LinearRegression\n",
"model = LinearRegression()\n",
"\n",
"model.fit(X, Y)\n",
"\n",
"def J(theta, x, y):\n",
" '''Quadratic error function used by linear regression'''\n",
" return sum([((theta[0] + theta[1] * x[i][1]) - y[i])**2 for i in range(len(x))]) * 0.5 / len(x)\n",
"\n",
"MSE = 2 * J(model.coef_, X, 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"
]
},
{
"cell_type": "markdown",
"id": "1339d6e5-df37-4e74-8cef-13890c3d22e7",
"metadata": {},
"source": [
"# R2 für normalisierte Daten"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "c6a5ce7a-2f71-45a5-95f7-28b45a378525",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.float64(0.11734030806790186)"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def normalize(x):\n",
"\n",
" x_min = min(x)\n",
" x_max = max(x)\n",
"\n",
" return [ (x_i - x_min) / (x_max - x_min) for x_i in x ]\n",
"\n",
"def denormalize(Y, y):\n",
" y_min = min(Y)\n",
" y_max = max(Y)\n",
"\n",
" return y * (y_max - y_min) + y_min\n",
"\n",
"# Solve for theta with scikit learn\n",
"# Linear regression\n",
"from sklearn.linear_model import LinearRegression\n",
"model = LinearRegression()\n",
"\n",
"x_norm = normalize(area)\n",
"y_norm = normalize(price)\n",
"\n",
"# Create one feature array for \"building area\".\n",
"# Prepend x_0 = 1\n",
"X_norm=[]\n",
"for row in x_norm:\n",
" X_norm.append([1, row])\n",
"\n",
"X_norm = np.array(X_norm)\n",
"Y_norm = np.array(y_norm)\n",
"\n",
"model.fit(X_norm, Y_norm)\n",
"\n",
"def J(theta, x, y):\n",
" '''Quadratic error function used by linear regression'''\n",
" return sum([((theta[0] + theta[1] * x[i][1]) - y[i])**2 for i in range(len(x))]) * 0.5 / len(x)\n",
"\n",
"MSE = 2 * J(model.coef_, X_norm, Y_norm)\n",
"\n",
"average_price = sum(Y_norm)/len(Y_norm)\n",
"variance = sum([(y - average_price)**2 for y in Y_norm]) / len(Y_norm)\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
}