{ "cells": [ { "cell_type": "code", "execution_count": 64, "id": "01c46189-a598-4bfc-9565-a914346decf7", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "from sklearn.model_selection import train_test_split, GridSearchCV\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.neighbors import KNeighborsClassifier\n", "# from sklearn.metrics import confusion_matrix, roc_curve, roc_auc_score, RocCurveDisplay\n", "from sklearn.metrics import confusion_matrix, recall_score, precision_score, roc_auc_score, roc_curve, accuracy_score, RocCurveDisplay\n", "\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 65, "id": "53f58e2c-169e-434c-9b8e-1bd0cb5f7715", "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", "
EnrollAgeIncomeHours
01261800014
1043130009
21554200016
315510000013
40551300012
\n", "
" ], "text/plain": [ " Enroll Age Income Hours\n", "0 1 26 18000 14\n", "1 0 43 13000 9\n", "2 1 55 42000 16\n", "3 1 55 100000 13\n", "4 0 55 13000 12" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Load the data\n", "df = pd.read_excel(\"gym.xlsx\")\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 66, "id": "b5809395-d339-4a18-bef1-ea12b06cc9f7", "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", "
EnrollAgeIncomeHours
count1000.0000001000.0000001000.0000001000.000000
mean0.40300044.58200068340.00000010.182000
std0.49074613.87673744466.9282474.671263
min0.00000021.0000001000.0000002.000000
25%0.00000032.00000031000.0000006.000000
50%0.00000045.00000064000.00000010.000000
75%1.00000057.00000097000.00000014.000000
max1.00000068.000000198000.00000018.000000
\n", "
" ], "text/plain": [ " Enroll Age Income Hours\n", "count 1000.000000 1000.000000 1000.000000 1000.000000\n", "mean 0.403000 44.582000 68340.000000 10.182000\n", "std 0.490746 13.876737 44466.928247 4.671263\n", "min 0.000000 21.000000 1000.000000 2.000000\n", "25% 0.000000 32.000000 31000.000000 6.000000\n", "50% 0.000000 45.000000 64000.000000 10.000000\n", "75% 1.000000 57.000000 97000.000000 14.000000\n", "max 1.000000 68.000000 198000.000000 18.000000" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe()" ] }, { "cell_type": "code", "execution_count": 67, "id": "46f2b835-2f7d-4d65-a1e9-5dacaf6a370e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1000, 4)" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.shape" ] }, { "cell_type": "code", "execution_count": 68, "id": "92834d50-c430-4431-b5d9-81b10415dca1", "metadata": {}, "outputs": [], "source": [ "indAtts = [\"Age\", \"Income\", \"Hours\"]\n", "depAtt = \"Enroll\"" ] }, { "cell_type": "code", "execution_count": 69, "id": "3b789418-6284-41cb-9c41-5f2b5d2114ac", "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", "
AgeIncomeHours
0261800014
143130009
2554200016
35510000013
4551300012
\n", "
" ], "text/plain": [ " Age Income Hours\n", "0 26 18000 14\n", "1 43 13000 9\n", "2 55 42000 16\n", "3 55 100000 13\n", "4 55 13000 12" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Separate features and target variable\n", "Xs = df[indAtts]\n", "Xs.head()" ] }, { "cell_type": "code", "execution_count": 70, "id": "c9c82753-ed45-4d63-9f5a-75fd54d196fb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 1\n", "1 0\n", "2 1\n", "3 1\n", "4 0\n", " ..\n", "995 0\n", "996 0\n", "997 1\n", "998 1\n", "999 0\n", "Name: Enroll, Length: 1000, dtype: int64" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y = df[depAtt]\n", "y\n" ] }, { "cell_type": "code", "execution_count": 71, "id": "13b2648e-6a32-4775-9970-3e0c466271fe", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-1.33974561, -1.13264376, 0.81774684],\n", " [-0.11406079, -1.24514314, -0.25316311],\n", " [ 0.7511285 , -0.59264674, 1.24611082],\n", " ...,\n", " [ 0.7511285 , 0.03734979, 1.46029281],\n", " [ 1.68841689, -0.09764946, 1.03192883],\n", " [ 0.24643475, -0.03014983, 1.6744748 ]])" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Scale the features\n", "scaler = StandardScaler()\n", "XsScaled = scaler.fit_transform(Xs)\n", "XsScaled" ] }, { "cell_type": "code", "execution_count": 72, "id": "b3d1b271-1670-410e-a98b-c0af06571d70", "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", "
AgeIncomeHoursEnroll
0-1.339746-1.1326440.8177471
1-0.114061-1.245143-0.2531630
20.751128-0.5926471.2461111
30.7511280.7123460.6035651
40.751128-1.2451430.3893830
...............
995-0.402457-1.4251420.6035650
996-0.474556-1.425142-1.5382550
9970.7511280.0373501.4602931
9981.688417-0.0976491.0319291
9990.246435-0.0301501.6744750
\n", "

1000 rows × 4 columns

\n", "
" ], "text/plain": [ " Age Income Hours Enroll\n", "0 -1.339746 -1.132644 0.817747 1\n", "1 -0.114061 -1.245143 -0.253163 0\n", "2 0.751128 -0.592647 1.246111 1\n", "3 0.751128 0.712346 0.603565 1\n", "4 0.751128 -1.245143 0.389383 0\n", ".. ... ... ... ...\n", "995 -0.402457 -1.425142 0.603565 0\n", "996 -0.474556 -1.425142 -1.538255 0\n", "997 0.751128 0.037350 1.460293 1\n", "998 1.688417 -0.097649 1.031929 1\n", "999 0.246435 -0.030150 1.674475 0\n", "\n", "[1000 rows x 4 columns]" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Combine scaled features and target into a new DataFrame\n", "dfScaled = pd.DataFrame(XsScaled, columns=Xs.columns)\n", "dfScaled[depAtt] = y.astype('category')\n", "dfScaled" ] }, { "cell_type": "code", "execution_count": 73, "id": "4e6402c1-05f3-4cfe-b96d-9758d36aed57", "metadata": {}, "outputs": [], "source": [ "# Split the data into training and testing sets\n", "X_train, X_test, y_train, y_test = train_test_split(\n", " dfScaled[indAtts],\n", " dfScaled[depAtt],\n", " test_size=0.4,\n", " random_state=1,\n", " stratify=dfScaled[depAtt]\n", ")\n" ] }, { "cell_type": "code", "execution_count": 74, "id": "a9b32cbd-f135-4c17-9b52-7078722caae3", "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", "
AgeIncomeHours
8080.0301370.8248451.674475
393-0.618755-0.9751450.175201
416-0.979250-1.4251420.817747
4860.679029-1.0651440.817747
422-0.114061-1.267643-1.324073
\n", "
" ], "text/plain": [ " Age Income Hours\n", "808 0.030137 0.824845 1.674475\n", "393 -0.618755 -0.975145 0.175201\n", "416 -0.979250 -1.425142 0.817747\n", "486 0.679029 -1.065144 0.817747\n", "422 -0.114061 -1.267643 -1.324073" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train.head()" ] }, { "cell_type": "code", "execution_count": 75, "id": "2226b885-9cff-41aa-a0f4-35ef5682daaa", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
GridSearchCV(cv=5, estimator=KNeighborsClassifier(),\n",
       "             param_grid={'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})
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": [ "GridSearchCV(cv=5, estimator=KNeighborsClassifier(),\n", " param_grid={'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Perform k-NN classification with cross-validation to find the best k\n", "knn = KNeighborsClassifier()\n", "param_grid = {'n_neighbors': list(range(1, 11))}\n", "grid_search = GridSearchCV(knn, param_grid, cv=5)\n", "grid_search.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 76, "id": "779e861d-04cf-4d8f-94e0-e42c96525b61", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best parameters: {'n_neighbors': 5}\n", "Best cross-validation score: 0.915\n" ] } ], "source": [ "print(\"Best parameters:\", grid_search.best_params_)\n", "print(\"Best cross-validation score:\", grid_search.best_score_)" ] }, { "cell_type": "code", "execution_count": 77, "id": "046a78bc-4b77-44d9-a5d9-3d6084d1ad16", "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", "
mean_fit_timestd_fit_timemean_score_timestd_score_timeparam_n_neighborsparamssplit0_test_scoresplit1_test_scoresplit2_test_scoresplit3_test_scoresplit4_test_scoremean_test_scorestd_test_scorerank_test_score
00.0011090.0004550.0036940.0005361{'n_neighbors': 1}0.8666670.9083330.8666670.9000000.9166670.8916670.0210829
10.0008860.0000900.0032210.0002292{'n_neighbors': 2}0.8333330.8583330.8833330.8666670.8666670.8616670.01633010
20.0006700.0000710.0027600.0003183{'n_neighbors': 3}0.9083330.9166670.8833330.9333330.9000000.9083330.0166672
30.0005450.0000200.0023110.0000664{'n_neighbors': 4}0.8500000.9250000.8583330.9333330.9000000.8933330.0339128
40.0004890.0000100.0021910.0000515{'n_neighbors': 5}0.8750000.9416670.8833330.9500000.9250000.9150000.0304591
50.0004570.0000060.0020550.0000386{'n_neighbors': 6}0.8666670.9416670.8583330.9333330.9166670.9033330.0344005
60.0004390.0000060.0019900.0000357{'n_neighbors': 7}0.8750000.9333330.8583330.9416670.9166670.9050000.0327454
70.0004360.0000050.0019740.0000088{'n_neighbors': 8}0.8666670.9333330.8583330.9333330.9083330.9000000.0320597
80.0004300.0000040.0019810.0000169{'n_neighbors': 9}0.8666670.9250000.8833330.9416670.9166670.9066670.0275883
90.0004720.0000470.0020840.00007910{'n_neighbors': 10}0.8416670.9416670.8666670.9416670.9166670.9016670.0406206
\n", "
" ], "text/plain": [ " mean_fit_time std_fit_time mean_score_time std_score_time \\\n", "0 0.001109 0.000455 0.003694 0.000536 \n", "1 0.000886 0.000090 0.003221 0.000229 \n", "2 0.000670 0.000071 0.002760 0.000318 \n", "3 0.000545 0.000020 0.002311 0.000066 \n", "4 0.000489 0.000010 0.002191 0.000051 \n", "5 0.000457 0.000006 0.002055 0.000038 \n", "6 0.000439 0.000006 0.001990 0.000035 \n", "7 0.000436 0.000005 0.001974 0.000008 \n", "8 0.000430 0.000004 0.001981 0.000016 \n", "9 0.000472 0.000047 0.002084 0.000079 \n", "\n", " param_n_neighbors params split0_test_score \\\n", "0 1 {'n_neighbors': 1} 0.866667 \n", "1 2 {'n_neighbors': 2} 0.833333 \n", "2 3 {'n_neighbors': 3} 0.908333 \n", "3 4 {'n_neighbors': 4} 0.850000 \n", "4 5 {'n_neighbors': 5} 0.875000 \n", "5 6 {'n_neighbors': 6} 0.866667 \n", "6 7 {'n_neighbors': 7} 0.875000 \n", "7 8 {'n_neighbors': 8} 0.866667 \n", "8 9 {'n_neighbors': 9} 0.866667 \n", "9 10 {'n_neighbors': 10} 0.841667 \n", "\n", " split1_test_score split2_test_score split3_test_score split4_test_score \\\n", "0 0.908333 0.866667 0.900000 0.916667 \n", "1 0.858333 0.883333 0.866667 0.866667 \n", "2 0.916667 0.883333 0.933333 0.900000 \n", "3 0.925000 0.858333 0.933333 0.900000 \n", "4 0.941667 0.883333 0.950000 0.925000 \n", "5 0.941667 0.858333 0.933333 0.916667 \n", "6 0.933333 0.858333 0.941667 0.916667 \n", "7 0.933333 0.858333 0.933333 0.908333 \n", "8 0.925000 0.883333 0.941667 0.916667 \n", "9 0.941667 0.866667 0.941667 0.916667 \n", "\n", " mean_test_score std_test_score rank_test_score \n", "0 0.891667 0.021082 9 \n", "1 0.861667 0.016330 10 \n", "2 0.908333 0.016667 2 \n", "3 0.893333 0.033912 8 \n", "4 0.915000 0.030459 1 \n", "5 0.903333 0.034400 5 \n", "6 0.905000 0.032745 4 \n", "7 0.900000 0.032059 7 \n", "8 0.906667 0.027588 3 \n", "9 0.901667 0.040620 6 " ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Display detailed results\n", "results = pd.DataFrame(grid_search.cv_results_)\n", "results" ] }, { "cell_type": "code", "execution_count": 78, "id": "1f78ee56-b9c8-4d1a-aef9-ad37dfa41858", "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", "
ActualPredicted
48911
24100
11900
57700
28700
.........
80411
97411
81011
39500
86100
\n", "

400 rows × 2 columns

\n", "
" ], "text/plain": [ " Actual Predicted\n", "489 1 1\n", "241 0 0\n", "119 0 0\n", "577 0 0\n", "287 0 0\n", ".. ... ...\n", "804 1 1\n", "974 1 1\n", "810 1 1\n", "395 0 0\n", "861 0 0\n", "\n", "[400 rows x 2 columns]" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Make predictions on the test set\n", "best_knn = grid_search.best_estimator_\n", "predictions = best_knn.predict(X_test)\n", "# Combine y_test and predictions into a DataFrame\n", "results_df = pd.DataFrame({'Actual': y_test, 'Predicted': predictions})\n", "results_df" ] }, { "cell_type": "code", "execution_count": 80, "id": "777a6302-6139-4199-9ed0-68f5e8938612", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Confusion Matrix as DataFrame:\n", " Actual_0 Actual_1\n", "Predicted_0 217 22\n", "Predicted_1 17 144\n" ] } ], "source": [ "# Confusion matrix\n", "conf_matrix = confusion_matrix(y_test, predictions)\n", "\n", "# Convert confusion matrix to DataFrame with predicted as rows and actual as columns\n", "conf_matrix_df = pd.DataFrame(conf_matrix, index=['Predicted_0', 'Predicted_1'], columns=['Actual_0', 'Actual_1'])\n", "print(\"Confusion Matrix as DataFrame:\")\n", "print(conf_matrix_df)\n" ] }, { "cell_type": "code", "execution_count": 82, "id": "aa493759-f506-4278-a212-4a3a0b5db15a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 0.9025\n", "Precision: 0.8674698795180723\n", "Recall (Sensitivity): 0.8944099378881988\n", "Specificity: 0.9079497907949791\n", "F1 Score: 0.8807339449541285\n" ] } ], "source": [ "# Calculate metrics\n", "precision = precision_score(y_test, predictions)\n", "recall = recall_score(y_test, predictions)\n", "accuracy = accuracy_score(y_test, predictions)\n", "specificity = conf_matrix[0, 0] / (conf_matrix[0, 0] + conf_matrix[0, 1])\n", "f1_score = 2 * (precision * recall) / (precision + recall)\n", "\n", "print(f\"Accuracy: {accuracy}\")\n", "print(f\"Precision: {precision}\")\n", "print(f\"Recall (Sensitivity): {recall}\")\n", "print(f\"Specificity: {specificity}\")\n", "print(f\"F1 Score: {f1_score}\")" ] }, { "cell_type": "code", "execution_count": 84, "id": "c9a97f8e-0ebc-4b51-a4a1-ff059dd75535", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1. , 0. , 0.2, 0.4, 0.2, 0.6, 1. , 0.2, 0.8, 0. , 0. , 0.2, 0. ,\n", " 0. , 0.6, 0.6, 0. , 0. , 0. , 0.8, 1. , 0. , 1. , 0.8, 0. , 0.8,\n", " 0. , 0.2, 1. , 0. , 0.8, 0. , 0.2, 0.2, 0. , 0. , 0.4, 0.4, 0. ,\n", " 1. , 0. , 0.8, 0. , 0.8, 0. , 0.8, 0. , 0.6, 1. , 0.8, 0. , 1. ,\n", " 1. , 0.8, 0.4, 0. , 0.8, 0. , 0.2, 0. , 0.6, 1. , 0.6, 0. , 1. ,\n", " 0. , 0.8, 0. , 0. , 0.2, 0.2, 0.8, 1. , 0. , 0. , 0. , 0.8, 0.4,\n", " 1. , 0. , 0. , 1. , 0. , 0.2, 0. , 0.8, 0. , 1. , 0. , 0. , 0. ,\n", " 0. , 0. , 1. , 1. , 1. , 0. , 1. , 0. , 0. , 0.4, 0.2, 1. , 0. ,\n", " 1. , 0.8, 1. , 1. , 0. , 1. , 0.8, 1. , 1. , 1. , 0. , 0. , 1. ,\n", " 0.8, 0. , 0. , 0.2, 0.8, 0. , 1. , 1. , 1. , 0.8, 1. , 1. , 0.8,\n", " 0.2, 0. , 0. , 0. , 0.6, 0. , 1. , 0.2, 0. , 1. , 0. , 0. , 0.8,\n", " 0.6, 0. , 0. , 0. , 0.2, 0.4, 1. , 0.8, 0. , 1. , 0. , 0. , 1. ,\n", " 1. , 0. , 0.6, 0. , 0. , 0. , 0.2, 0.2, 0.4, 0.2, 0.2, 0.4, 1. ,\n", " 0.8, 0. , 0.8, 0. , 0. , 0.2, 1. , 0. , 0. , 0. , 0. , 1. , 0. ,\n", " 0. , 1. , 0. , 0.2, 0. , 1. , 0. , 0.2, 1. , 0. , 0.4, 0.2, 0.2,\n", " 0. , 0.6, 0.2, 0.6, 0.6, 0. , 0. , 0.8, 0.8, 0.8, 0. , 0. , 0. ,\n", " 0. , 0. , 0. , 0.4, 0. , 0. , 0.6, 1. , 1. , 0.2, 0. , 0.8, 0. ,\n", " 0. , 0. , 0. , 0.2, 1. , 1. , 0.2, 1. , 0.2, 0. , 0.8, 0. , 0. ,\n", " 0. , 1. , 0.4, 1. , 0. , 0. , 1. , 1. , 0. , 0.2, 1. , 0.6, 0.4,\n", " 0.8, 1. , 0. , 0. , 1. , 0.2, 0. , 1. , 0.8, 0.6, 0. , 0.8, 1. ,\n", " 0.4, 0. , 0. , 0.6, 0.6, 0. , 1. , 0.2, 1. , 1. , 0.6, 0.2, 0.8,\n", " 1. , 0.2, 0.2, 0. , 0. , 1. , 1. , 0.8, 0.8, 0. , 0.2, 1. , 0.8,\n", " 0. , 0.8, 0. , 1. , 0. , 0. , 1. , 0.8, 0.2, 0.2, 0.2, 0. , 0.6,\n", " 1. , 1. , 0.2, 0. , 0. , 0. , 0.2, 0.8, 1. , 1. , 1. , 0. , 0.8,\n", " 0.8, 0.4, 0. , 0.4, 0. , 1. , 0.4, 0.8, 0.4, 0.2, 0. , 0. , 0. ,\n", " 0. , 0. , 0. , 0.8, 0.8, 0. , 0.8, 0.8, 0. , 1. , 0.2, 0. , 0. ,\n", " 0.6, 1. , 0.8, 0. , 0. , 0. , 0. , 0.8, 0. , 0.6, 0. , 0.8, 0.2,\n", " 0. , 0. , 0. , 0.8, 0.6, 0. , 1. , 0. , 0.4, 0. , 0.4, 0. , 0.8,\n", " 0. , 0. , 0.2, 1. , 0.4, 0. , 0.2, 0.2, 0.8, 0. , 0.8, 0. , 0.2,\n", " 0.8, 0. , 0. , 0.8, 0.6, 0. , 0.8, 0. , 0.8, 0. , 1. , 0. , 0. ,\n", " 0.2, 0.8, 1. , 0.8, 0. , 0.6, 1. , 0.8, 0.2, 0.2])" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Predict probabilities for ROC curve\n", "probs= best_knn.predict_proba(X_test)[:, 1]\n", "probs" ] }, { "cell_type": "code", "execution_count": 85, "id": "b23ed9f8-b1c0-491c-b048-112a0797299f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ROC AUC: 0.9423191870890616\n" ] } ], "source": [ "roc_auc = roc_auc_score(y_test, probs)\n", "print(\"ROC AUC:\", roc_auc)" ] }, { "cell_type": "code", "execution_count": 90, "id": "ffe52a48-533d-43db-b845-8aab740638ef", "metadata": {}, "outputs": [ { "data": { "image/png": "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bPHXqlULq1evhrOzM2xtbd8qJiJjx2ZpIiPyzjvvICMjA3PmzMGNGzewfPlyLFy4MNf9U1NTMXjwYOzZswf//fcfDhw4gGPHjmmHvL799lscPHgQgwcPRmRkJK5evYo///xT72bpF33zzTf44YcfsHr1aly+fBkjRoxAZGQkvvzySwDAjBkz8Pvvv+PSpUu4cuUK1q5di1KlSuW4CKSzszMsLCwQERGB+/fvIz4+PtfHDQwMxJYtW7B48WJtk3SWcePGYdmyZZg4cSLOnz+PixcvYtWqVRgzZoxez61Bgwbw8fHBlClTAAAVKlTA8ePHsXXrVly5cgVjx47FsWPHdI7x9PTEmTNncPnyZcTGxiIjIwOBgYFwdHRE+/bt8e+//yIqKgp79uzBkCFDcOfOHb1iIjJ6UjcpEVH+y6nBNsuMGTOEq6ursLCwEP7+/mLZsmUCgHjy5IkQQreZWaVSiU8++UR4eHgIU1NT4ebmJgYPHqzTCH306FHRqlUrYW1tLaysrISPj0+2ZucXvdws/TK1Wi0mTJgg3N3dhVKpFL6+vuKff/7R3v/rr7+KGjVqCCsrK2FraytatmwpTp48qb0fLzRLCyFEaGio8PDwEHK5XDRt2jTX10etVgtXV1cBQFy/fj1bXBEREaJhw4bCwsJC2Nrainr16olff/011+cxfvx44evrm23777//LszMzMStW7dEWlqa6NWrl7CzsxP29vZiwIABYsSIETrHPXjwQPv6AhC7d+8WQggRHR0tevbsKRwdHYWZmZkoX7686Nevn4iPj881JiLKTiaEENKmYkRERETS4NAYERERGS0mQkRERGS0mAgRERGR0WIiREREREaLiRAREREZLSZCREREZLSYCBEREZHRYiJERERERouJEBERERktJkJERERktJgIERERkdFiIkRERERG6//8xRx4Gn1VJwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot ROC curve\n", "fpr, tpr, _ = roc_curve(y_test, probs )\n", "plt.figure()\n", "plt.plot(fpr, tpr, label=f'ROC curve (area = {roc_auc:.2f})')\n", "plt.plot([0, 1], [0, 1], 'k--')\n", "plt.xlim([0.0, 1.0])\n", "plt.ylim([0.0, 1.05])\n", "plt.xlabel('False Positive Rate')\n", "plt.ylabel('True Positive Rate')\n", "plt.title('Receiver Operating Characteristic')\n", "plt.legend(loc=\"lower right\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "68206bb3-19e3-435a-a311-e82035c1d57a", "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.12.3" } }, "nbformat": 4, "nbformat_minor": 5 }