{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Logistic regression with scikit-learn: heart disease data set" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Read data " ] }, { "cell_type": "code", "execution_count": 2, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agesexcptrestbpscholfbsrestecgthalachexangoldpeakslopecathaltarget
063131452331015002.30011
137121302500118703.50021
241011302040017201.42021
356111202360117800.82021
457001203540116310.62021
.............................................
29857001402410112310.21030
29945131102640113201.21030
30068101441931114103.41230
30157101301310111511.21130
30257011302360017400.01120
\n", "

303 rows × 14 columns

\n", "
" ], "text/plain": [ " age sex cp trestbps chol fbs restecg thalach exang oldpeak \\\n", "0 63 1 3 145 233 1 0 150 0 2.3 \n", "1 37 1 2 130 250 0 1 187 0 3.5 \n", "2 41 0 1 130 204 0 0 172 0 1.4 \n", "3 56 1 1 120 236 0 1 178 0 0.8 \n", "4 57 0 0 120 354 0 1 163 1 0.6 \n", ".. ... ... .. ... ... ... ... ... ... ... \n", "298 57 0 0 140 241 0 1 123 1 0.2 \n", "299 45 1 3 110 264 0 1 132 0 1.2 \n", "300 68 1 0 144 193 1 1 141 0 3.4 \n", "301 57 1 0 130 131 0 1 115 1 1.2 \n", "302 57 0 1 130 236 0 0 174 0 0.0 \n", "\n", " slope ca thal target \n", "0 0 0 1 1 \n", "1 0 0 2 1 \n", "2 2 0 2 1 \n", "3 2 0 2 1 \n", "4 2 0 2 1 \n", ".. ... .. ... ... \n", "298 1 0 3 0 \n", "299 1 0 3 0 \n", "300 1 2 3 0 \n", "301 1 1 3 0 \n", "302 1 1 2 0 \n", "\n", "[303 rows x 14 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# filename = \"heart.csv\"\n", "filename = \"https://www.physi.uni-heidelberg.de/~reygers/lectures/2021/ml/data/heart.csv\"\n", "df = pd.read_csv(filename)\n", "df" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "y = df['target'].values\n", "X = df[[col for col in df.columns if col!=\"target\"]]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "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.5, shuffle=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Fit the model" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/local/home/marks/anaconda3/envs/myML/lib/python3.8/site-packages/sklearn/linear_model/_logistic.py:1173: FutureWarning: `penalty='none'`has been deprecated in 1.2 and will be removed in 1.4. To keep the past behaviour, set `penalty=None`.\n", " warnings.warn(\n" ] }, { "data": { "text/html": [ "
LogisticRegression(max_iter=5000, penalty='none', tol=1e-05)
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(max_iter=5000, penalty='none', tol=1e-05)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.linear_model import LogisticRegression\n", "lr = LogisticRegression(penalty='none', fit_intercept=True, max_iter=5000, tol=1E-5)\n", "lr.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Test predictions on test data set" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.82 0.76 0.79 76\n", " 1 0.78 0.83 0.80 76\n", "\n", " accuracy 0.80 152\n", " macro avg 0.80 0.80 0.80 152\n", "weighted avg 0.80 0.80 0.80 152\n", "\n" ] } ], "source": [ "from sklearn.metrics import classification_report\n", "y_pred_lr = lr.predict(X_test)\n", "print(classification_report(y_test, y_pred_lr))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Compare two classifiers using the ROC curve" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "from sklearn.ensemble import RandomForestClassifier\n", "rf = RandomForestClassifier(max_depth=3)\n", "rf.fit(X_train, y_train)\n", "y_pred_rf = rf.predict(X_test)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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mtf5qN5WWlrasKiIiIiIzEyWVeSJiIiI7A2TICIiInJIDZ4nKDc3t9YV4iVJqrUPF1AlIiIia2pwEsQZoYmIiMieNSgJmj17ttxxEBEREVkUkyAiIiJySCyMJiIiIofEJIiIiIgcEpMgIiIickhMgoiIiMghMQkiIiIih8QkiIiIiBwSkyAiIiJySEyCiIiIyCExCSIiIiKHxCSIiIiIHBKTICIiInJITIKIiIjIITEJIiIiIofEJIiIiIgcEpMgIiIickhMgoiIiMghMQkiIiIih8QkiIiIiBwSkyAiIiJySEyCiIiIyCExCSIiIiKHxCSIiIiIHBKTICIiInJITIKIiIjIITEJIiIiIofEJIiIiIgcEpMgIiIickhMgoiIiMghMQkiIiIih8QkiIiIiBwSkyAiIiJySEyCiIiIyCExCSIiIiKHxCSIiIiIHBKTICIiInJITIKIiIjIITEJIiIiIofEJIiIiIgckt0kQStXrkRYWBhUKhXCw8Nx4MCBGvtu27YNjzzyCG677TZ4e3sjMjISu3btsmC0REREZOvsIglKTEzEpEmTMHPmTKSmpiI6Ohp9+/ZFZmam0f779+/HI488gqSkJBw/fhwPPfQQHn/8caSmplo4ciIiIrJVkhBCWDuIutx///247777sGrVKl1bx44dMXDgQMyfP79ex7jzzjsxdOhQzJo1q179CwsLoVarUVBQAG9v7wbFTURERIY01wvgvjCk6uuETLh7qmU7timf3zY/EqTVanH8+HHExsbqtcfGxuLw4cP1OkZlZSWKiorQvHnzGvuUlpaisLBQ70VERERNl80nQXl5eaioqIC/v79eu7+/P3Jycup1jPfffx/FxcV4+umna+wzf/58qNVq3Ss4OLhRcRMREZFts/kkqJokSXrfCyEM2ozZvHkz3njjDSQmJsLPz6/GftOnT0dBQYHudeHChUbHTERERLbL2doB1MXX1xdOTk4Goz6XL182GB26VWJiIsaMGYOtW7ciJiam1r5KpRJKpbLR8RIREZF9sPmRIFdXV4SHhyM5OVmvPTk5GVFRUTXut3nzZowcORKbNm1C//79zR0mERER2RmbHwkCgPj4eDz//POIiIhAZGQkPvroI2RmZiIuLg5A1a2sS5cuYcOGDQCqEqDhw4djyZIl6N69u24Uyc3NDWq1fBXoREREZL/sIgka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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.metrics import roc_curve\n", "\n", "y_pred_prob_lr = lr.predict_proba(X_test) # predicted probabilities\n", "fpr_lr, tpr_lr, _ = roc_curve(y_test, y_pred_prob_lr[:,1])\n", "\n", "y_pred_prob_rf = rf.predict_proba(X_test) # predicted probabilities\n", "fpr_rf, tpr_rf, _ = roc_curve(y_test, y_pred_prob_rf[:,1])\n", "\n", "plt.plot(tpr_lr, 1-fpr_lr, label=\"log. regression\")\n", "plt.plot(tpr_rf, 1-fpr_rf, label=\"random forest\")\n", "\n", "plt.xlabel('Recall', fontsize=18)\n", "plt.ylabel('Precision', fontsize=18);\n", "plt.legend(fontsize=15)\n", "\n", "plt.savefig(\"03_ml_basics_log_regr_heart_disease.pdf\")" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Area under Curve (AUC) scores: 0.80, 0.80\n" ] } ], "source": [ "from sklearn.metrics import roc_auc_score\n", "auc_lr = roc_auc_score(y_test,y_pred_lr)\n", "auc_rf = roc_auc_score(y_test,y_pred_rf)\n", "print(f\"Area under Curve (AUC) scores: {auc_lr:.2f}, {auc_rf:.2f}\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.16" } }, "nbformat": 4, "nbformat_minor": 4 }