diff --git a/your-code/main.ipynb b/your-code/main.ipynb index f1794a8..b9be380 100644 --- a/your-code/main.ipynb +++ b/your-code/main.ipynb @@ -11,11 +11,16 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 170, "metadata": {}, "outputs": [], "source": [ - "import pandas as pd" + "import pandas as pd\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn import metrics\n", + "from sklearn.linear_model import LogisticRegression\n", + "import matplotlib.pyplot as plt" ] }, { @@ -27,7 +32,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -41,6 +46,386 @@ "data = pd.concat([X, y], axis=1)" ] }, + { + "cell_type": "code", + "execution_count": 4, + "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", + "
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTATMEDV
00.0063218.02.310.00.5386.57565.24.09001.0296.015.3396.904.9824.0
10.027310.07.070.00.4696.42178.94.96712.0242.017.8396.909.1421.6
20.027290.07.070.00.4697.18561.14.96712.0242.017.8392.834.0334.7
30.032370.02.180.00.4586.99845.86.06223.0222.018.7394.632.9433.4
40.069050.02.180.00.4587.14754.26.06223.0222.018.7396.905.3336.2
\n", + "
" + ], + "text/plain": [ + " CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX \\\n", + "0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 \n", + "1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 \n", + "2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 \n", + "3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 \n", + "4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 \n", + "\n", + " PTRATIO B LSTAT MEDV \n", + "0 15.3 396.90 4.98 24.0 \n", + "1 17.8 396.90 9.14 21.6 \n", + "2 17.8 392.83 4.03 34.7 \n", + "3 18.7 394.63 2.94 33.4 \n", + "4 18.7 396.90 5.33 36.2 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "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", + "
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTAT
00.0063218.02.310.00.5386.57565.24.09001.0296.015.3396.904.98
10.027310.07.070.00.4696.42178.94.96712.0242.017.8396.909.14
20.027290.07.070.00.4697.18561.14.96712.0242.017.8392.834.03
30.032370.02.180.00.4586.99845.86.06223.0222.018.7394.632.94
40.069050.02.180.00.4587.14754.26.06223.0222.018.7396.905.33
\n", + "
" + ], + "text/plain": [ + " CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX \\\n", + "0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 \n", + "1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 \n", + "2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 \n", + "3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 \n", + "4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 \n", + "\n", + " PTRATIO B LSTAT \n", + "0 15.3 396.90 4.98 \n", + "1 17.8 396.90 9.14 \n", + "2 17.8 392.83 4.03 \n", + "3 18.7 394.63 2.94 \n", + "4 18.7 396.90 5.33 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "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", + "
MEDV
024.0
121.6
234.7
333.4
436.2
\n", + "
" + ], + "text/plain": [ + " MEDV\n", + "0 24.0\n", + "1 21.6\n", + "2 34.7\n", + "3 33.4\n", + "4 36.2" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y.head()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -52,10 +437,12 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=666)" + ] }, { "cell_type": "markdown", @@ -66,10 +453,318 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "lr = LinearRegression()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LinearRegression()" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lr.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "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", + "
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTAT
3070.0493233.02.180.00.4726.84970.33.18277.0222.018.4396.907.53
3210.181590.07.380.00.4936.37654.34.54045.0287.019.6396.906.87
1180.130580.010.010.00.5475.87273.12.47756.0432.017.8338.6315.37
4940.279570.09.690.00.5855.92642.62.38176.0391.019.2396.9013.59
550.0131190.01.220.00.4037.24921.98.69665.0226.017.9395.934.81
\n", + "
" + ], + "text/plain": [ + " CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX \\\n", + "307 0.04932 33.0 2.18 0.0 0.472 6.849 70.3 3.1827 7.0 222.0 \n", + "321 0.18159 0.0 7.38 0.0 0.493 6.376 54.3 4.5404 5.0 287.0 \n", + "118 0.13058 0.0 10.01 0.0 0.547 5.872 73.1 2.4775 6.0 432.0 \n", + "494 0.27957 0.0 9.69 0.0 0.585 5.926 42.6 2.3817 6.0 391.0 \n", + "55 0.01311 90.0 1.22 0.0 0.403 7.249 21.9 8.6966 5.0 226.0 \n", + "\n", + " PTRATIO B LSTAT \n", + "307 18.4 396.90 7.53 \n", + "321 19.6 396.90 6.87 \n", + "118 17.8 338.63 15.37 \n", + "494 19.2 396.90 13.59 \n", + "55 17.9 395.93 4.81 " + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_test.sample(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "y_pred = lr.predict(X_test).round(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[27.1],\n", + " [23. ],\n", + " [27. ],\n", + " [34.7],\n", + " [22.9],\n", + " [21.3],\n", + " [15.7],\n", + " [23.7],\n", + " [24.9],\n", + " [18.9]])" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_pred[:10]" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "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", + "
MEDV
8123.9
45317.8
31122.1
29137.3
36025.0
5019.7
12716.2
3518.9
25229.6
44218.4
\n", + "
" + ], + "text/plain": [ + " MEDV\n", + "81 23.9\n", + "453 17.8\n", + "311 22.1\n", + "291 37.3\n", + "360 25.0\n", + "50 19.7\n", + "127 16.2\n", + "35 18.9\n", + "252 29.6\n", + "442 18.4" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_test[:10]" + ] }, { "cell_type": "markdown", @@ -80,10 +775,187 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.633" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "metrics.r2_score(y_test, y_pred).round(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "y_pred_fake = lr.predict(X_train).round(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[27. ],\n", + " [13.4],\n", + " [17. ],\n", + " [22.6],\n", + " [15.6],\n", + " [25.3],\n", + " [22.9],\n", + " [23.5],\n", + " [36.2],\n", + " [22.1]])" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_pred_fake[:10]" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "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", + "
MEDV
28723.2
46619.0
1717.5
18426.4
1820.2
21821.5
4421.2
31219.4
9738.7
47921.4
\n", + "
" + ], + "text/plain": [ + " MEDV\n", + "287 23.2\n", + "466 19.0\n", + "17 17.5\n", + "184 26.4\n", + "18 20.2\n", + "218 21.5\n", + "44 21.2\n", + "312 19.4\n", + "97 38.7\n", + "479 21.4" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_train[:10]" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.761" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "metrics.r2_score(y_train, y_pred_fake).round(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "# the train one is like 10% more accurate than the test, still pretty shitty tho" + ] }, { "cell_type": "markdown", @@ -94,10 +966,45 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "27.24" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "metrics.mean_squared_error(y_test, y_pred).round(3)\n", + "# test" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "20.802" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "metrics.mean_squared_error(y_train, y_pred_fake).round(3)\n", + "# train" + ] }, { "cell_type": "markdown", @@ -108,10 +1015,45 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "3.629" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "metrics.mean_absolute_error(y_test, y_pred).round(3)\n", + "# test" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3.216" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "metrics.mean_absolute_error(y_train, y_pred_fake).round(3)\n", + "# train" + ] }, { "cell_type": "markdown", @@ -122,7 +1064,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 76, "metadata": {}, "outputs": [], "source": [ @@ -136,6 +1078,291 @@ "data = pd.concat([X, y], axis=1)" ] }, + { + "cell_type": "code", + "execution_count": 77, + "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", + "
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)class
05.13.51.40.20
14.93.01.40.20
24.73.21.30.20
34.63.11.50.20
45.03.61.40.20
\n", + "
" + ], + "text/plain": [ + " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\n", + "0 5.1 3.5 1.4 0.2 \n", + "1 4.9 3.0 1.4 0.2 \n", + "2 4.7 3.2 1.3 0.2 \n", + "3 4.6 3.1 1.5 0.2 \n", + "4 5.0 3.6 1.4 0.2 \n", + "\n", + " class \n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 " + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "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", + "
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)
05.13.51.40.2
14.93.01.40.2
24.73.21.30.2
34.63.11.50.2
45.03.61.40.2
\n", + "
" + ], + "text/plain": [ + " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)\n", + "0 5.1 3.5 1.4 0.2\n", + "1 4.9 3.0 1.4 0.2\n", + "2 4.7 3.2 1.3 0.2\n", + "3 4.6 3.1 1.5 0.2\n", + "4 5.0 3.6 1.4 0.2" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "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", + "
class
00
10
20
30
40
\n", + "
" + ], + "text/plain": [ + " class\n", + "0 0\n", + "1 0\n", + "2 0\n", + "3 0\n", + "4 0" + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0, 1, 2])" + ] + }, + "execution_count": 80, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y['class'].unique()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -147,10 +1374,12 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 81, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=666)" + ] }, { "cell_type": "markdown", @@ -161,10 +1390,111 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 82, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "log = LogisticRegression()" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/jorge_solana/anaconda3/lib/python3.8/site-packages/sklearn/utils/validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n", + "/home/jorge_solana/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/_logistic.py:763: ConvergenceWarning: lbfgs failed to converge (status=1):\n", + "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", + "\n", + "Increase the number of iterations (max_iter) or scale the data as shown in:\n", + " https://scikit-learn.org/stable/modules/preprocessing.html\n", + "Please also refer to the documentation for alternative solver options:\n", + " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", + " n_iter_i = _check_optimize_result(\n" + ] + }, + { + "data": { + "text/plain": [ + "LogisticRegression()" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "log.fit(\n", + " X_train,\n", + " y_train\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [], + "source": [ + "y_pred_fake = log.predict(X_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0, 0, 1, 2, 1])" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_pred_fake[:5]" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [], + "source": [ + "y_pred = log.predict(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 2, 1, 2, 0])" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_pred[:5]" + ] }, { "cell_type": "markdown", @@ -175,10 +1505,332 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 110, + "metadata": {}, + "outputs": [], + "source": [ + "df_final = X_test.join(y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 111, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "df_final[\"class_pred\"] = y_pred" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "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", + "
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)classclass_pred
665.63.04.51.511
1145.82.85.12.422
935.02.33.31.011
1015.82.75.11.922
34.63.11.50.200
\n", + "
" + ], + "text/plain": [ + " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\n", + "66 5.6 3.0 4.5 1.5 \n", + "114 5.8 2.8 5.1 2.4 \n", + "93 5.0 2.3 3.3 1.0 \n", + "101 5.8 2.7 5.1 1.9 \n", + "3 4.6 3.1 1.5 0.2 \n", + "\n", + " class class_pred \n", + "66 1 1 \n", + "114 2 2 \n", + "93 1 1 \n", + "101 2 2 \n", + "3 0 0 " + ] + }, + "execution_count": 112, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": {}, + "outputs": [], + "source": [ + "df_final[\"correct\"] = df_final['class'] == df_final.class_pred" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "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", + "
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)classclass_predcorrect
1257.23.26.01.822True
1476.53.05.22.022True
675.82.74.11.011True
555.72.84.51.311True
315.43.41.50.400True
\n", + "
" + ], + "text/plain": [ + " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\n", + "125 7.2 3.2 6.0 1.8 \n", + "147 6.5 3.0 5.2 2.0 \n", + "67 5.8 2.7 4.1 1.0 \n", + "55 5.7 2.8 4.5 1.3 \n", + "31 5.4 3.4 1.5 0.4 \n", + "\n", + " class class_pred correct \n", + "125 2 2 True \n", + "147 2 2 True \n", + "67 1 1 True \n", + "55 1 1 True \n", + "31 0 0 True " + ] + }, + "execution_count": 117, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final.sample(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = df_final.correct.sum() / df_final.shape[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "execution_count": 119, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "accuracy" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.metrics import accuracy_score" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.975" + ] + }, + "execution_count": 122, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "accuracy_score(y_train, log.predict(X_train))" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "execution_count": 123, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "accuracy_score(y_test, log.predict(X_test))" + ] }, { "cell_type": "markdown", @@ -189,10 +1841,52 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 125, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "from sklearn.metrics import balanced_accuracy_score" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "execution_count": 126, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "balanced_accuracy_score(y_test, log.predict(X_test))" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9736842105263158" + ] + }, + "execution_count": 127, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "balanced_accuracy_score(y_train, log.predict(X_train))" + ] }, { "cell_type": "markdown", @@ -203,10 +1897,60 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 129, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, fbeta_score" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "execution_count": 141, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "precision_score(\n", + " y_true = y_test,\n", + " y_pred = log.predict(X_test),\n", + " average = \"macro\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9767441860465116" + ] + }, + "execution_count": 142, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "precision_score(\n", + " y_true = y_train,\n", + " y_pred = log.predict(X_train),\n", + " average = \"macro\"\n", + ")" + ] }, { "cell_type": "markdown", @@ -217,10 +1961,51 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 140, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "execution_count": 140, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "recall_score(\n", + " y_true=y_test,\n", + " y_pred= log.predict(X_test),\n", + " average = \"macro\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9736842105263158" + ] + }, + "execution_count": 143, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "recall_score(\n", + " y_true=y_train,\n", + " y_pred= log.predict(X_train),\n", + " average = \"macro\"\n", + ")" + ] }, { "cell_type": "markdown", @@ -231,10 +2016,51 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 144, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "execution_count": 144, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f1_score(\n", + " y_true=y_test,\n", + " y_pred=log.predict(X_test),\n", + " average='macro'\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9742531770919293" + ] + }, + "execution_count": 145, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f1_score(\n", + " y_true=y_train,\n", + " y_pred=log.predict(X_train),\n", + " average='macro'\n", + ")" + ] }, { "cell_type": "markdown", @@ -245,17 +2071,157 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 153, "metadata": {}, - "outputs": [], - "source": [] + "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", + "
col_0012
class
0800
10120
20010
\n", + "
" + ], + "text/plain": [ + "col_0 0 1 2\n", + "class \n", + "0 8 0 0\n", + "1 0 12 0\n", + "2 0 0 10" + ] + }, + "execution_count": 153, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.crosstab(y_test['class'], log.predict(X_test))" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 154, "metadata": {}, - "outputs": [], - "source": [] + "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", + "
col_0012
class
04200
10353
20040
\n", + "
" + ], + "text/plain": [ + "col_0 0 1 2\n", + "class \n", + "0 42 0 0\n", + "1 0 35 3\n", + "2 0 0 40" + ] + }, + "execution_count": 154, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.crosstab(y_train['class'], log.predict(X_train))" + ] }, { "cell_type": "markdown", @@ -263,6 +2229,84 @@ "source": [ "## Bonus: For each of the data sets in this lab, try training with some of the other models you have learned about, recalculate the evaluation metrics, and compare to determine which models perform best on each data set." ] + }, + { + "cell_type": "code", + "execution_count": 181, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9733333333333334" + ] + }, + "execution_count": 181, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.model_selection import cross_validate\n", + "from sklearn.tree import DecisionTreeClassifier\n", + "clf = DecisionTreeClassifier(random_state=666, max_depth=3)\n", + "cross_validate(clf, X, y, cv=5)['test_score'].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 183, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn import tree\n", + "iris = load_iris() \n", + "X, y = iris.data, iris.target\n", + "clf2 = tree.DecisionTreeClassifier()\n", + "clf2 = clf2.fit(X, y)" + ] + }, + { + "cell_type": "code", + "execution_count": 184, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9666666666666668" + ] + }, + "execution_count": 184, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cross_validate(clf2, X, y, cv=5)['test_score'].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "tree.plot_tree(clf2);" + ] } ], "metadata": { @@ -281,7 +2325,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.2" + "version": "3.8.8" } }, "nbformat": 4,