From 050664ee0ea830bfd62fe3a4c87546d6e37d2888 Mon Sep 17 00:00:00 2001 From: Raghad <128425356+RaghadAlmutairi@users.noreply.github.com> Date: Mon, 3 Mar 2025 00:31:04 +0300 Subject: [PATCH] Add files via upload --- lab-logistic-regression-with-python.ipynb | 1063 ++++++++++++++++++++- 1 file changed, 1024 insertions(+), 39 deletions(-) diff --git a/lab-logistic-regression-with-python.ipynb b/lab-logistic-regression-with-python.ipynb index 05ead5e..62079da 100644 --- a/lab-logistic-regression-with-python.ipynb +++ b/lab-logistic-regression-with-python.ipynb @@ -150,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "button": false, "new_sheet": false, @@ -184,6 +184,21 @@ " f.write(await response.bytes())\n" ] }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "\n", + "def download(url, filename):\n", + " response = requests.get(url)\n", + " if response.status_code == 200:\n", + " with open(filename, \"wb\") as f:\n", + " f.write(response.content)\n" + ] + }, { "cell_type": "markdown", "metadata": { @@ -226,7 +241,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": { "button": false, "new_sheet": false, @@ -262,12 +277,12 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "\n", - "await download(path, \"ChurnData.csv\")\n", + "download(path, \"ChurnData.csv\")\n", "path=\"ChurnData.csv\"\n" ] }, @@ -281,7 +296,207 @@ "read_only": false } }, - "outputs": [], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
tenureageaddressincomeedemployequipcallcardwirelesslongmon...pagerinternetcallwaitconferebillloglonglogtolllninccustcatchurn
011.033.07.0136.05.05.00.01.01.04.40...1.00.01.01.00.01.4823.0334.9134.01.0
133.033.012.033.02.00.00.00.00.09.45...0.00.00.00.00.02.2463.2403.4971.01.0
223.030.09.030.01.02.00.00.00.06.30...0.00.00.01.00.01.8413.2403.4013.00.0
338.035.05.076.02.010.01.01.01.06.05...1.01.01.01.01.01.8003.8074.3314.00.0
47.035.014.080.02.015.00.01.00.07.10...0.00.01.01.00.01.9603.0914.3823.00.0
\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": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "churn_df = pd.read_csv(path)\n", "churn_df.head()" @@ -303,9 +518,133 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "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", + "
tenureageaddressincomeedemployequipcallcardwirelesschurn
011.033.07.0136.05.05.00.01.01.01
133.033.012.033.02.00.00.00.00.01
223.030.09.030.01.02.00.00.00.00
338.035.05.076.02.010.01.01.01.00
47.035.014.080.02.015.00.01.00.00
\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": 6, + "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 +668,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": { "button": false, "new_sheet": false, @@ -337,9 +676,43 @@ "read_only": false } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(200, 10)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# write your code here\n" + "# write your code here\n", + "churn_df.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['tenure', 'age', 'address', 'income', 'ed', 'employ', 'equip',\n", + " 'callcard', 'wireless', 'churn'],\n", + " dtype='object')" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "churn_df.columns" ] }, { @@ -365,9 +738,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "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": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "X = np.asarray(churn_df[['tenure', 'age', 'address', 'income', 'ed', 'employ', 'equip']])\n", "X[0:5]" @@ -375,9 +763,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 1, 0, 0, 0])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "y = np.asarray(churn_df['churn'])\n", "y [0:5]" @@ -392,9 +791,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "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": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from sklearn import preprocessing\n", "X = preprocessing.StandardScaler().fit(X).transform(X)\n", @@ -417,9 +836,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "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 +875,427 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "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.
" + ], + "text/plain": [ + "LogisticRegression(C=0.01, solver='liblinear')" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from sklearn.linear_model import LogisticRegression\n", "from sklearn.metrics import confusion_matrix\n", @@ -466,9 +1312,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "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": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "yhat = LR.predict(X_test)\n", "yhat" @@ -483,9 +1341,59 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "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": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "yhat_prob = LR.predict_proba(X_test)\n", "yhat_prob" @@ -509,9 +1417,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "0.7058823529411765" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from sklearn.metrics import jaccard_score\n", "jaccard_score(y_test, yhat,pos_label=0)" @@ -528,9 +1447,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "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 +1500,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "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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Hp+T188SERHh8jogIEDBwcEKDAzMsf7SpUvO12vWrFHfvn116623avny5UpISNDu3bv14IMPuuyXF+4kFw6HQwMGDNClS5fUqFEjdezY0a1zAUUJyQngQcWKFVOHDh20d+/eHANac5P9B/rHH3/Mse3kyZMqXbq0x2LL/qOdlpbmsv7341okqU2bNtqwYYPOnj2rXbt2qUWLFho9erTefPPNax6/VKlS1/wckjz6WfJj+fLlqly5slatWqUePXqoefPmatKkSY7fS164MzPnm2++0VNPPaWmTZvqiy++0OzZs90+H1BUkJwAHjZx4kSZpqnhw4fnOoD08uXL2rBhgyTpjjvukCTngNZsu3fv1qFDh9ShQwePxVWpUiVJV24Od7XsWHJTrFgxNWvWTM8//7wk6Ysvvrjmvh06dNDWrVudyUi21157TcHBwWrevPlNRu5ZhmEoICDAJbFITk7OMVtH8lxVKjU1VX369FGlSpW0bds2Pfroo/rrX/+qzz77LN/HBnxRcW8HAPiaFi1aaNGiRRo5cqQaN26sESNGqG7durp8+bL27dunl156SfXq1VO3bt1Us2ZNPfTQQ3ruuefk5+enLl26KCkpSZMnT1b58uX1l7/8xWNx3X333YqIiNDQoUP197//XcWLF9fSpUt14sQJl/1eeOEFbd26VV27dlWFChV06dIlvfrqq5KkO++885rHnzJlijZu3Kj27dvrqaeeUkREhN544w29++67mjVrlsLDwz32WfLjnnvu0Zo1azRy5Ej17t1bJ06c0NNPP63o6Gh9++23LvvWr19f27dv14YNGxQdHa3Q0FDVrFnT7XM+8sgjOn78uD7//HOFhITo2WefVUJCgvr37699+/apZMmSHvp0gG8gOQEKwPDhw3X77bdrzpw5mjlzppKTk+Xv768aNWpowIABevTRR537Llq0SFWrVtUrr7yi559/XuHh4brrrrsUHx+f6xiTmxUWFqZNmzZp9OjRGjhwoEqWLKlhw4apS5cuGjZsmHO/Ro0a6YMPPtCUKVOUnJysEiVKqF69enrnnXfUqVOnax6/Zs2a+vTTT/Xkk09q1KhRunjxomrXrq0lS5bkGPDrTUOGDNGpU6f0wgsv6NVXX1WVKlX017/+Vd9//72mTp3qsu+8efM0atQo9e/fXxcuXFDbtm21fft2t8738ssva/ny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c9b8m0NyYhHnzp2TJFWrXN7LkQAAbsa5c+cUHh5e4OcJCAhQVFSUqnvo70VUVJQCAgI8cixPMczCTvWQq6ysLJ08eVKhoaEyrDrx3IekpKSofPnyOnHihMLCwrwdDuBRXN+FyzRNnTt3TjExMfLzK5yhnJcuXVJ6umeqkQEBAQoMDPTIsTyFyolF+Pn5qVy5ct4Oo8gJCwvjyxs+i+u78BRGxeRqgYGBlksoPInZOgAAwFJITgAAgKWQnKBIcjgcmjJlihwOh7dDATyO6xt2x4BYAABgKVROAACApZCcAAAASyE5AQAAlkJyAgAALIXkBAAAWArJCQAAsBSSE+AmMQsfviQrK8vbIQBOPFsHyKOsrCz5+fnp0qVLCgwMlGEYMk2TBzXC9rKv7f/9739KSkpSVlaWKleurKioKEniOkeho3IC5EH2l/d//vMfPfroo/roo48kyZmgAHZlmqb8/Pz09ddfq2nTpnr44YfVtm1b9e3bV88884wkrnMUPionQB74+fnp6NGj6ty5s06cOKFz584pICBAzZs3p4ICWzMMQz/99JPuvfde9e7dW+PHj9fRo0e1fv16zZgxQydPntTs2bO5zlGoqJwAeZCenq6FCxeqWbNmWrt2rfbv369Zs2Zp165dkviXJezt5MmTcjgcGjVqlKKiotSyZUuNHz9e06ZN04svvqgnn3xSkkhMUGhIToA88PPz05133qnu3bure/fueuutt3TgwIHrJigkK7ALf39/JSUl6cCBA851pUqV0oABAxQfH68333xTa9as8WKEKGpIToA8KF68uNq1a6f77rtPktSwYUOtXLlSBw4c0MyZM10SlM8//9z5M2AHkZGRat26tTZs2KAffvjBuT40NFS9evVS1apVtXv3bi9GiKKG5AS4gewKSGBgoPN1VlaWbrvtNq1cuVIHDx7UrFmztHPnTj3++OMaMmSIfvnlF2+GDORJ9rUdERGhgQMHatWqVXrllVf0888/O/e59dZbVaNGDSUkJCgjI8NboaKIYUAscB0ZGRkqXtz1/yaGYcgwDGVmZjoTlIEDB6pnz546f/68du7cqVtuucVLEQN5k31tZ89Eu//++3XmzBmNHTtWly9f1n333adatWpJklJTU1W1alWqgSg0hkljHMjV1V/e/fr10/33368//vGPkv7/vg/ZX+x9+/bVhx9+qI8+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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 +1552,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "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 +1607,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "0.6017092478101187" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from sklearn.metrics import log_loss\n", "log_loss(y_test, yhat_prob)" @@ -661,12 +1636,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "LogLoss: : 0.61\n" + ] + } + ], "source": [ "# write your code here\n", - "\n" + "LR2 = LogisticRegression(C=0.01, solver='sag').fit(X_train,y_train)\n", + "yhat_prob2 = LR2.predict_proba(X_test)\n", + "print (\"LogLoss: : %.2f\" % log_loss(y_test, yhat_prob2))\n" ] }, { @@ -695,7 +1680,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "base", "language": "python", "name": "python3" }, @@ -709,7 +1694,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.8" + "version": "3.12.4" }, "widgets": { "state": {},