607 lines
31 KiB
Plaintext
607 lines
31 KiB
Plaintext
|
{
|
||
|
"cells": [
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Kkolejna część zajęć będzie wprowadzeniem do drugiej, szeroko używanej biblioteki w Pythonie: `sklearn`. Zajęcia będą miały charaktere case-study poprzeplatane zadaniami do wykonania. Zacznijmy od załadowania odpowiednich bibliotek."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 1,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"import numpy as np\n",
|
||
|
"import pandas as pd\n",
|
||
|
"import matplotlib.pyplot as plt\n",
|
||
|
"\n",
|
||
|
"%matplotlib inline"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Zacznijmy od załadowania danych. Na dzisiejszych zajęciach będziemy korzystać z danych z portalu [gapminder.org](https://www.gapminder.org/data/)."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 2,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"df = pd.read_csv('gapminder.csv', index_col=0)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Dane zawierają różne informacje z większość państw świata (z roku 2008). Poniżej znajduje się opis kolumn:\n",
|
||
|
" * female_BMI - średnie BMI u kobiet\n",
|
||
|
" * male_BMI - średnie BMI u mężczyzn\n",
|
||
|
" * gdp - PKB na obywatela\n",
|
||
|
" * population - wielkość populacji\n",
|
||
|
" * under5mortality - wskaźnik śmiertelności dzieni pon. 5 roku życia (na 1000 urodzonych dzieci)\n",
|
||
|
" * life_expectancy - średnia długość życia\n",
|
||
|
" * fertility - wskaźnik dzietności"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"**zad. 1**\n",
|
||
|
"Na podstawie danych zawartych w `df` odpowiedz na następujące pytania:\n",
|
||
|
" * Jaki był współczynniki dzietności w Polsce w 2018?\n",
|
||
|
" * W którym kraju ludzie żyją najdłużej?\n",
|
||
|
" * Z ilu krajów zostały zebrane dane?"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": null,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": []
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"**zad. 2** Stwórz kolumnę `gdp_log`, która powstanie z kolumny `gdp` poprzez zastowanie funkcji `log` (logarytm). \n",
|
||
|
"\n",
|
||
|
"Hint 1: Wykorzystaj funkcję `apply` (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.apply.html#pandas.Series.apply).\n",
|
||
|
"\n",
|
||
|
"Hint 2: Wykorzystaj fukcję `log` z pakietu `np`."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": null,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": []
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Naszym zadaniem będzie oszacowanie długości życia (kolumna `life_expectancy`) na podstawie pozostałych zmiennych. Na samym początku, zastosujemy regresje jednowymiarową na `fertility`."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 5,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"Y shape: (176,)\n",
|
||
|
"X shape: (176,)\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"y = df['life_expectancy'].values\n",
|
||
|
"X = df['fertility'].values\n",
|
||
|
"\n",
|
||
|
"print(\"Y shape:\", y.shape)\n",
|
||
|
"print(\"X shape:\", X.shape)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Będziemy korzystać z gotowej implementacji regreji liniowej z pakietu sklearn. Żeby móc wykorzystać, musimy napierw zmienić shape na dwuwymiarowy."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 6,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"Y shape: (176, 1)\n",
|
||
|
"X shape: (176, 1)\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"y = y.reshape(-1, 1)\n",
|
||
|
"X = X.reshape(-1, 1)\n",
|
||
|
"\n",
|
||
|
"print(\"Y shape:\", y.shape)\n",
|
||
|
"print(\"X shape:\", X.shape)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Jeszcze przed właściwą analizą, narysujmy wykres i zobaczny czy istnieje \"wizualny\" związek pomiędzy kolumnami."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 7,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"<matplotlib.axes._subplots.AxesSubplot at 0x7f10a1ee1978>"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 7,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
},
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 432x288 with 1 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {
|
||
|
"needs_background": "light"
|
||
|
},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"df.plot.scatter('fertility', 'life_expectancy')"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"**zad. 3** Zaimportuj `LinearRegression` z pakietu `sklearn.linear_model`."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": null,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": []
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Tworzymy obiekt modelu regresji liniowej."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 8,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"ename": "NameError",
|
||
|
"evalue": "name 'LinearRegression' is not defined",
|
||
|
"output_type": "error",
|
||
|
"traceback": [
|
||
|
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||
|
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
|
||
|
"\u001b[0;32m<ipython-input-8-28d4d21f64c7>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mLinearRegression\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
|
||
|
"\u001b[0;31mNameError\u001b[0m: name 'LinearRegression' is not defined"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"model = LinearRegression()"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Trening modelu ogranicza się do wywołania metodu `fit`, która przyjmuje dwa argumenty:"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 97,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 97,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"model.fit(X, y)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Współczynniki modelu:"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 99,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"Wyraz wolny (bias): [82.92548061]\n",
|
||
|
"Współczynniki cech: [[-4.29315763]]\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"print(\"Wyraz wolny (bias):\", model.intercept_)\n",
|
||
|
"print(\"Współczynniki cech:\", model.coef_)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"**zad. 4** Wytrenuj nowy model `model2`, który będzie jako X przyjmie kolumnę `gdp_log`. Wyświetl parametry nowego modelu."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": null,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": []
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Mając wytrenowany model możemy wykorzystać go do predykcji. Wystarczy wywołać metodę `predict`."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 101,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"input: 6.2\t predicted: 56.30790328839987\t expected: 52.8\n",
|
||
|
"input: 1.76\t predicted: 75.36952317631349\t expected: 76.8\n",
|
||
|
"input: 2.73\t predicted: 71.2051602728729\t expected: 75.5\n",
|
||
|
"input: 6.43\t predicted: 55.32047703294488\t expected: 56.7\n",
|
||
|
"input: 2.16\t predicted: 73.6522601233483\t expected: 75.5\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"X_test = X[:5,:]\n",
|
||
|
"y_test = y[:5,:]\n",
|
||
|
"output = model.predict(X_test)\n",
|
||
|
"\n",
|
||
|
"for i in range(5):\n",
|
||
|
" print(\"input: {}\\t predicted: {}\\t expected: {}\".format(X_test[i,0], output[i,0], y_test[i,0]))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Sprawdzenie jakości modelu - metryki: $R^2$ i $MSE$"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Istnieją 3 metryki, które określają jak dobry jest nasz model:\n",
|
||
|
" * $R^2$: [Współczynnik determinacji](https://pl.wikipedia.org/wiki/Wsp%C3%B3%C5%82czynnik_determinacji)\n",
|
||
|
" * $MSE$: [błąd średnio-kwadratowy](https://pl.wikipedia.org/wiki/B%C5%82%C4%85d_%C5%9Bredniokwadratowy) \n",
|
||
|
" * $RMSE = \\sqrt{MSE}$"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 104,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"R^2: 0.5793180095847132\n",
|
||
|
"Root Mean Squared Error: 5.77824860865276\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"from sklearn.metrics import mean_squared_error\n",
|
||
|
"\n",
|
||
|
"print(\"R^2: {}\".format(model.score(X, y)))\n",
|
||
|
"rmse = np.sqrt(mean_squared_error(y, model.predict(X)))\n",
|
||
|
"print(\"Root Mean Squared Error: {}\".format(rmse))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 19,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"R^2: 0.4881890528165924\n",
|
||
|
"Root Mean Squared Error: 5.889906845544505\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Import necessary modules\n",
|
||
|
"from sklearn.linear_model import LinearRegression\n",
|
||
|
"from sklearn.metrics import mean_squared_error\n",
|
||
|
"from sklearn.model_selection import train_test_split\n",
|
||
|
"\n",
|
||
|
"# Create training and test sets\n",
|
||
|
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.30, random_state=42)\n",
|
||
|
"\n",
|
||
|
"# Create the regressor: reg_all\n",
|
||
|
"reg_all = LinearRegression()\n",
|
||
|
"\n",
|
||
|
"# Fit the regressor to the training data\n",
|
||
|
"reg_all.fit(X_train, y_train)\n",
|
||
|
"\n",
|
||
|
"# Predict on the test data: y_pred\n",
|
||
|
"y_pred = reg_all.predict(X_test)\n",
|
||
|
"\n",
|
||
|
"# Compute and print R^2 and RMSE\n",
|
||
|
"print(\"R^2: {}\".format(reg_all.score(X_test, y_test)))\n",
|
||
|
"rmse = np.sqrt(mean_squared_error(y_test, y_pred))\n",
|
||
|
"print(\"Root Mean Squared Error: {}\".format(rmse))\n"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Regresja wielu zmiennych"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Model regresji liniowej wielu zmiennych nie różni się istotnie od modelu jednej zmiennej. Np. chcąc zbudować model oparty o dwie kolumny: `fertility` i `gdp` wystarczy zmienić X (cechy wejściowe):"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 149,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"(176,)\n",
|
||
|
"(176, 1)\n"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"0.6421567875738732"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 149,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"X = df[['fertility', 'gdp']]\n",
|
||
|
"print(df['fertility'].shape)\n",
|
||
|
"print(df[['fertility']].shape)\n",
|
||
|
"\n",
|
||
|
"model_mv = LinearRegression()\n",
|
||
|
"model_mv.fit(X, y)\n",
|
||
|
"\n",
|
||
|
"model_mv.score(X, y)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"**zad. 6** Która kombinacja dwóch kolumn daje najlepszy wynik w metryce $R^2$? Tak jak poprzednio, próbujemy przewidzieć zawartosć kolumny `life_expectancy`.\n",
|
||
|
"\n",
|
||
|
"Uwaga: Należy wyłączyć kolumnę `life_expectancy` spośród szukanych."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": null,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": []
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"**zad. 7** \n",
|
||
|
" * Zbuduj model regresji liniowej, która oszacuje wartność kolumny `life_expectancy` na podstawie pozostałych kolumn.\n",
|
||
|
" * Wyświetl współczynniki modelu? Dla jakich cech współczynniki modelu są bliskie 0? Dlaczego?\n",
|
||
|
" * Oblicz wartości obu metryk na zbiorze trenującym.\n",
|
||
|
" "
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": null,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": []
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"**zad. 6**\n",
|
||
|
"Wykonaj jedno z zadań 6.1 lub 6.2."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"**zad. 6.1** Zaimplementuj metrykę $R^2$ jako fukcję `r2` (szablon poniżej). Fukcja `r2` przyjmuje dwa parametry typu *list* i ma zwrócić wartość metryki $R^2$."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 131,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"Real R2: 0.6421567875738732\n",
|
||
|
"Calculated: None\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"def r2(expected, predicted):\n",
|
||
|
" \"\"\"\n",
|
||
|
" argumenty:\n",
|
||
|
" expected (type: list): poprawne wartości\n",
|
||
|
" predicted (type: list): oszacowanie z modelu\n",
|
||
|
" \"\"\"\n",
|
||
|
" pass\n",
|
||
|
"\n",
|
||
|
"y = df['life_expectancy'].values\n",
|
||
|
"X = df[['fertility', 'gdp']].values\n",
|
||
|
"\n",
|
||
|
"test_model = LinearRegression()\n",
|
||
|
"test_model.fit(X, y)\n",
|
||
|
"\n",
|
||
|
"print(\"Real R2:\", test_model.score(X, y))\n",
|
||
|
"\n",
|
||
|
"predicted = list(test_model.predict(X))\n",
|
||
|
"expected = list(y)\n",
|
||
|
"\n",
|
||
|
"print(\"Calculated:\", r2(expected, predicted))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
" Zaimplementuj metrykę $RMSE$ jako fukcję rmse (szablon poniżej). Fukcja rmse przyjmuje dwa parametry typu list i ma zwrócić wartość metryki $RMSE$ ."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 133,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"Real R2: 5.329244618514514\n",
|
||
|
"Calculated: None\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"def rmse(expected, predicted):\n",
|
||
|
" \"\"\"\n",
|
||
|
" argumenty:\n",
|
||
|
" expected (type: list): poprawne wartości\n",
|
||
|
" predicted (type: list): oszacowanie z modelu\n",
|
||
|
" \"\"\"\n",
|
||
|
" pass\n",
|
||
|
"\n",
|
||
|
"y = df['life_expectancy'].values\n",
|
||
|
"X = df[['fertility', 'gdp']].values\n",
|
||
|
"\n",
|
||
|
"test_model = LinearRegression()\n",
|
||
|
"test_model.fit(X, y)\n",
|
||
|
"\n",
|
||
|
"print(\"Real R2:\", np.sqrt(mean_squared_error(y, test_model.predict(X))))\n",
|
||
|
"\n",
|
||
|
"predicted = list(test_model.predict(X))\n",
|
||
|
"expected = list(y)\n",
|
||
|
"\n",
|
||
|
"print(\"Calculated:\", r2(expected, predicted))"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"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.7.2"
|
||
|
}
|
||
|
},
|
||
|
"nbformat": 4,
|
||
|
"nbformat_minor": 2
|
||
|
}
|