Created
May 23, 2024 13:06
-
-
Save dsaint31x/79fea70bc5c9fdea7aab4b1ad38dc273 to your computer and use it in GitHub Desktop.
dl_torch_binary_classification.ipynb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"provenance": [], | |
"toc_visible": true, | |
"authorship_tag": "ABX9TyM4UdfbFGgwsIDIyiK9q47n", | |
"include_colab_link": true | |
}, | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3" | |
}, | |
"language_info": { | |
"name": "python" | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/dsaint31x/79fea70bc5c9fdea7aab4b1ad38dc273/dl_torch_binary_classification.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# Dataset" | |
], | |
"metadata": { | |
"id": "XwRyZEthq7FW" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "oLUs_h-Ysn6i", | |
"outputId": "6c45fb9d-b7bb-4c4a-c77f-f7b7d4981c3c" | |
}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"<class 'sklearn.utils._bunch.Bunch'>\n" | |
] | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"['DESCR',\n", | |
" 'data',\n", | |
" 'data_module',\n", | |
" 'feature_names',\n", | |
" 'filename',\n", | |
" 'frame',\n", | |
" 'target',\n", | |
" 'target_names']" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 1 | |
} | |
], | |
"source": [ | |
"from sklearn.datasets import load_breast_cancer\n", | |
"\n", | |
"cancer = load_breast_cancer()\n", | |
"print(type(cancer))\n", | |
"dir(cancer)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# Exploratory Data Analysis (EDA)\n", | |
"\n", | |
"탐색적 데이터 분석.\n", | |
"\n", | |
"여기선 df를 이용해 간단히 살펴본다." | |
], | |
"metadata": { | |
"id": "BigXS9S_E9n7" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"from IPython import display\n", | |
"display.Markdown(cancer.DESCR)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 1000 | |
}, | |
"id": "TWQMre-us0bD", | |
"outputId": "e7d0f1bc-ca78-48b8-f2d9-04be799f03f8" | |
}, | |
"execution_count": 2, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"<IPython.core.display.Markdown object>" | |
], | |
"text/markdown": ".. _breast_cancer_dataset:\n\nBreast cancer wisconsin (diagnostic) dataset\n--------------------------------------------\n\n**Data Set Characteristics:**\n\n :Number of Instances: 569\n\n :Number of Attributes: 30 numeric, predictive attributes and the class\n\n :Attribute Information:\n - radius (mean of distances from center to points on the perimeter)\n - texture (standard deviation of gray-scale values)\n - perimeter\n - area\n - smoothness (local variation in radius lengths)\n - compactness (perimeter^2 / area - 1.0)\n - concavity (severity of concave portions of the contour)\n - concave points (number of concave portions of the contour)\n - symmetry\n - fractal dimension (\"coastline approximation\" - 1)\n\n The mean, standard error, and \"worst\" or largest (mean of the three\n worst/largest values) of these features were computed for each image,\n resulting in 30 features. For instance, field 0 is Mean Radius, field\n 10 is Radius SE, field 20 is Worst Radius.\n\n - class:\n - WDBC-Malignant\n - WDBC-Benign\n\n :Summary Statistics:\n\n ===================================== ====== ======\n Min Max\n ===================================== ====== ======\n radius (mean): 6.981 28.11\n texture (mean): 9.71 39.28\n perimeter (mean): 43.79 188.5\n area (mean): 143.5 2501.0\n smoothness (mean): 0.053 0.163\n compactness (mean): 0.019 0.345\n concavity (mean): 0.0 0.427\n concave points (mean): 0.0 0.201\n symmetry (mean): 0.106 0.304\n fractal dimension (mean): 0.05 0.097\n radius (standard error): 0.112 2.873\n texture (standard error): 0.36 4.885\n perimeter (standard error): 0.757 21.98\n area (standard error): 6.802 542.2\n smoothness (standard error): 0.002 0.031\n compactness (standard error): 0.002 0.135\n concavity (standard error): 0.0 0.396\n concave points (standard error): 0.0 0.053\n symmetry (standard error): 0.008 0.079\n fractal dimension (standard error): 0.001 0.03\n radius (worst): 7.93 36.04\n texture (worst): 12.02 49.54\n perimeter (worst): 50.41 251.2\n area (worst): 185.2 4254.0\n smoothness (worst): 0.071 0.223\n compactness (worst): 0.027 1.058\n concavity (worst): 0.0 1.252\n concave points (worst): 0.0 0.291\n symmetry (worst): 0.156 0.664\n fractal dimension (worst): 0.055 0.208\n ===================================== ====== ======\n\n :Missing Attribute Values: None\n\n :Class Distribution: 212 - Malignant, 357 - Benign\n\n :Creator: Dr. William H. Wolberg, W. Nick Street, Olvi L. Mangasarian\n\n :Donor: Nick Street\n\n :Date: November, 1995\n\nThis is a copy of UCI ML Breast Cancer Wisconsin (Diagnostic) datasets.\nhttps://goo.gl/U2Uwz2\n\nFeatures are computed from a digitized image of a fine needle\naspirate (FNA) of a breast mass. They describe\ncharacteristics of the cell nuclei present in the image.\n\nSeparating plane described above was obtained using\nMultisurface Method-Tree (MSM-T) [K. P. Bennett, \"Decision Tree\nConstruction Via Linear Programming.\" Proceedings of the 4th\nMidwest Artificial Intelligence and Cognitive Science Society,\npp. 97-101, 1992], a classification method which uses linear\nprogramming to construct a decision tree. Relevant features\nwere selected using an exhaustive search in the space of 1-4\nfeatures and 1-3 separating planes.\n\nThe actual linear program used to obtain the separating plane\nin the 3-dimensional space is that described in:\n[K. P. Bennett and O. L. Mangasarian: \"Robust Linear\nProgramming Discrimination of Two Linearly Inseparable Sets\",\nOptimization Methods and Software 1, 1992, 23-34].\n\nThis database is also available through the UW CS ftp server:\n\nftp ftp.cs.wisc.edu\ncd math-prog/cpo-dataset/machine-learn/WDBC/\n\n.. topic:: References\n\n - W.N. Street, W.H. Wolberg and O.L. Mangasarian. Nuclear feature extraction \n for breast tumor diagnosis. IS&T/SPIE 1993 International Symposium on \n Electronic Imaging: Science and Technology, volume 1905, pages 861-870,\n San Jose, CA, 1993.\n - O.L. Mangasarian, W.N. Street and W.H. Wolberg. Breast cancer diagnosis and \n prognosis via linear programming. Operations Research, 43(4), pages 570-577, \n July-August 1995.\n - W.H. Wolberg, W.N. Street, and O.L. Mangasarian. Machine learning techniques\n to diagnose breast cancer from fine-needle aspirates. Cancer Letters 77 (1994) \n 163-171." | |
}, | |
"metadata": {}, | |
"execution_count": 2 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"import pandas as pd\n", | |
"\n", | |
"df = pd.DataFrame(cancer.data, columns=cancer.feature_names)\n", | |
"df['label'] = cancer.target\n", | |
"\n", | |
"df.head()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 290 | |
}, | |
"id": "dhnsMaE0Dl3s", | |
"outputId": "7fb68cb1-8b08-4fc9-ba4e-85cfbbd1e3e3" | |
}, | |
"execution_count": 3, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
" mean radius mean texture mean perimeter mean area mean smoothness \\\n", | |
"0 17.99 10.38 122.80 1001.0 0.11840 \n", | |
"1 20.57 17.77 132.90 1326.0 0.08474 \n", | |
"2 19.69 21.25 130.00 1203.0 0.10960 \n", | |
"3 11.42 20.38 77.58 386.1 0.14250 \n", | |
"4 20.29 14.34 135.10 1297.0 0.10030 \n", | |
"\n", | |
" mean compactness mean concavity mean concave points mean symmetry \\\n", | |
"0 0.27760 0.3001 0.14710 0.2419 \n", | |
"1 0.07864 0.0869 0.07017 0.1812 \n", | |
"2 0.15990 0.1974 0.12790 0.2069 \n", | |
"3 0.28390 0.2414 0.10520 0.2597 \n", | |
"4 0.13280 0.1980 0.10430 0.1809 \n", | |
"\n", | |
" mean fractal dimension ... worst texture worst perimeter worst area \\\n", | |
"0 0.07871 ... 17.33 184.60 2019.0 \n", | |
"1 0.05667 ... 23.41 158.80 1956.0 \n", | |
"2 0.05999 ... 25.53 152.50 1709.0 \n", | |
"3 0.09744 ... 26.50 98.87 567.7 \n", | |
"4 0.05883 ... 16.67 152.20 1575.0 \n", | |
"\n", | |
" worst smoothness worst compactness worst concavity worst concave points \\\n", | |
"0 0.1622 0.6656 0.7119 0.2654 \n", | |
"1 0.1238 0.1866 0.2416 0.1860 \n", | |
"2 0.1444 0.4245 0.4504 0.2430 \n", | |
"3 0.2098 0.8663 0.6869 0.2575 \n", | |
"4 0.1374 0.2050 0.4000 0.1625 \n", | |
"\n", | |
" worst symmetry worst fractal dimension label \n", | |
"0 0.4601 0.11890 0 \n", | |
"1 0.2750 0.08902 0 \n", | |
"2 0.3613 0.08758 0 \n", | |
"3 0.6638 0.17300 0 \n", | |
"4 0.2364 0.07678 0 \n", | |
"\n", | |
"[5 rows x 31 columns]" | |
], | |
"text/html": [ | |
"\n", | |
" <div id=\"df-d92927d4-f91e-47ec-9c5d-2c350377216e\" class=\"colab-df-container\">\n", | |
" <div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>mean radius</th>\n", | |
" <th>mean texture</th>\n", | |
" <th>mean perimeter</th>\n", | |
" <th>mean area</th>\n", | |
" <th>mean smoothness</th>\n", | |
" <th>mean compactness</th>\n", | |
" <th>mean concavity</th>\n", | |
" <th>mean concave points</th>\n", | |
" <th>mean symmetry</th>\n", | |
" <th>mean fractal dimension</th>\n", | |
" <th>...</th>\n", | |
" <th>worst texture</th>\n", | |
" <th>worst perimeter</th>\n", | |
" <th>worst area</th>\n", | |
" <th>worst smoothness</th>\n", | |
" <th>worst compactness</th>\n", | |
" <th>worst concavity</th>\n", | |
" <th>worst concave points</th>\n", | |
" <th>worst symmetry</th>\n", | |
" <th>worst fractal dimension</th>\n", | |
" <th>label</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>17.99</td>\n", | |
" <td>10.38</td>\n", | |
" <td>122.80</td>\n", | |
" <td>1001.0</td>\n", | |
" <td>0.11840</td>\n", | |
" <td>0.27760</td>\n", | |
" <td>0.3001</td>\n", | |
" <td>0.14710</td>\n", | |
" <td>0.2419</td>\n", | |
" <td>0.07871</td>\n", | |
" <td>...</td>\n", | |
" <td>17.33</td>\n", | |
" <td>184.60</td>\n", | |
" <td>2019.0</td>\n", | |
" <td>0.1622</td>\n", | |
" <td>0.6656</td>\n", | |
" <td>0.7119</td>\n", | |
" <td>0.2654</td>\n", | |
" <td>0.4601</td>\n", | |
" <td>0.11890</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>20.57</td>\n", | |
" <td>17.77</td>\n", | |
" <td>132.90</td>\n", | |
" <td>1326.0</td>\n", | |
" <td>0.08474</td>\n", | |
" <td>0.07864</td>\n", | |
" <td>0.0869</td>\n", | |
" <td>0.07017</td>\n", | |
" <td>0.1812</td>\n", | |
" <td>0.05667</td>\n", | |
" <td>...</td>\n", | |
" <td>23.41</td>\n", | |
" <td>158.80</td>\n", | |
" <td>1956.0</td>\n", | |
" <td>0.1238</td>\n", | |
" <td>0.1866</td>\n", | |
" <td>0.2416</td>\n", | |
" <td>0.1860</td>\n", | |
" <td>0.2750</td>\n", | |
" <td>0.08902</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>19.69</td>\n", | |
" <td>21.25</td>\n", | |
" <td>130.00</td>\n", | |
" <td>1203.0</td>\n", | |
" <td>0.10960</td>\n", | |
" <td>0.15990</td>\n", | |
" <td>0.1974</td>\n", | |
" <td>0.12790</td>\n", | |
" <td>0.2069</td>\n", | |
" <td>0.05999</td>\n", | |
" <td>...</td>\n", | |
" <td>25.53</td>\n", | |
" <td>152.50</td>\n", | |
" <td>1709.0</td>\n", | |
" <td>0.1444</td>\n", | |
" <td>0.4245</td>\n", | |
" <td>0.4504</td>\n", | |
" <td>0.2430</td>\n", | |
" <td>0.3613</td>\n", | |
" <td>0.08758</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>11.42</td>\n", | |
" <td>20.38</td>\n", | |
" <td>77.58</td>\n", | |
" <td>386.1</td>\n", | |
" <td>0.14250</td>\n", | |
" <td>0.28390</td>\n", | |
" <td>0.2414</td>\n", | |
" <td>0.10520</td>\n", | |
" <td>0.2597</td>\n", | |
" <td>0.09744</td>\n", | |
" <td>...</td>\n", | |
" <td>26.50</td>\n", | |
" <td>98.87</td>\n", | |
" <td>567.7</td>\n", | |
" <td>0.2098</td>\n", | |
" <td>0.8663</td>\n", | |
" <td>0.6869</td>\n", | |
" <td>0.2575</td>\n", | |
" <td>0.6638</td>\n", | |
" <td>0.17300</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>20.29</td>\n", | |
" <td>14.34</td>\n", | |
" <td>135.10</td>\n", | |
" <td>1297.0</td>\n", | |
" <td>0.10030</td>\n", | |
" <td>0.13280</td>\n", | |
" <td>0.1980</td>\n", | |
" <td>0.10430</td>\n", | |
" <td>0.1809</td>\n", | |
" <td>0.05883</td>\n", | |
" <td>...</td>\n", | |
" <td>16.67</td>\n", | |
" <td>152.20</td>\n", | |
" <td>1575.0</td>\n", | |
" <td>0.1374</td>\n", | |
" <td>0.2050</td>\n", | |
" <td>0.4000</td>\n", | |
" <td>0.1625</td>\n", | |
" <td>0.2364</td>\n", | |
" <td>0.07678</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"<p>5 rows × 31 columns</p>\n", | |
"</div>\n", | |
" <div class=\"colab-df-buttons\">\n", | |
"\n", | |
" <div class=\"colab-df-container\">\n", | |
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-d92927d4-f91e-47ec-9c5d-2c350377216e')\"\n", | |
" title=\"Convert this dataframe to an interactive table.\"\n", | |
" style=\"display:none;\">\n", | |
"\n", | |
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n", | |
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n", | |
" </svg>\n", | |
" </button>\n", | |
"\n", | |
" <style>\n", | |
" .colab-df-container {\n", | |
" display:flex;\n", | |
" gap: 12px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert {\n", | |
" background-color: #E8F0FE;\n", | |
" border: none;\n", | |
" border-radius: 50%;\n", | |
" cursor: pointer;\n", | |
" display: none;\n", | |
" fill: #1967D2;\n", | |
" height: 32px;\n", | |
" padding: 0 0 0 0;\n", | |
" width: 32px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert:hover {\n", | |
" background-color: #E2EBFA;\n", | |
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n", | |
" fill: #174EA6;\n", | |
" }\n", | |
"\n", | |
" .colab-df-buttons div {\n", | |
" margin-bottom: 4px;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert {\n", | |
" background-color: #3B4455;\n", | |
" fill: #D2E3FC;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert:hover {\n", | |
" background-color: #434B5C;\n", | |
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n", | |
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n", | |
" fill: #FFFFFF;\n", | |
" }\n", | |
" </style>\n", | |
"\n", | |
" <script>\n", | |
" const buttonEl =\n", | |
" document.querySelector('#df-d92927d4-f91e-47ec-9c5d-2c350377216e button.colab-df-convert');\n", | |
" buttonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
"\n", | |
" async function convertToInteractive(key) {\n", | |
" const element = document.querySelector('#df-d92927d4-f91e-47ec-9c5d-2c350377216e');\n", | |
" const dataTable =\n", | |
" await google.colab.kernel.invokeFunction('convertToInteractive',\n", | |
" [key], {});\n", | |
" if (!dataTable) return;\n", | |
"\n", | |
" const docLinkHtml = 'Like what you see? Visit the ' +\n", | |
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n", | |
" + ' to learn more about interactive tables.';\n", | |
" element.innerHTML = '';\n", | |
" dataTable['output_type'] = 'display_data';\n", | |
" await google.colab.output.renderOutput(dataTable, element);\n", | |
" const docLink = document.createElement('div');\n", | |
" docLink.innerHTML = docLinkHtml;\n", | |
" element.appendChild(docLink);\n", | |
" }\n", | |
" </script>\n", | |
" </div>\n", | |
"\n", | |
"\n", | |
"<div id=\"df-51de0bfb-e645-428b-9507-70a9cc6f0e83\">\n", | |
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-51de0bfb-e645-428b-9507-70a9cc6f0e83')\"\n", | |
" title=\"Suggest charts\"\n", | |
" style=\"display:none;\">\n", | |
"\n", | |
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n", | |
" width=\"24px\">\n", | |
" <g>\n", | |
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n", | |
" </g>\n", | |
"</svg>\n", | |
" </button>\n", | |
"\n", | |
"<style>\n", | |
" .colab-df-quickchart {\n", | |
" --bg-color: #E8F0FE;\n", | |
" --fill-color: #1967D2;\n", | |
" --hover-bg-color: #E2EBFA;\n", | |
" --hover-fill-color: #174EA6;\n", | |
" --disabled-fill-color: #AAA;\n", | |
" --disabled-bg-color: #DDD;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-quickchart {\n", | |
" --bg-color: #3B4455;\n", | |
" --fill-color: #D2E3FC;\n", | |
" --hover-bg-color: #434B5C;\n", | |
" --hover-fill-color: #FFFFFF;\n", | |
" --disabled-bg-color: #3B4455;\n", | |
" --disabled-fill-color: #666;\n", | |
" }\n", | |
"\n", | |
" .colab-df-quickchart {\n", | |
" background-color: var(--bg-color);\n", | |
" border: none;\n", | |
" border-radius: 50%;\n", | |
" cursor: pointer;\n", | |
" display: none;\n", | |
" fill: var(--fill-color);\n", | |
" height: 32px;\n", | |
" padding: 0;\n", | |
" width: 32px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-quickchart:hover {\n", | |
" background-color: var(--hover-bg-color);\n", | |
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n", | |
" fill: var(--button-hover-fill-color);\n", | |
" }\n", | |
"\n", | |
" .colab-df-quickchart-complete:disabled,\n", | |
" .colab-df-quickchart-complete:disabled:hover {\n", | |
" background-color: var(--disabled-bg-color);\n", | |
" fill: var(--disabled-fill-color);\n", | |
" box-shadow: none;\n", | |
" }\n", | |
"\n", | |
" .colab-df-spinner {\n", | |
" border: 2px solid var(--fill-color);\n", | |
" border-color: transparent;\n", | |
" border-bottom-color: var(--fill-color);\n", | |
" animation:\n", | |
" spin 1s steps(1) infinite;\n", | |
" }\n", | |
"\n", | |
" @keyframes spin {\n", | |
" 0% {\n", | |
" border-color: transparent;\n", | |
" border-bottom-color: var(--fill-color);\n", | |
" border-left-color: var(--fill-color);\n", | |
" }\n", | |
" 20% {\n", | |
" border-color: transparent;\n", | |
" border-left-color: var(--fill-color);\n", | |
" border-top-color: var(--fill-color);\n", | |
" }\n", | |
" 30% {\n", | |
" border-color: transparent;\n", | |
" border-left-color: var(--fill-color);\n", | |
" border-top-color: var(--fill-color);\n", | |
" border-right-color: var(--fill-color);\n", | |
" }\n", | |
" 40% {\n", | |
" border-color: transparent;\n", | |
" border-right-color: var(--fill-color);\n", | |
" border-top-color: var(--fill-color);\n", | |
" }\n", | |
" 60% {\n", | |
" border-color: transparent;\n", | |
" border-right-color: var(--fill-color);\n", | |
" }\n", | |
" 80% {\n", | |
" border-color: transparent;\n", | |
" border-right-color: var(--fill-color);\n", | |
" border-bottom-color: var(--fill-color);\n", | |
" }\n", | |
" 90% {\n", | |
" border-color: transparent;\n", | |
" border-bottom-color: var(--fill-color);\n", | |
" }\n", | |
" }\n", | |
"</style>\n", | |
"\n", | |
" <script>\n", | |
" async function quickchart(key) {\n", | |
" const quickchartButtonEl =\n", | |
" document.querySelector('#' + key + ' button');\n", | |
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n", | |
" quickchartButtonEl.classList.add('colab-df-spinner');\n", | |
" try {\n", | |
" const charts = await google.colab.kernel.invokeFunction(\n", | |
" 'suggestCharts', [key], {});\n", | |
" } catch (error) {\n", | |
" console.error('Error during call to suggestCharts:', error);\n", | |
" }\n", | |
" quickchartButtonEl.classList.remove('colab-df-spinner');\n", | |
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n", | |
" }\n", | |
" (() => {\n", | |
" let quickchartButtonEl =\n", | |
" document.querySelector('#df-51de0bfb-e645-428b-9507-70a9cc6f0e83 button');\n", | |
" quickchartButtonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
" })();\n", | |
" </script>\n", | |
"</div>\n", | |
"\n", | |
" </div>\n", | |
" </div>\n" | |
], | |
"application/vnd.google.colaboratory.intrinsic+json": { | |
"type": "dataframe", | |
"variable_name": "df" | |
} | |
}, | |
"metadata": {}, | |
"execution_count": 3 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"df.describe()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 384 | |
}, | |
"id": "HtdJ8b29ETZb", | |
"outputId": "35e49ec5-f0f0-444c-8ab6-52aa48d87768" | |
}, | |
"execution_count": 4, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
" mean radius mean texture mean perimeter mean area \\\n", | |
"count 569.000000 569.000000 569.000000 569.000000 \n", | |
"mean 14.127292 19.289649 91.969033 654.889104 \n", | |
"std 3.524049 4.301036 24.298981 351.914129 \n", | |
"min 6.981000 9.710000 43.790000 143.500000 \n", | |
"25% 11.700000 16.170000 75.170000 420.300000 \n", | |
"50% 13.370000 18.840000 86.240000 551.100000 \n", | |
"75% 15.780000 21.800000 104.100000 782.700000 \n", | |
"max 28.110000 39.280000 188.500000 2501.000000 \n", | |
"\n", | |
" mean smoothness mean compactness mean concavity mean concave points \\\n", | |
"count 569.000000 569.000000 569.000000 569.000000 \n", | |
"mean 0.096360 0.104341 0.088799 0.048919 \n", | |
"std 0.014064 0.052813 0.079720 0.038803 \n", | |
"min 0.052630 0.019380 0.000000 0.000000 \n", | |
"25% 0.086370 0.064920 0.029560 0.020310 \n", | |
"50% 0.095870 0.092630 0.061540 0.033500 \n", | |
"75% 0.105300 0.130400 0.130700 0.074000 \n", | |
"max 0.163400 0.345400 0.426800 0.201200 \n", | |
"\n", | |
" mean symmetry mean fractal dimension ... worst texture \\\n", | |
"count 569.000000 569.000000 ... 569.000000 \n", | |
"mean 0.181162 0.062798 ... 25.677223 \n", | |
"std 0.027414 0.007060 ... 6.146258 \n", | |
"min 0.106000 0.049960 ... 12.020000 \n", | |
"25% 0.161900 0.057700 ... 21.080000 \n", | |
"50% 0.179200 0.061540 ... 25.410000 \n", | |
"75% 0.195700 0.066120 ... 29.720000 \n", | |
"max 0.304000 0.097440 ... 49.540000 \n", | |
"\n", | |
" worst perimeter worst area worst smoothness worst compactness \\\n", | |
"count 569.000000 569.000000 569.000000 569.000000 \n", | |
"mean 107.261213 880.583128 0.132369 0.254265 \n", | |
"std 33.602542 569.356993 0.022832 0.157336 \n", | |
"min 50.410000 185.200000 0.071170 0.027290 \n", | |
"25% 84.110000 515.300000 0.116600 0.147200 \n", | |
"50% 97.660000 686.500000 0.131300 0.211900 \n", | |
"75% 125.400000 1084.000000 0.146000 0.339100 \n", | |
"max 251.200000 4254.000000 0.222600 1.058000 \n", | |
"\n", | |
" worst concavity worst concave points worst symmetry \\\n", | |
"count 569.000000 569.000000 569.000000 \n", | |
"mean 0.272188 0.114606 0.290076 \n", | |
"std 0.208624 0.065732 0.061867 \n", | |
"min 0.000000 0.000000 0.156500 \n", | |
"25% 0.114500 0.064930 0.250400 \n", | |
"50% 0.226700 0.099930 0.282200 \n", | |
"75% 0.382900 0.161400 0.317900 \n", | |
"max 1.252000 0.291000 0.663800 \n", | |
"\n", | |
" worst fractal dimension label \n", | |
"count 569.000000 569.000000 \n", | |
"mean 0.083946 0.627417 \n", | |
"std 0.018061 0.483918 \n", | |
"min 0.055040 0.000000 \n", | |
"25% 0.071460 0.000000 \n", | |
"50% 0.080040 1.000000 \n", | |
"75% 0.092080 1.000000 \n", | |
"max 0.207500 1.000000 \n", | |
"\n", | |
"[8 rows x 31 columns]" | |
], | |
"text/html": [ | |
"\n", | |
" <div id=\"df-4cd7c5c3-e363-4144-90ad-32da4fe0050c\" class=\"colab-df-container\">\n", | |
" <div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>mean radius</th>\n", | |
" <th>mean texture</th>\n", | |
" <th>mean perimeter</th>\n", | |
" <th>mean area</th>\n", | |
" <th>mean smoothness</th>\n", | |
" <th>mean compactness</th>\n", | |
" <th>mean concavity</th>\n", | |
" <th>mean concave points</th>\n", | |
" <th>mean symmetry</th>\n", | |
" <th>mean fractal dimension</th>\n", | |
" <th>...</th>\n", | |
" <th>worst texture</th>\n", | |
" <th>worst perimeter</th>\n", | |
" <th>worst area</th>\n", | |
" <th>worst smoothness</th>\n", | |
" <th>worst compactness</th>\n", | |
" <th>worst concavity</th>\n", | |
" <th>worst concave points</th>\n", | |
" <th>worst symmetry</th>\n", | |
" <th>worst fractal dimension</th>\n", | |
" <th>label</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>count</th>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>...</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" <td>569.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>mean</th>\n", | |
" <td>14.127292</td>\n", | |
" <td>19.289649</td>\n", | |
" <td>91.969033</td>\n", | |
" <td>654.889104</td>\n", | |
" <td>0.096360</td>\n", | |
" <td>0.104341</td>\n", | |
" <td>0.088799</td>\n", | |
" <td>0.048919</td>\n", | |
" <td>0.181162</td>\n", | |
" <td>0.062798</td>\n", | |
" <td>...</td>\n", | |
" <td>25.677223</td>\n", | |
" <td>107.261213</td>\n", | |
" <td>880.583128</td>\n", | |
" <td>0.132369</td>\n", | |
" <td>0.254265</td>\n", | |
" <td>0.272188</td>\n", | |
" <td>0.114606</td>\n", | |
" <td>0.290076</td>\n", | |
" <td>0.083946</td>\n", | |
" <td>0.627417</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>std</th>\n", | |
" <td>3.524049</td>\n", | |
" <td>4.301036</td>\n", | |
" <td>24.298981</td>\n", | |
" <td>351.914129</td>\n", | |
" <td>0.014064</td>\n", | |
" <td>0.052813</td>\n", | |
" <td>0.079720</td>\n", | |
" <td>0.038803</td>\n", | |
" <td>0.027414</td>\n", | |
" <td>0.007060</td>\n", | |
" <td>...</td>\n", | |
" <td>6.146258</td>\n", | |
" <td>33.602542</td>\n", | |
" <td>569.356993</td>\n", | |
" <td>0.022832</td>\n", | |
" <td>0.157336</td>\n", | |
" <td>0.208624</td>\n", | |
" <td>0.065732</td>\n", | |
" <td>0.061867</td>\n", | |
" <td>0.018061</td>\n", | |
" <td>0.483918</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>min</th>\n", | |
" <td>6.981000</td>\n", | |
" <td>9.710000</td>\n", | |
" <td>43.790000</td>\n", | |
" <td>143.500000</td>\n", | |
" <td>0.052630</td>\n", | |
" <td>0.019380</td>\n", | |
" <td>0.000000</td>\n", | |
" <td>0.000000</td>\n", | |
" <td>0.106000</td>\n", | |
" <td>0.049960</td>\n", | |
" <td>...</td>\n", | |
" <td>12.020000</td>\n", | |
" <td>50.410000</td>\n", | |
" <td>185.200000</td>\n", | |
" <td>0.071170</td>\n", | |
" <td>0.027290</td>\n", | |
" <td>0.000000</td>\n", | |
" <td>0.000000</td>\n", | |
" <td>0.156500</td>\n", | |
" <td>0.055040</td>\n", | |
" <td>0.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>25%</th>\n", | |
" <td>11.700000</td>\n", | |
" <td>16.170000</td>\n", | |
" <td>75.170000</td>\n", | |
" <td>420.300000</td>\n", | |
" <td>0.086370</td>\n", | |
" <td>0.064920</td>\n", | |
" <td>0.029560</td>\n", | |
" <td>0.020310</td>\n", | |
" <td>0.161900</td>\n", | |
" <td>0.057700</td>\n", | |
" <td>...</td>\n", | |
" <td>21.080000</td>\n", | |
" <td>84.110000</td>\n", | |
" <td>515.300000</td>\n", | |
" <td>0.116600</td>\n", | |
" <td>0.147200</td>\n", | |
" <td>0.114500</td>\n", | |
" <td>0.064930</td>\n", | |
" <td>0.250400</td>\n", | |
" <td>0.071460</td>\n", | |
" <td>0.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>50%</th>\n", | |
" <td>13.370000</td>\n", | |
" <td>18.840000</td>\n", | |
" <td>86.240000</td>\n", | |
" <td>551.100000</td>\n", | |
" <td>0.095870</td>\n", | |
" <td>0.092630</td>\n", | |
" <td>0.061540</td>\n", | |
" <td>0.033500</td>\n", | |
" <td>0.179200</td>\n", | |
" <td>0.061540</td>\n", | |
" <td>...</td>\n", | |
" <td>25.410000</td>\n", | |
" <td>97.660000</td>\n", | |
" <td>686.500000</td>\n", | |
" <td>0.131300</td>\n", | |
" <td>0.211900</td>\n", | |
" <td>0.226700</td>\n", | |
" <td>0.099930</td>\n", | |
" <td>0.282200</td>\n", | |
" <td>0.080040</td>\n", | |
" <td>1.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>75%</th>\n", | |
" <td>15.780000</td>\n", | |
" <td>21.800000</td>\n", | |
" <td>104.100000</td>\n", | |
" <td>782.700000</td>\n", | |
" <td>0.105300</td>\n", | |
" <td>0.130400</td>\n", | |
" <td>0.130700</td>\n", | |
" <td>0.074000</td>\n", | |
" <td>0.195700</td>\n", | |
" <td>0.066120</td>\n", | |
" <td>...</td>\n", | |
" <td>29.720000</td>\n", | |
" <td>125.400000</td>\n", | |
" <td>1084.000000</td>\n", | |
" <td>0.146000</td>\n", | |
" <td>0.339100</td>\n", | |
" <td>0.382900</td>\n", | |
" <td>0.161400</td>\n", | |
" <td>0.317900</td>\n", | |
" <td>0.092080</td>\n", | |
" <td>1.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>max</th>\n", | |
" <td>28.110000</td>\n", | |
" <td>39.280000</td>\n", | |
" <td>188.500000</td>\n", | |
" <td>2501.000000</td>\n", | |
" <td>0.163400</td>\n", | |
" <td>0.345400</td>\n", | |
" <td>0.426800</td>\n", | |
" <td>0.201200</td>\n", | |
" <td>0.304000</td>\n", | |
" <td>0.097440</td>\n", | |
" <td>...</td>\n", | |
" <td>49.540000</td>\n", | |
" <td>251.200000</td>\n", | |
" <td>4254.000000</td>\n", | |
" <td>0.222600</td>\n", | |
" <td>1.058000</td>\n", | |
" <td>1.252000</td>\n", | |
" <td>0.291000</td>\n", | |
" <td>0.663800</td>\n", | |
" <td>0.207500</td>\n", | |
" <td>1.000000</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"<p>8 rows × 31 columns</p>\n", | |
"</div>\n", | |
" <div class=\"colab-df-buttons\">\n", | |
"\n", | |
" <div class=\"colab-df-container\">\n", | |
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-4cd7c5c3-e363-4144-90ad-32da4fe0050c')\"\n", | |
" title=\"Convert this dataframe to an interactive table.\"\n", | |
" style=\"display:none;\">\n", | |
"\n", | |
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n", | |
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n", | |
" </svg>\n", | |
" </button>\n", | |
"\n", | |
" <style>\n", | |
" .colab-df-container {\n", | |
" display:flex;\n", | |
" gap: 12px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert {\n", | |
" background-color: #E8F0FE;\n", | |
" border: none;\n", | |
" border-radius: 50%;\n", | |
" cursor: pointer;\n", | |
" display: none;\n", | |
" fill: #1967D2;\n", | |
" height: 32px;\n", | |
" padding: 0 0 0 0;\n", | |
" width: 32px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert:hover {\n", | |
" background-color: #E2EBFA;\n", | |
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n", | |
" fill: #174EA6;\n", | |
" }\n", | |
"\n", | |
" .colab-df-buttons div {\n", | |
" margin-bottom: 4px;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert {\n", | |
" background-color: #3B4455;\n", | |
" fill: #D2E3FC;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert:hover {\n", | |
" background-color: #434B5C;\n", | |
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n", | |
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n", | |
" fill: #FFFFFF;\n", | |
" }\n", | |
" </style>\n", | |
"\n", | |
" <script>\n", | |
" const buttonEl =\n", | |
" document.querySelector('#df-4cd7c5c3-e363-4144-90ad-32da4fe0050c button.colab-df-convert');\n", | |
" buttonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
"\n", | |
" async function convertToInteractive(key) {\n", | |
" const element = document.querySelector('#df-4cd7c5c3-e363-4144-90ad-32da4fe0050c');\n", | |
" const dataTable =\n", | |
" await google.colab.kernel.invokeFunction('convertToInteractive',\n", | |
" [key], {});\n", | |
" if (!dataTable) return;\n", | |
"\n", | |
" const docLinkHtml = 'Like what you see? Visit the ' +\n", | |
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n", | |
" + ' to learn more about interactive tables.';\n", | |
" element.innerHTML = '';\n", | |
" dataTable['output_type'] = 'display_data';\n", | |
" await google.colab.output.renderOutput(dataTable, element);\n", | |
" const docLink = document.createElement('div');\n", | |
" docLink.innerHTML = docLinkHtml;\n", | |
" element.appendChild(docLink);\n", | |
" }\n", | |
" </script>\n", | |
" </div>\n", | |
"\n", | |
"\n", | |
"<div id=\"df-a8c3e45a-e1ee-4840-b774-7f38a099272e\">\n", | |
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-a8c3e45a-e1ee-4840-b774-7f38a099272e')\"\n", | |
" title=\"Suggest charts\"\n", | |
" style=\"display:none;\">\n", | |
"\n", | |
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n", | |
" width=\"24px\">\n", | |
" <g>\n", | |
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n", | |
" </g>\n", | |
"</svg>\n", | |
" </button>\n", | |
"\n", | |
"<style>\n", | |
" .colab-df-quickchart {\n", | |
" --bg-color: #E8F0FE;\n", | |
" --fill-color: #1967D2;\n", | |
" --hover-bg-color: #E2EBFA;\n", | |
" --hover-fill-color: #174EA6;\n", | |
" --disabled-fill-color: #AAA;\n", | |
" --disabled-bg-color: #DDD;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-quickchart {\n", | |
" --bg-color: #3B4455;\n", | |
" --fill-color: #D2E3FC;\n", | |
" --hover-bg-color: #434B5C;\n", | |
" --hover-fill-color: #FFFFFF;\n", | |
" --disabled-bg-color: #3B4455;\n", | |
" --disabled-fill-color: #666;\n", | |
" }\n", | |
"\n", | |
" .colab-df-quickchart {\n", | |
" background-color: var(--bg-color);\n", | |
" border: none;\n", | |
" border-radius: 50%;\n", | |
" cursor: pointer;\n", | |
" display: none;\n", | |
" fill: var(--fill-color);\n", | |
" height: 32px;\n", | |
" padding: 0;\n", | |
" width: 32px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-quickchart:hover {\n", | |
" background-color: var(--hover-bg-color);\n", | |
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n", | |
" fill: var(--button-hover-fill-color);\n", | |
" }\n", | |
"\n", | |
" .colab-df-quickchart-complete:disabled,\n", | |
" .colab-df-quickchart-complete:disabled:hover {\n", | |
" background-color: var(--disabled-bg-color);\n", | |
" fill: var(--disabled-fill-color);\n", | |
" box-shadow: none;\n", | |
" }\n", | |
"\n", | |
" .colab-df-spinner {\n", | |
" border: 2px solid var(--fill-color);\n", | |
" border-color: transparent;\n", | |
" border-bottom-color: var(--fill-color);\n", | |
" animation:\n", | |
" spin 1s steps(1) infinite;\n", | |
" }\n", | |
"\n", | |
" @keyframes spin {\n", | |
" 0% {\n", | |
" border-color: transparent;\n", | |
" border-bottom-color: var(--fill-color);\n", | |
" border-left-color: var(--fill-color);\n", | |
" }\n", | |
" 20% {\n", | |
" border-color: transparent;\n", | |
" border-left-color: var(--fill-color);\n", | |
" border-top-color: var(--fill-color);\n", | |
" }\n", | |
" 30% {\n", | |
" border-color: transparent;\n", | |
" border-left-color: var(--fill-color);\n", | |
" border-top-color: var(--fill-color);\n", | |
" border-right-color: var(--fill-color);\n", | |
" }\n", | |
" 40% {\n", | |
" border-color: transparent;\n", | |
" border-right-color: var(--fill-color);\n", | |
" border-top-color: var(--fill-color);\n", | |
" }\n", | |
" 60% {\n", | |
" border-color: transparent;\n", | |
" border-right-color: var(--fill-color);\n", | |
" }\n", | |
" 80% {\n", | |
" border-color: transparent;\n", | |
" border-right-color: var(--fill-color);\n", | |
" border-bottom-color: var(--fill-color);\n", | |
" }\n", | |
" 90% {\n", | |
" border-color: transparent;\n", | |
" border-bottom-color: var(--fill-color);\n", | |
" }\n", | |
" }\n", | |
"</style>\n", | |
"\n", | |
" <script>\n", | |
" async function quickchart(key) {\n", | |
" const quickchartButtonEl =\n", | |
" document.querySelector('#' + key + ' button');\n", | |
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n", | |
" quickchartButtonEl.classList.add('colab-df-spinner');\n", | |
" try {\n", | |
" const charts = await google.colab.kernel.invokeFunction(\n", | |
" 'suggestCharts', [key], {});\n", | |
" } catch (error) {\n", | |
" console.error('Error during call to suggestCharts:', error);\n", | |
" }\n", | |
" quickchartButtonEl.classList.remove('colab-df-spinner');\n", | |
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n", | |
" }\n", | |
" (() => {\n", | |
" let quickchartButtonEl =\n", | |
" document.querySelector('#df-a8c3e45a-e1ee-4840-b774-7f38a099272e button');\n", | |
" quickchartButtonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
" })();\n", | |
" </script>\n", | |
"</div>\n", | |
"\n", | |
" </div>\n", | |
" </div>\n" | |
], | |
"application/vnd.google.colaboratory.intrinsic+json": { | |
"type": "dataframe" | |
} | |
}, | |
"metadata": {}, | |
"execution_count": 4 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"df.info()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "VQ3w6RP0EbIC", | |
"outputId": "486327e5-209a-44e3-ca13-8a2b3ec141a7" | |
}, | |
"execution_count": 5, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"<class 'pandas.core.frame.DataFrame'>\n", | |
"RangeIndex: 569 entries, 0 to 568\n", | |
"Data columns (total 31 columns):\n", | |
" # Column Non-Null Count Dtype \n", | |
"--- ------ -------------- ----- \n", | |
" 0 mean radius 569 non-null float64\n", | |
" 1 mean texture 569 non-null float64\n", | |
" 2 mean perimeter 569 non-null float64\n", | |
" 3 mean area 569 non-null float64\n", | |
" 4 mean smoothness 569 non-null float64\n", | |
" 5 mean compactness 569 non-null float64\n", | |
" 6 mean concavity 569 non-null float64\n", | |
" 7 mean concave points 569 non-null float64\n", | |
" 8 mean symmetry 569 non-null float64\n", | |
" 9 mean fractal dimension 569 non-null float64\n", | |
" 10 radius error 569 non-null float64\n", | |
" 11 texture error 569 non-null float64\n", | |
" 12 perimeter error 569 non-null float64\n", | |
" 13 area error 569 non-null float64\n", | |
" 14 smoothness error 569 non-null float64\n", | |
" 15 compactness error 569 non-null float64\n", | |
" 16 concavity error 569 non-null float64\n", | |
" 17 concave points error 569 non-null float64\n", | |
" 18 symmetry error 569 non-null float64\n", | |
" 19 fractal dimension error 569 non-null float64\n", | |
" 20 worst radius 569 non-null float64\n", | |
" 21 worst texture 569 non-null float64\n", | |
" 22 worst perimeter 569 non-null float64\n", | |
" 23 worst area 569 non-null float64\n", | |
" 24 worst smoothness 569 non-null float64\n", | |
" 25 worst compactness 569 non-null float64\n", | |
" 26 worst concavity 569 non-null float64\n", | |
" 27 worst concave points 569 non-null float64\n", | |
" 28 worst symmetry 569 non-null float64\n", | |
" 29 worst fractal dimension 569 non-null float64\n", | |
" 30 label 569 non-null int64 \n", | |
"dtypes: float64(30), int64(1)\n", | |
"memory usage: 137.9 KB\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"df['label'].value_counts()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "RJ6EnxywFQ4M", | |
"outputId": "b466befc-fe2c-431b-8513-fdc2fd287dcc" | |
}, | |
"execution_count": 6, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"label\n", | |
"1 357\n", | |
"0 212\n", | |
"Name: count, dtype: int64" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 6 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"import numpy as np\n", | |
"np.unique(cancer.target_names) # 0: benign, 1: malignant" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "nR5npuudGSV6", | |
"outputId": "c580b433-a942-4c5c-8f14-b01db2bfc77d" | |
}, | |
"execution_count": 7, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"array(['benign', 'malignant'], dtype='<U9')" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 7 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# Data Processing" | |
], | |
"metadata": { | |
"id": "lb5YoeHDq4hl" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"x_raw = cancer.data\n", | |
"y_raw = cancer.target\n", | |
"\n", | |
"print(f'{type(x_raw)=}:{x_raw.shape=}')\n", | |
"print(f'{type(y_raw)=}:{y_raw.shape=}')" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "HFn8uURBtCP5", | |
"outputId": "397aefc8-384f-4138-be72-ed9f624e36ce" | |
}, | |
"execution_count": 8, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"type(x_raw)=<class 'numpy.ndarray'>:x_raw.shape=(569, 30)\n", | |
"type(y_raw)=<class 'numpy.ndarray'>:y_raw.shape=(569,)\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"cancer.feature_names" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "1frbC4zpuCkL", | |
"outputId": "a0f0d84a-40c2-4826-85b4-49a5fb252d4c" | |
}, | |
"execution_count": 9, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"array(['mean radius', 'mean texture', 'mean perimeter', 'mean area',\n", | |
" 'mean smoothness', 'mean compactness', 'mean concavity',\n", | |
" 'mean concave points', 'mean symmetry', 'mean fractal dimension',\n", | |
" 'radius error', 'texture error', 'perimeter error', 'area error',\n", | |
" 'smoothness error', 'compactness error', 'concavity error',\n", | |
" 'concave points error', 'symmetry error',\n", | |
" 'fractal dimension error', 'worst radius', 'worst texture',\n", | |
" 'worst perimeter', 'worst area', 'worst smoothness',\n", | |
" 'worst compactness', 'worst concavity', 'worst concave points',\n", | |
" 'worst symmetry', 'worst fractal dimension'], dtype='<U23')" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 9 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"from torch.utils.data import Dataset\n", | |
"from sklearn.model_selection import train_test_split\n", | |
"\n", | |
"x_train, x_test, y_train, y_test = train_test_split(\n", | |
" x_raw, y_raw, test_size = .1,\n", | |
" stratify=y_raw,\n", | |
")\n", | |
"\n", | |
"x_train, x_val, y_train, y_val = train_test_split(\n", | |
" x_train, y_train, test_size = .1,\n", | |
" stratify=y_train,\n", | |
")\n", | |
"\n", | |
"print(f'{len(x_train)=}\\n {len(x_val)=}\\n {len(x_test)=}')" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "DcTbgjUDuW1Q", | |
"outputId": "75aa1b4c-35b6-41bd-d442-a7d20d99f4e8" | |
}, | |
"execution_count": 11, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"len(x_train)=460\n", | |
" len(x_val)=52\n", | |
" len(x_test)=57\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"import numpy as np\n", | |
"\n", | |
"test_r = np.unique(y_test , return_counts = True)\n", | |
"train_r = np.unique(y_train, return_counts = True)\n", | |
"val_r = np.unique(y_val, return_counts = True)\n", | |
"\n", | |
"print(\"test's cancer ratio : \", np.round( test_r[1][1]/np.sum( test_r[1]),2))\n", | |
"print(\"train's cancer ratio: \", np.round(train_r[1][1]/np.sum(train_r[1]),2))\n", | |
"print(\"val's cancer ratio. : \", np.round( val_r[1][1]/np.sum( val_r[1]),2))" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "Sm5GtCYGu8Up", | |
"outputId": "04a04f41-f88b-4c21-9fd2-16d043ff3110" | |
}, | |
"execution_count": 12, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"test's cancer ratio : 0.63\n", | |
"train's cancer ratio: 0.63\n", | |
"val's cancer ratio. : 0.63\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"print(f'{x_train.shape=}\\n{ x_val.shape= }\\n {x_test.shape= }')" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "rYQVGnODvNsV", | |
"outputId": "6b44f77b-55ae-47bf-da8f-561b38bd6a75" | |
}, | |
"execution_count": 14, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"x_train.shape=(460, 30)\n", | |
" x_val.shape= (52, 30)\n", | |
" x_test.shape= (57, 30)\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# Dataset and DataLoader" | |
], | |
"metadata": { | |
"id": "gCnQPW_ajg5R" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"from torch.utils.data import Dataset\n", | |
"import torch\n", | |
"import torch.nn as nn\n", | |
"\n", | |
"class BCDataset (Dataset):\n", | |
"\n", | |
" def __init__(self, r_vec, r_label):\n", | |
" self.data = torch.tensor(r_vec).float()\n", | |
" self.label = torch.tensor(r_label).float().unsqueeze(1)\n", | |
"\n", | |
" def __len__(self):\n", | |
" return len(self.data)\n", | |
"\n", | |
" def __getitem__(self, idx):\n", | |
" return self.data[idx],self.label[idx]\n", | |
"\n", | |
"train_ds = BCDataset(x_train,y_train)\n", | |
"val_ds = BCDataset(x_val, y_val)\n", | |
"test_ds = BCDataset(x_test, y_test)" | |
], | |
"metadata": { | |
"id": "xCk7YXHRyQ3f" | |
}, | |
"execution_count": 15, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"next(iter(train_ds))" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "pWDO_6s_K-ch", | |
"outputId": "ff5fd13a-1dd1-4d0e-bbeb-c04e79935287" | |
}, | |
"execution_count": 16, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"(tensor([1.3200e+01, 1.5820e+01, 8.4070e+01, 5.3730e+02, 8.5110e-02, 5.2510e-02,\n", | |
" 1.4610e-03, 3.2610e-03, 1.6320e-01, 5.8940e-02, 1.9030e-01, 5.7350e-01,\n", | |
" 1.2040e+00, 1.5500e+01, 3.6320e-03, 7.8610e-03, 1.1280e-03, 2.3860e-03,\n", | |
" 1.3440e-02, 2.5850e-03, 1.4410e+01, 2.0450e+01, 9.2000e+01, 6.3690e+02,\n", | |
" 1.1280e-01, 1.3460e-01, 1.1200e-02, 2.5000e-02, 2.6510e-01, 8.3850e-02]),\n", | |
" tensor([1.]))" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 16 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"from torch.utils.data import DataLoader\n", | |
"\n", | |
"train_loader = DataLoader(\n", | |
" dataset = train_ds,\n", | |
" batch_size = 32,\n", | |
" shuffle = True,\n", | |
")\n", | |
"valid_loader = DataLoader(\n", | |
" dataset = val_ds,\n", | |
" batch_size = 32,\n", | |
" shuffle = True,\n", | |
")\n", | |
"test_loader = DataLoader(\n", | |
" dataset = test_ds,\n", | |
" batch_size = 32,\n", | |
" shuffle = False,\n", | |
")" | |
], | |
"metadata": { | |
"id": "1JnWNey3Q-tO" | |
}, | |
"execution_count": 17, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# Training Loop Implementation" | |
], | |
"metadata": { | |
"id": "Gk4lP3FpjlOt" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"from tqdm import tqdm\n", | |
"\n", | |
"def train_loop (\n", | |
" n_epoch,\n", | |
" train_ds, val_ds,\n", | |
" model, optimizer, loss_fnc,\n", | |
" device = 'cpu',):\n", | |
"\n", | |
" log_hist = torch.zeros([0,3]).to(device)\n", | |
" for epoch in tqdm(range(n_epoch)):\n", | |
" # print(f'\\r{epoch:6>}', end='')\n", | |
"\n", | |
" model = model.to(device)\n", | |
" model.train()\n", | |
"\n", | |
" for x_tensor, y_tensor in train_ds:\n", | |
"\n", | |
" x_tensor.to(device)\n", | |
" y_tensor.to(device)\n", | |
"\n", | |
" y_pred = model(x_tensor)\n", | |
" loss_train = loss_fnc(y_pred, y_tensor)\n", | |
"\n", | |
" if torch.isinf(loss_train):\n", | |
" print(f'Error: loss is infinity!')\n", | |
" break\n", | |
"\n", | |
" optimizer.zero_grad()\n", | |
" loss_train.backward()\n", | |
" optimizer.step()\n", | |
"\n", | |
" with torch.no_grad():\n", | |
" for x_tensor, y_tensor in val_ds:\n", | |
" x_tensor = x_tensor.to(device)\n", | |
" y_tensor = y_tensor.to(device)\n", | |
" model.eval()\n", | |
" pred = model(x_tensor)\n", | |
" loss_val = loss_fnc(pred, y_tensor)\n", | |
"\n", | |
"\n", | |
" if epoch % 100 == 0:\n", | |
" tmp = torch.tensor([epoch, loss_train.item(), loss_val.item()]).to(log_hist.device)\n", | |
" # print(tmp)\n", | |
" log_hist = torch.concat( (log_hist, tmp.reshape(1,-1)), dim=0 )\n", | |
" print(f' Epoch / loss {loss_train.item():.4f} / val_loss {loss_val.item():.4f}')\n", | |
"\n", | |
" if epoch == n_epoch:\n", | |
" print(f' Epoch / loss {loss_train.item():.4f} / val_loss {loss_val.item():.4f}')\n", | |
"\n", | |
" return model,log_hist\n" | |
], | |
"metadata": { | |
"id": "ANWVidl1LB8C" | |
}, | |
"execution_count": 33, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# Model Implementation" | |
], | |
"metadata": { | |
"id": "ONhcGYTmjo06" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"class SimpleModel(nn.Module):\n", | |
"\n", | |
" def __init__(self, n_feature):\n", | |
" super().__init__()\n", | |
"\n", | |
" self.l0 = nn.Linear(n_feature, 16)\n", | |
" self.a0 = nn.ReLU()\n", | |
" self.l1 = nn.Linear(16,16)\n", | |
" self.a1 = nn.ReLU()\n", | |
" self.lf = nn.Linear(16,1)\n", | |
" self.out = nn.Sigmoid()\n", | |
"\n", | |
" def forward(self, x):\n", | |
" x = self.l0(x)\n", | |
" x = self.a0(x)\n", | |
" x = self.l1(x)\n", | |
" x = self.a1(x)\n", | |
" x = self.lf(x)\n", | |
" x = self.out(x)\n", | |
"\n", | |
" return x" | |
], | |
"metadata": { | |
"id": "3jQjVqvBO7x1" | |
}, | |
"execution_count": 34, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"### Test Model" | |
], | |
"metadata": { | |
"id": "aTCpXoHTjx5z" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# input vector의 number of components확인.\n", | |
"n_features = x_raw.shape[-1]\n", | |
"print(f'{n_features =}')\n", | |
"\n", | |
"# random한 input vector 5개에 대한\n", | |
"# 모델의 예측 결과를 확인하여\n", | |
"# 모델의 i/o 의 shape 확인.\n", | |
"model = SimpleModel(n_features)\n", | |
"x = torch.randn( (5, n_features) )\n", | |
"print(f'{x.shape =}')\n", | |
"print(f'{model(x).shape=}')" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "2PyGzAoIP4XY", | |
"outputId": "88b34990-a125-4291-dd9b-f797821508d8" | |
}, | |
"execution_count": 35, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"n_features =30\n", | |
"x.shape =torch.Size([5, 30])\n", | |
"model(x).shape=torch.Size([5, 1])\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# Training" | |
], | |
"metadata": { | |
"id": "3HP3z8YHjXVB" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# device 설정.\n", | |
"device = (\n", | |
" \"cuda\" if torch.cuda.is_available()\n", | |
" else \"mps\"\n", | |
" if torch.backends.mps.is_available()\n", | |
" else \"cpu\"\n", | |
" )\n", | |
"print(f\"{device=}\")\n" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "4_8JdhNbERd-", | |
"outputId": "60a9f3fc-ed0c-415a-c827-095a8798fef4" | |
}, | |
"execution_count": 36, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"device='cpu'\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# number of epochs\n", | |
"n_epoch = 1000\n", | |
"# learning ratio\n", | |
"lr = 1e-4\n", | |
"\n", | |
"# loss function 설정\n", | |
"loss_fnc = nn.BCELoss()\n", | |
"# 모델 생성 및 초기화\n", | |
"model = SimpleModel(n_features)\n", | |
"# optimizer 생성 및 초기화\n", | |
"optimizer = torch.optim.SGD(model.parameters(), lr=lr)\n", | |
"\n", | |
"m, h = train_loop (\n", | |
" n_epoch,\n", | |
" train_loader, valid_loader,\n", | |
" model, optimizer, loss_fnc,\n", | |
" device = device)\n" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "3ffpgj5jMbsZ", | |
"outputId": "91d918f2-f1d0-45a4-b5e4-8faa346a1211" | |
}, | |
"execution_count": 26, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stderr", | |
"text": [ | |
" 1%| | 10/1000 [00:00<00:19, 49.60it/s]" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
" Epoch / loss 0.9343 / val_loss 1.1734\n" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stderr", | |
"text": [ | |
" 11%|█ | 107/1000 [00:02<00:22, 39.82it/s]" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
" Epoch / loss 0.0846 / val_loss 0.0781\n" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stderr", | |
"text": [ | |
" 21%|██ | 209/1000 [00:04<00:14, 55.17it/s]" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
" Epoch / loss 0.2112 / val_loss 0.1641\n" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stderr", | |
"text": [ | |
" 31%|███ | 311/1000 [00:06<00:12, 55.47it/s]" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
" Epoch / loss 0.2714 / val_loss 0.2213\n" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stderr", | |
"text": [ | |
" 41%|████ | 407/1000 [00:08<00:10, 56.20it/s]" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
" Epoch / loss 0.1352 / val_loss 0.2115\n" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stderr", | |
"text": [ | |
" 51%|█████ | 509/1000 [00:10<00:08, 56.50it/s]" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
" Epoch / loss 0.1822 / val_loss 0.1590\n" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stderr", | |
"text": [ | |
" 61%|██████ | 611/1000 [00:11<00:06, 56.33it/s]" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
" Epoch / loss 0.1287 / val_loss 0.1117\n" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stderr", | |
"text": [ | |
" 71%|███████ | 707/1000 [00:13<00:05, 54.96it/s]" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
" Epoch / loss 0.0594 / val_loss 0.0785\n" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stderr", | |
"text": [ | |
" 81%|████████ | 806/1000 [00:16<00:05, 37.92it/s]" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
" Epoch / loss 0.2125 / val_loss 0.1328\n" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stderr", | |
"text": [ | |
" 91%|█████████ | 908/1000 [00:18<00:01, 55.32it/s]" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
" Epoch / loss 0.0636 / val_loss 0.1116\n" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stderr", | |
"text": [ | |
"100%|██████████| 1000/1000 [00:19<00:00, 50.33it/s]\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# Learning Curve Check" | |
], | |
"metadata": { | |
"id": "vcWQDO8vjQW9" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"h" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "ZM1WKxeSItRM", | |
"outputId": "35f7774c-ca60-4b45-bcfb-2a6a85bd08f7" | |
}, | |
"execution_count": 27, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"tensor([[0.0000e+00, 9.3433e-01, 1.1734e+00],\n", | |
" [1.0000e+02, 8.4551e-02, 7.8147e-02],\n", | |
" [2.0000e+02, 2.1115e-01, 1.6410e-01],\n", | |
" [3.0000e+02, 2.7140e-01, 2.2133e-01],\n", | |
" [4.0000e+02, 1.3520e-01, 2.1155e-01],\n", | |
" [5.0000e+02, 1.8224e-01, 1.5905e-01],\n", | |
" [6.0000e+02, 1.2867e-01, 1.1170e-01],\n", | |
" [7.0000e+02, 5.9447e-02, 7.8507e-02],\n", | |
" [8.0000e+02, 2.1250e-01, 1.3276e-01],\n", | |
" [9.0000e+02, 6.3619e-02, 1.1159e-01]])" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 27 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"import matplotlib.pyplot as plt\n", | |
"\n", | |
"h0 = h.detach().numpy()\n", | |
"print(h0.shape)\n", | |
"plt.plot(h0[:,0], h0[:,1], label='train')\n", | |
"plt.plot(h0[:,0], h0[:,2], label='valid')\n", | |
"plt.legend()\n", | |
"plt.grid()\n", | |
"plt.show()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 448 | |
}, | |
"id": "2PbbyHveHWp0", | |
"outputId": "ec67dd02-d333-46d9-9f15-d7f669a886ff" | |
}, | |
"execution_count": 30, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"(10, 3)\n" | |
] | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"<Figure size 640x480 with 1 Axes>" | |
], | |
"image/png": "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\n" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# Test" | |
], | |
"metadata": { | |
"id": "tq0zTWUvjLxO" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"f_m = model.cpu()\n", | |
"f_m.eval()\n", | |
"with torch.no_grad():\n", | |
" is_first = True\n", | |
" for x_tensor, y_tensor in test_loader:\n", | |
" x_tensor = x_tensor.cpu()\n", | |
" y_tensor = y_tensor.cpu()\n", | |
" pred = f_m(x_tensor)\n", | |
"\n", | |
" # print(y_tensor.numpy().shape)\n", | |
" if is_first:\n", | |
" test_pred_prob = pred.numpy().copy()\n", | |
" test_label = y_tensor.numpy().copy()\n", | |
" is_first = False\n", | |
" else:\n", | |
" test_label = np.concatenate((test_label, y_tensor.numpy()), axis=0)\n", | |
" test_pred_prob = np.concatenate((test_pred_prob, pred.numpy()), axis=0)\n", | |
"\n", | |
"print(test_label.shape, test_label.dtype)\n", | |
"print(test_pred_prob.shape, test_pred_prob.dtype)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "bJEygiJETGIt", | |
"outputId": "da11d3b9-844c-4743-8463-df6958378fc5" | |
}, | |
"execution_count": 28, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"(57, 1) float32\n", | |
"(57, 1) float32\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"from sklearn.metrics import (\n", | |
" confusion_matrix,\n", | |
" precision_score,\n", | |
" recall_score,\n", | |
" f1_score,\n", | |
" fbeta_score,\n", | |
")\n", | |
"pred = np.round(test_pred_prob)\n", | |
"label = test_label\n", | |
"\n", | |
"print('Confusion Matrix\\n',\n", | |
" str(confusion_matrix(label,pred))\n", | |
" )\n", | |
"print(f'Precision:{precision_score(label,pred):.2f}')\n", | |
"print(f'Recall. :{recall_score(label,pred):.2f}')\n", | |
"print(f'F1-Score :{f1_score(label,pred):.2f}')\n", | |
"print(f'F2-Score :{fbeta_score(label,pred,beta=2):.2f}')\n", | |
"\n" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "BhUC7lATWE4g", | |
"outputId": "8903c18a-82a9-41e0-b511-01d9f8148909" | |
}, | |
"execution_count": 31, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Confusion Matrix\n", | |
" [[18 3]\n", | |
" [ 3 33]]\n", | |
"Precision:0.92\n", | |
"Recall. :0.92\n", | |
"F1-Score :0.92\n", | |
"F2-Score :0.92\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"pred" | |
], | |
"metadata": { | |
"id": "IQlQpO-CYcHV", | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"outputId": "bccced75-ce35-488a-c0b5-9c8359bd788c" | |
}, | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"array([7.7657259e-01, 6.2944692e-01, 8.5690951e-01, 2.7190824e-04,\n", | |
" 1.3909681e-01, 9.3183416e-01, 9.6883911e-01, 3.0913796e-09,\n", | |
" 9.4301140e-01, 9.1904014e-01, 9.2052245e-01, 7.9076892e-01,\n", | |
" 4.7718093e-01, 5.0635308e-01, 6.9300316e-02, 9.8726141e-01,\n", | |
" 9.7495699e-01, 9.0912378e-01, 8.5156107e-01, 9.7413176e-01,\n", | |
" 7.8029285e-07, 9.4359112e-01, 1.7913450e-01, 9.8232216e-01,\n", | |
" 9.5713109e-01, 1.1772829e-09, 9.7428089e-01, 7.1198255e-01,\n", | |
" 5.2952123e-07, 8.3453077e-01, 9.5434213e-01, 9.1411507e-01,\n", | |
" 7.0542717e-01, 5.4176518e-05, 4.3255496e-10, 9.2647159e-01,\n", | |
" 9.7760856e-01, 1.9108060e-05, 9.6683151e-01, 1.3417931e-01,\n", | |
" 9.7265130e-01, 8.4110308e-01, 1.3005364e-04, 8.0472642e-01,\n", | |
" 9.3157888e-07, 2.6140261e-01, 5.3463671e-17, 9.7554988e-01,\n", | |
" 2.5391018e-01, 9.2323446e-01, 9.6894068e-01, 8.7520927e-01,\n", | |
" 1.8549596e-01, 9.3754983e-01, 1.3416738e-05, 1.0306122e-08,\n", | |
" 1.7757897e-03], dtype=float32)" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 43 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [], | |
"metadata": { | |
"id": "NLurYYLLXM2s" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment