diff --git a/lab-logistic-regression-with-python.ipynb b/lab-logistic-regression-with-python.ipynb
index 05ead5e..aff58f1 100644
--- a/lab-logistic-regression-with-python.ipynb
+++ b/lab-logistic-regression-with-python.ipynb
@@ -123,9 +123,21 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "ename": "ModuleNotFoundError",
+ "evalue": "No module named 'piplite'",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
+ "\u001b[31mModuleNotFoundError\u001b[39m Traceback (most recent call last)",
+ "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[1]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[38;5;28;01mimport\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mpiplite\u001b[39;00m\n\u001b[32m 2\u001b[39m \u001b[38;5;28;01mawait\u001b[39;00m piplite.install([\u001b[33m'\u001b[39m\u001b[33mpandas\u001b[39m\u001b[33m'\u001b[39m])\n\u001b[32m 3\u001b[39m \u001b[38;5;28;01mawait\u001b[39;00m piplite.install([\u001b[33m'\u001b[39m\u001b[33mmatplotlib\u001b[39m\u001b[33m'\u001b[39m])\n",
+ "\u001b[31mModuleNotFoundError\u001b[39m: No module named 'piplite'"
+ ]
+ }
+ ],
"source": [
"import piplite\n",
"await piplite.install(['pandas'])\n",
@@ -150,7 +162,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"metadata": {
"button": false,
"new_sheet": false,
@@ -171,9 +183,21 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 3,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "ename": "ModuleNotFoundError",
+ "evalue": "No module named 'pyodide'",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
+ "\u001b[31mModuleNotFoundError\u001b[39m Traceback (most recent call last)",
+ "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[3]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mpyodide\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mhttp\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m pyfetch\n\u001b[32m 3\u001b[39m \u001b[38;5;28;01masync\u001b[39;00m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mdownload\u001b[39m(url, filename):\n\u001b[32m 4\u001b[39m response = \u001b[38;5;28;01mawait\u001b[39;00m pyfetch(url)\n",
+ "\u001b[31mModuleNotFoundError\u001b[39m: No module named 'pyodide'"
+ ]
+ }
+ ],
"source": [
"from pyodide.http import pyfetch\n",
"\n",
@@ -226,7 +250,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 4,
"metadata": {
"button": false,
"new_sheet": false,
@@ -262,18 +286,30 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 8,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "ename": "NameError",
+ "evalue": "name 'download' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
+ "\u001b[31mNameError\u001b[39m Traceback (most recent call last)",
+ "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[8]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[38;5;28;01mawait\u001b[39;00m \u001b[43mdownload\u001b[49m(path, \u001b[33m\"\u001b[39m\u001b[33mcsvChurnData.\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 2\u001b[39m path=\u001b[33m\"\u001b[39m\u001b[33mChurnData.csv\u001b[39m\u001b[33m\"\u001b[39m\n",
+ "\u001b[31mNameError\u001b[39m: name 'download' is not defined"
+ ]
+ }
+ ],
"source": [
"\n",
- "await download(path, \"ChurnData.csv\")\n",
+ "await download(path, \"csvChurnData.\")\n",
"path=\"ChurnData.csv\"\n"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 6,
"metadata": {
"button": false,
"new_sheet": false,
@@ -281,7 +317,518 @@
"read_only": false
}
},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.microsoft.datawrangler.viewer.v0+json": {
+ "columns": [
+ {
+ "name": "index",
+ "rawType": "int64",
+ "type": "integer"
+ },
+ {
+ "name": "tenure",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "age",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "address",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "income",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "ed",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "employ",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "equip",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "callcard",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "wireless",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "longmon",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "tollmon",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "equipmon",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "cardmon",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "wiremon",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "longten",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "tollten",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "cardten",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "voice",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "pager",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "internet",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "callwait",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "confer",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "ebill",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "loglong",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "logtoll",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "lninc",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "custcat",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "churn",
+ "rawType": "float64",
+ "type": "float"
+ }
+ ],
+ "ref": "aca5f43d-ddc9-4652-9c0a-d36728d32fd9",
+ "rows": [
+ [
+ "0",
+ "11.0",
+ "33.0",
+ "7.0",
+ "136.0",
+ "5.0",
+ "5.0",
+ "0.0",
+ "1.0",
+ "1.0",
+ "4.4",
+ "20.75",
+ "0.0",
+ "15.25",
+ "35.7",
+ "42.0",
+ "211.45",
+ "125.0",
+ "1.0",
+ "1.0",
+ "0.0",
+ "1.0",
+ "1.0",
+ "0.0",
+ "1.482",
+ "3.033",
+ "4.913",
+ "4.0",
+ "1.0"
+ ],
+ [
+ "1",
+ "33.0",
+ "33.0",
+ "12.0",
+ "33.0",
+ "2.0",
+ "0.0",
+ "0.0",
+ "0.0",
+ "0.0",
+ "9.45",
+ "0.0",
+ "0.0",
+ "0.0",
+ "0.0",
+ "288.8",
+ "0.0",
+ "0.0",
+ "0.0",
+ "0.0",
+ "0.0",
+ "0.0",
+ "0.0",
+ "0.0",
+ "2.246",
+ "3.24",
+ "3.497",
+ "1.0",
+ "1.0"
+ ],
+ [
+ "2",
+ "23.0",
+ "30.0",
+ "9.0",
+ "30.0",
+ "1.0",
+ "2.0",
+ "0.0",
+ "0.0",
+ "0.0",
+ "6.3",
+ "0.0",
+ "0.0",
+ "0.0",
+ "0.0",
+ "157.05",
+ "0.0",
+ "0.0",
+ "0.0",
+ "0.0",
+ "0.0",
+ "0.0",
+ "1.0",
+ "0.0",
+ "1.841",
+ "3.24",
+ "3.401",
+ "3.0",
+ "0.0"
+ ],
+ [
+ "3",
+ "38.0",
+ "35.0",
+ "5.0",
+ "76.0",
+ "2.0",
+ "10.0",
+ "1.0",
+ "1.0",
+ "1.0",
+ "6.05",
+ "45.0",
+ "50.1",
+ "23.25",
+ "64.9",
+ "239.55",
+ "1873.05",
+ "880.0",
+ "1.0",
+ "1.0",
+ "1.0",
+ "1.0",
+ "1.0",
+ "1.0",
+ "1.8",
+ "3.807",
+ "4.331",
+ "4.0",
+ "0.0"
+ ],
+ [
+ "4",
+ "7.0",
+ "35.0",
+ "14.0",
+ "80.0",
+ "2.0",
+ "15.0",
+ "0.0",
+ "1.0",
+ "0.0",
+ "7.1",
+ "22.0",
+ "0.0",
+ "23.75",
+ "0.0",
+ "47.45",
+ "166.1",
+ "145.0",
+ "1.0",
+ "0.0",
+ "0.0",
+ "1.0",
+ "1.0",
+ "0.0",
+ "1.96",
+ "3.091",
+ "4.382",
+ "3.0",
+ "0.0"
+ ]
+ ],
+ "shape": {
+ "columns": 28,
+ "rows": 5
+ }
+ },
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " tenure \n",
+ " age \n",
+ " address \n",
+ " income \n",
+ " ed \n",
+ " employ \n",
+ " equip \n",
+ " callcard \n",
+ " wireless \n",
+ " longmon \n",
+ " ... \n",
+ " pager \n",
+ " internet \n",
+ " callwait \n",
+ " confer \n",
+ " ebill \n",
+ " loglong \n",
+ " logtoll \n",
+ " lninc \n",
+ " custcat \n",
+ " churn \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 11.0 \n",
+ " 33.0 \n",
+ " 7.0 \n",
+ " 136.0 \n",
+ " 5.0 \n",
+ " 5.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 4.40 \n",
+ " ... \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.482 \n",
+ " 3.033 \n",
+ " 4.913 \n",
+ " 4.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 33.0 \n",
+ " 33.0 \n",
+ " 12.0 \n",
+ " 33.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 9.45 \n",
+ " ... \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 2.246 \n",
+ " 3.240 \n",
+ " 3.497 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 23.0 \n",
+ " 30.0 \n",
+ " 9.0 \n",
+ " 30.0 \n",
+ " 1.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 6.30 \n",
+ " ... \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.841 \n",
+ " 3.240 \n",
+ " 3.401 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 38.0 \n",
+ " 35.0 \n",
+ " 5.0 \n",
+ " 76.0 \n",
+ " 2.0 \n",
+ " 10.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 6.05 \n",
+ " ... \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 1.800 \n",
+ " 3.807 \n",
+ " 4.331 \n",
+ " 4.0 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 7.0 \n",
+ " 35.0 \n",
+ " 14.0 \n",
+ " 80.0 \n",
+ " 2.0 \n",
+ " 15.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 7.10 \n",
+ " ... \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.960 \n",
+ " 3.091 \n",
+ " 4.382 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
5 rows × 28 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " tenure age address income ed employ equip callcard wireless \\\n",
+ "0 11.0 33.0 7.0 136.0 5.0 5.0 0.0 1.0 1.0 \n",
+ "1 33.0 33.0 12.0 33.0 2.0 0.0 0.0 0.0 0.0 \n",
+ "2 23.0 30.0 9.0 30.0 1.0 2.0 0.0 0.0 0.0 \n",
+ "3 38.0 35.0 5.0 76.0 2.0 10.0 1.0 1.0 1.0 \n",
+ "4 7.0 35.0 14.0 80.0 2.0 15.0 0.0 1.0 0.0 \n",
+ "\n",
+ " longmon ... pager internet callwait confer ebill loglong logtoll \\\n",
+ "0 4.40 ... 1.0 0.0 1.0 1.0 0.0 1.482 3.033 \n",
+ "1 9.45 ... 0.0 0.0 0.0 0.0 0.0 2.246 3.240 \n",
+ "2 6.30 ... 0.0 0.0 0.0 1.0 0.0 1.841 3.240 \n",
+ "3 6.05 ... 1.0 1.0 1.0 1.0 1.0 1.800 3.807 \n",
+ "4 7.10 ... 0.0 0.0 1.0 1.0 0.0 1.960 3.091 \n",
+ "\n",
+ " lninc custcat churn \n",
+ "0 4.913 4.0 1.0 \n",
+ "1 3.497 1.0 1.0 \n",
+ "2 3.401 3.0 0.0 \n",
+ "3 4.331 4.0 0.0 \n",
+ "4 4.382 3.0 0.0 \n",
+ "\n",
+ "[5 rows x 28 columns]"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"churn_df = pd.read_csv(path)\n",
"churn_df.head()"
@@ -303,9 +850,264 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 9,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.microsoft.datawrangler.viewer.v0+json": {
+ "columns": [
+ {
+ "name": "index",
+ "rawType": "int64",
+ "type": "integer"
+ },
+ {
+ "name": "tenure",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "age",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "address",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "income",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "ed",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "employ",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "equip",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "callcard",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "wireless",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "churn",
+ "rawType": "int64",
+ "type": "integer"
+ }
+ ],
+ "ref": "f5eba40e-4da5-41f2-ab8a-1d57bc80f4a2",
+ "rows": [
+ [
+ "0",
+ "11.0",
+ "33.0",
+ "7.0",
+ "136.0",
+ "5.0",
+ "5.0",
+ "0.0",
+ "1.0",
+ "1.0",
+ "1"
+ ],
+ [
+ "1",
+ "33.0",
+ "33.0",
+ "12.0",
+ "33.0",
+ "2.0",
+ "0.0",
+ "0.0",
+ "0.0",
+ "0.0",
+ "1"
+ ],
+ [
+ "2",
+ "23.0",
+ "30.0",
+ "9.0",
+ "30.0",
+ "1.0",
+ "2.0",
+ "0.0",
+ "0.0",
+ "0.0",
+ "0"
+ ],
+ [
+ "3",
+ "38.0",
+ "35.0",
+ "5.0",
+ "76.0",
+ "2.0",
+ "10.0",
+ "1.0",
+ "1.0",
+ "1.0",
+ "0"
+ ],
+ [
+ "4",
+ "7.0",
+ "35.0",
+ "14.0",
+ "80.0",
+ "2.0",
+ "15.0",
+ "0.0",
+ "1.0",
+ "0.0",
+ "0"
+ ]
+ ],
+ "shape": {
+ "columns": 10,
+ "rows": 5
+ }
+ },
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " tenure \n",
+ " age \n",
+ " address \n",
+ " income \n",
+ " ed \n",
+ " employ \n",
+ " equip \n",
+ " callcard \n",
+ " wireless \n",
+ " churn \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 11.0 \n",
+ " 33.0 \n",
+ " 7.0 \n",
+ " 136.0 \n",
+ " 5.0 \n",
+ " 5.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 33.0 \n",
+ " 33.0 \n",
+ " 12.0 \n",
+ " 33.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 23.0 \n",
+ " 30.0 \n",
+ " 9.0 \n",
+ " 30.0 \n",
+ " 1.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 38.0 \n",
+ " 35.0 \n",
+ " 5.0 \n",
+ " 76.0 \n",
+ " 2.0 \n",
+ " 10.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 7.0 \n",
+ " 35.0 \n",
+ " 14.0 \n",
+ " 80.0 \n",
+ " 2.0 \n",
+ " 15.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " tenure age address income ed employ equip callcard wireless \\\n",
+ "0 11.0 33.0 7.0 136.0 5.0 5.0 0.0 1.0 1.0 \n",
+ "1 33.0 33.0 12.0 33.0 2.0 0.0 0.0 0.0 0.0 \n",
+ "2 23.0 30.0 9.0 30.0 1.0 2.0 0.0 0.0 0.0 \n",
+ "3 38.0 35.0 5.0 76.0 2.0 10.0 1.0 1.0 1.0 \n",
+ "4 7.0 35.0 14.0 80.0 2.0 15.0 0.0 1.0 0.0 \n",
+ "\n",
+ " churn \n",
+ "0 1 \n",
+ "1 1 \n",
+ "2 0 \n",
+ "3 0 \n",
+ "4 0 "
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"churn_df = churn_df[['tenure', 'age', 'address', 'income', 'ed', 'employ', 'equip', 'callcard', 'wireless','churn']]\n",
"churn_df['churn'] = churn_df['churn'].astype('int')\n",
@@ -329,7 +1131,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 12,
"metadata": {
"button": false,
"new_sheet": false,
@@ -337,9 +1139,19 @@
"read_only": false
}
},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Number of columns and rows: (200, 10)\n",
+ "Name of the columns: ['tenure', 'age', 'address', 'income', 'ed', 'employ', 'equip', 'callcard', 'wireless', 'churn']\n"
+ ]
+ }
+ ],
"source": [
- "# write your code here\n"
+ "print(\"Number of columns and rows:\", churn_df.shape)\n",
+ "print(\"Name of the columns:\", churn_df.columns.tolist())\n"
]
},
{
@@ -365,9 +1177,24 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 13,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[ 11., 33., 7., 136., 5., 5., 0.],\n",
+ " [ 33., 33., 12., 33., 2., 0., 0.],\n",
+ " [ 23., 30., 9., 30., 1., 2., 0.],\n",
+ " [ 38., 35., 5., 76., 2., 10., 1.],\n",
+ " [ 7., 35., 14., 80., 2., 15., 0.]])"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"X = np.asarray(churn_df[['tenure', 'age', 'address', 'income', 'ed', 'employ', 'equip']])\n",
"X[0:5]"
@@ -375,9 +1202,20 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 14,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([1, 1, 0, 0, 0])"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"y = np.asarray(churn_df['churn'])\n",
"y [0:5]"
@@ -392,9 +1230,29 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 15,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[-1.13518441, -0.62595491, -0.4588971 , 0.4751423 , 1.6961288 ,\n",
+ " -0.58477841, -0.85972695],\n",
+ " [-0.11604313, -0.62595491, 0.03454064, -0.32886061, -0.6433592 ,\n",
+ " -1.14437497, -0.85972695],\n",
+ " [-0.57928917, -0.85594447, -0.261522 , -0.35227817, -1.42318853,\n",
+ " -0.92053635, -0.85972695],\n",
+ " [ 0.11557989, -0.47262854, -0.65627219, 0.00679109, -0.6433592 ,\n",
+ " -0.02518185, 1.16316 ],\n",
+ " [-1.32048283, -0.47262854, 0.23191574, 0.03801451, -0.6433592 ,\n",
+ " 0.53441472, -0.85972695]])"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"from sklearn import preprocessing\n",
"X = preprocessing.StandardScaler().fit(X).transform(X)\n",
@@ -417,9 +1275,18 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 16,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Train set: (160, 7) (160,)\n",
+ "Test set: (40, 7) (40,)\n"
+ ]
+ }
+ ],
"source": [
"from sklearn.model_selection import train_test_split\n",
"X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=4)\n",
@@ -447,9 +1314,702 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 17,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "LogisticRegression(C=0.01, solver='liblinear') In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org. \n",
+ "
\n",
+ "
\n",
+ " Parameters \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " penalty \n",
+ " 'l2' \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " dual \n",
+ " False \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " tol \n",
+ " 0.0001 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " C \n",
+ " 0.01 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " fit_intercept \n",
+ " True \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " intercept_scaling \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " class_weight \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " random_state \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " solver \n",
+ " 'liblinear' \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " max_iter \n",
+ " 100 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " multi_class \n",
+ " 'deprecated' \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " verbose \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " warm_start \n",
+ " False \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " n_jobs \n",
+ " None \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " l1_ratio \n",
+ " None \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "LogisticRegression(C=0.01, solver='liblinear')"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.metrics import confusion_matrix\n",
@@ -466,9 +2026,21 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 18,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0,\n",
+ " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0])"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"yhat = LR.predict(X_test)\n",
"yhat"
@@ -483,9 +2055,59 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 19,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[0.54132919, 0.45867081],\n",
+ " [0.60593357, 0.39406643],\n",
+ " [0.56277713, 0.43722287],\n",
+ " [0.63432489, 0.36567511],\n",
+ " [0.56431839, 0.43568161],\n",
+ " [0.55386646, 0.44613354],\n",
+ " [0.52237207, 0.47762793],\n",
+ " [0.60514349, 0.39485651],\n",
+ " [0.41069572, 0.58930428],\n",
+ " [0.6333873 , 0.3666127 ],\n",
+ " [0.58068791, 0.41931209],\n",
+ " [0.62768628, 0.37231372],\n",
+ " [0.47559883, 0.52440117],\n",
+ " [0.4267593 , 0.5732407 ],\n",
+ " [0.66172417, 0.33827583],\n",
+ " [0.55092315, 0.44907685],\n",
+ " [0.51749946, 0.48250054],\n",
+ " [0.485743 , 0.514257 ],\n",
+ " [0.49011451, 0.50988549],\n",
+ " [0.52423349, 0.47576651],\n",
+ " [0.61619519, 0.38380481],\n",
+ " [0.52696302, 0.47303698],\n",
+ " [0.63957168, 0.36042832],\n",
+ " [0.52205164, 0.47794836],\n",
+ " [0.50572852, 0.49427148],\n",
+ " [0.70706202, 0.29293798],\n",
+ " [0.55266286, 0.44733714],\n",
+ " [0.52271594, 0.47728406],\n",
+ " [0.51638863, 0.48361137],\n",
+ " [0.71331391, 0.28668609],\n",
+ " [0.67862111, 0.32137889],\n",
+ " [0.50896403, 0.49103597],\n",
+ " [0.42348082, 0.57651918],\n",
+ " [0.71495838, 0.28504162],\n",
+ " [0.59711064, 0.40288936],\n",
+ " [0.63808839, 0.36191161],\n",
+ " [0.39957895, 0.60042105],\n",
+ " [0.52127638, 0.47872362],\n",
+ " [0.65975464, 0.34024536],\n",
+ " [0.5114172 , 0.4885828 ]])"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"yhat_prob = LR.predict_proba(X_test)\n",
"yhat_prob"
@@ -509,9 +2131,20 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 20,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.7058823529411765"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"from sklearn.metrics import jaccard_score\n",
"jaccard_score(y_test, yhat,pos_label=0)"
@@ -528,9 +2161,18 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 21,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[[ 6 9]\n",
+ " [ 1 24]]\n"
+ ]
+ }
+ ],
"source": [
"from sklearn.metrics import classification_report, confusion_matrix\n",
"import itertools\n",
@@ -572,9 +2214,29 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 22,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Confusion matrix, without normalization\n",
+ "[[ 6 9]\n",
+ " [ 1 24]]\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
"source": [
"# Compute confusion matrix\n",
"cnf_matrix = confusion_matrix(y_test, yhat, labels=[1,0])\n",
@@ -604,9 +2266,25 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 23,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " precision recall f1-score support\n",
+ "\n",
+ " 0 0.73 0.96 0.83 25\n",
+ " 1 0.86 0.40 0.55 15\n",
+ "\n",
+ " accuracy 0.75 40\n",
+ " macro avg 0.79 0.68 0.69 40\n",
+ "weighted avg 0.78 0.75 0.72 40\n",
+ "\n"
+ ]
+ }
+ ],
"source": [
"print (classification_report(y_test, yhat))\n"
]
@@ -643,9 +2321,20 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 24,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.6017092478101185"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"from sklearn.metrics import log_loss\n",
"log_loss(y_test, yhat_prob)"
@@ -661,11 +2350,25 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 27,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "LogLoss: 0.61\n"
+ ]
+ }
+ ],
"source": [
- "# write your code here\n",
+ "from sklearn.linear_model import LogisticRegression\n",
+ "from sklearn.metrics import log_loss\n",
+ "\n",
+ "LR2 = LogisticRegression(C=0.01, solver='sag', max_iter=1000).fit(X_train, y_train)\n",
+ "yhat_prob2 = LR2.predict_proba(X_test)\n",
+ "\n",
+ "print(\"LogLoss: %.2f\" % log_loss(y_test, yhat_prob2))\n",
"\n"
]
},
@@ -695,7 +2398,7 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3 (ipykernel)",
+ "display_name": "Python 3",
"language": "python",
"name": "python3"
},
@@ -709,7 +2412,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.11.8"
+ "version": "3.11.9"
},
"widgets": {
"state": {},