diff --git a/IUM_13.ipynb b/IUM_13.ipynb
new file mode 100644
index 0000000..6233abb
--- /dev/null
+++ b/IUM_13.ipynb
@@ -0,0 +1,1601 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## Experiments - neural networks in breast cancer classification problem"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "e1e08c454a98dd01"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "outputs": [],
+ "source": [
+ "# Data manipulation\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "\n",
+ "# Data visualization\n",
+ "import matplotlib.pyplot as plt\n",
+ "import seaborn as sns\n",
+ "sns.set_style('whitegrid')\n",
+ "\n",
+ "# Data preprocessing\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.preprocessing import StandardScaler\n",
+ "\n",
+ "# Metrics\n",
+ "from sklearn.metrics import confusion_matrix, classification_report\n",
+ "from sklearn.metrics import accuracy_score\n",
+ "\n",
+ "# Deep learning\n",
+ "import torch\n",
+ "import torch.nn as nn\n",
+ "import torch.optim as optim"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-06-08T15:50:23.912931300Z",
+ "start_time": "2024-06-08T15:50:19.472582100Z"
+ }
+ },
+ "id": "c0c219cc1bbd4c7a"
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "#### Methods for visualizing confusion matrix and classification report"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "6064474e7a56f80e"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "outputs": [],
+ "source": [
+ "# Plot confusion matrix\n",
+ "def plot_confusion_matrix(cm, classes, title='Confusion matrix', cmap='Blues', figsize=(10, 6), axis=None):\n",
+ " \"\"\"\n",
+ " Plot the confusion matrix.\n",
+ " \"\"\"\n",
+ " if axis is None:\n",
+ " fig, ax = plt.subplots(figsize=figsize)\n",
+ " else:\n",
+ " ax = axis\n",
+ " \n",
+ " sns.heatmap(cm, annot=True, fmt='d', xticklabels=classes, yticklabels=classes, cmap=cmap, ax=ax)\n",
+ " \n",
+ " ax.set_title(title)\n",
+ " ax.set_xlabel('Predicted label')\n",
+ " ax.set_ylabel('True label')\n",
+ " \n",
+ " if axis is None:\n",
+ " plt.show() \n",
+ " \n",
+ "# Plot classification report\n",
+ "def plot_classification_report(report, title='Classification report', axis=None):\n",
+ " \"\"\"\n",
+ " Plot the classification report.\n",
+ " \"\"\"\n",
+ " if axis is None:\n",
+ " fig, ax = plt.subplots(figsize=(10, 6))\n",
+ " else:\n",
+ " ax = axis\n",
+ " \n",
+ " sns.heatmap(pd.DataFrame(report).iloc[:-1, :].T, annot=True, cmap='Blues', ax=ax)\n",
+ " \n",
+ " ax.set_title('Classification report')\n",
+ " ax.set_xlabel('Metrics')\n",
+ " ax.set_ylabel('Classes')\n",
+ " \n",
+ " if axis is None:\n",
+ " plt.show()"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-06-08T15:51:26.166904900Z",
+ "start_time": "2024-06-08T15:51:26.145794400Z"
+ }
+ },
+ "id": "689b41e45e990a1b"
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "#### Load data"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "c7ad4d251442c34c"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "outputs": [],
+ "source": [
+ "# Load data\n",
+ "data = pd.read_csv('datasets/data.csv')\n",
+ "\n",
+ "# Delete unnecessary columns\n",
+ "data.drop(['id'], axis=1, inplace=True)"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-06-08T15:52:50.237396100Z",
+ "start_time": "2024-06-08T15:52:50.201061700Z"
+ }
+ },
+ "id": "54411dcad03637c2"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 76,
+ "outputs": [
+ {
+ "data": {
+ "text/plain": " diagnosis radius_mean texture_mean perimeter_mean area_mean \\\n0 1.0 0.521037 0.022658 0.545989 0.363733 \n1 1.0 0.643144 0.272574 0.615783 0.501591 \n2 1.0 0.601496 0.390260 0.595743 0.449417 \n3 1.0 0.210090 0.360839 0.233501 0.102906 \n4 1.0 0.629893 0.156578 0.630986 0.489290 \n.. ... ... ... ... ... \n564 1.0 0.690000 0.428813 0.678668 0.566490 \n565 1.0 0.622320 0.626987 0.604036 0.474019 \n566 1.0 0.455251 0.621238 0.445788 0.303118 \n567 1.0 0.644564 0.663510 0.665538 0.475716 \n568 0.0 0.036869 0.501522 0.028540 0.015907 \n\n smoothness_mean compactness_mean concavity_mean concave points_mean \\\n0 0.593753 0.792037 0.703140 0.731113 \n1 0.289880 0.181768 0.203608 0.348757 \n2 0.514309 0.431017 0.462512 0.635686 \n3 0.811321 0.811361 0.565604 0.522863 \n4 0.430351 0.347893 0.463918 0.518390 \n.. ... ... ... ... \n564 0.526948 0.296055 0.571462 0.690358 \n565 0.407782 0.257714 0.337395 0.486630 \n566 0.288165 0.254340 0.216753 0.263519 \n567 0.588336 0.790197 0.823336 0.755467 \n568 0.000000 0.074351 0.000000 0.000000 \n\n symmetry_mean ... radius_worst texture_worst perimeter_worst \\\n0 0.686364 ... 0.620776 0.141525 0.668310 \n1 0.379798 ... 0.606901 0.303571 0.539818 \n2 0.509596 ... 0.556386 0.360075 0.508442 \n3 0.776263 ... 0.248310 0.385928 0.241347 \n4 0.378283 ... 0.519744 0.123934 0.506948 \n.. ... ... ... ... ... \n564 0.336364 ... 0.623266 0.383262 0.576174 \n565 0.349495 ... 0.560655 0.699094 0.520892 \n566 0.267677 ... 0.393099 0.589019 0.379949 \n567 0.675253 ... 0.633582 0.730277 0.668310 \n568 0.266162 ... 0.054287 0.489072 0.043578 \n\n area_worst smoothness_worst compactness_worst concavity_worst \\\n0 0.450698 0.601136 0.619292 0.568610 \n1 0.435214 0.347553 0.154563 0.192971 \n2 0.374508 0.483590 0.385375 0.359744 \n3 0.094008 0.915472 0.814012 0.548642 \n4 0.341575 0.437364 0.172415 0.319489 \n.. ... ... ... ... \n564 0.452664 0.461137 0.178527 0.328035 \n565 0.379915 0.300007 0.159997 0.256789 \n566 0.230731 0.282177 0.273705 0.271805 \n567 0.402035 0.619626 0.815758 0.749760 \n568 0.020497 0.124084 0.036043 0.000000 \n\n concave points_worst symmetry_worst fractal_dimension_worst \n0 0.912027 0.598462 0.418864 \n1 0.639175 0.233590 0.222878 \n2 0.835052 0.403706 0.213433 \n3 0.884880 1.000000 0.773711 \n4 0.558419 0.157500 0.142595 \n.. ... ... ... \n564 0.761512 0.097575 0.105667 \n565 0.559450 0.198502 0.074315 \n566 0.487285 0.128721 0.151909 \n567 0.910653 0.497142 0.452315 \n568 0.000000 0.257441 0.100682 \n\n[569 rows x 31 columns]",
+ "text/html": "
\n\n
\n \n \n | \n diagnosis | \n radius_mean | \n texture_mean | \n perimeter_mean | \n area_mean | \n smoothness_mean | \n compactness_mean | \n concavity_mean | \n concave points_mean | \n symmetry_mean | \n ... | \n radius_worst | \n texture_worst | \n perimeter_worst | \n area_worst | \n smoothness_worst | \n compactness_worst | \n concavity_worst | \n concave points_worst | \n symmetry_worst | \n fractal_dimension_worst | \n
\n \n \n \n 0 | \n 1.0 | \n 0.521037 | \n 0.022658 | \n 0.545989 | \n 0.363733 | \n 0.593753 | \n 0.792037 | \n 0.703140 | \n 0.731113 | \n 0.686364 | \n ... | \n 0.620776 | \n 0.141525 | \n 0.668310 | \n 0.450698 | \n 0.601136 | \n 0.619292 | \n 0.568610 | \n 0.912027 | \n 0.598462 | \n 0.418864 | \n
\n \n 1 | \n 1.0 | \n 0.643144 | \n 0.272574 | \n 0.615783 | \n 0.501591 | \n 0.289880 | \n 0.181768 | \n 0.203608 | \n 0.348757 | \n 0.379798 | \n ... | \n 0.606901 | \n 0.303571 | \n 0.539818 | \n 0.435214 | \n 0.347553 | \n 0.154563 | \n 0.192971 | \n 0.639175 | \n 0.233590 | \n 0.222878 | \n
\n \n 2 | \n 1.0 | \n 0.601496 | \n 0.390260 | \n 0.595743 | \n 0.449417 | \n 0.514309 | \n 0.431017 | \n 0.462512 | \n 0.635686 | \n 0.509596 | \n ... | \n 0.556386 | \n 0.360075 | \n 0.508442 | \n 0.374508 | \n 0.483590 | \n 0.385375 | \n 0.359744 | \n 0.835052 | \n 0.403706 | \n 0.213433 | \n
\n \n 3 | \n 1.0 | \n 0.210090 | \n 0.360839 | \n 0.233501 | \n 0.102906 | \n 0.811321 | \n 0.811361 | \n 0.565604 | \n 0.522863 | \n 0.776263 | \n ... | \n 0.248310 | \n 0.385928 | \n 0.241347 | \n 0.094008 | \n 0.915472 | \n 0.814012 | \n 0.548642 | \n 0.884880 | \n 1.000000 | \n 0.773711 | \n
\n \n 4 | \n 1.0 | \n 0.629893 | \n 0.156578 | \n 0.630986 | \n 0.489290 | \n 0.430351 | \n 0.347893 | \n 0.463918 | \n 0.518390 | \n 0.378283 | \n ... | \n 0.519744 | \n 0.123934 | \n 0.506948 | \n 0.341575 | \n 0.437364 | \n 0.172415 | \n 0.319489 | \n 0.558419 | \n 0.157500 | \n 0.142595 | \n
\n \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n
\n \n 564 | \n 1.0 | \n 0.690000 | \n 0.428813 | \n 0.678668 | \n 0.566490 | \n 0.526948 | \n 0.296055 | \n 0.571462 | \n 0.690358 | \n 0.336364 | \n ... | \n 0.623266 | \n 0.383262 | \n 0.576174 | \n 0.452664 | \n 0.461137 | \n 0.178527 | \n 0.328035 | \n 0.761512 | \n 0.097575 | \n 0.105667 | \n
\n \n 565 | \n 1.0 | \n 0.622320 | \n 0.626987 | \n 0.604036 | \n 0.474019 | \n 0.407782 | \n 0.257714 | \n 0.337395 | \n 0.486630 | \n 0.349495 | \n ... | \n 0.560655 | \n 0.699094 | \n 0.520892 | \n 0.379915 | \n 0.300007 | \n 0.159997 | \n 0.256789 | \n 0.559450 | \n 0.198502 | \n 0.074315 | \n
\n \n 566 | \n 1.0 | \n 0.455251 | \n 0.621238 | \n 0.445788 | \n 0.303118 | \n 0.288165 | \n 0.254340 | \n 0.216753 | \n 0.263519 | \n 0.267677 | \n ... | \n 0.393099 | \n 0.589019 | \n 0.379949 | \n 0.230731 | \n 0.282177 | \n 0.273705 | \n 0.271805 | \n 0.487285 | \n 0.128721 | \n 0.151909 | \n
\n \n 567 | \n 1.0 | \n 0.644564 | \n 0.663510 | \n 0.665538 | \n 0.475716 | \n 0.588336 | \n 0.790197 | \n 0.823336 | \n 0.755467 | \n 0.675253 | \n ... | \n 0.633582 | \n 0.730277 | \n 0.668310 | \n 0.402035 | \n 0.619626 | \n 0.815758 | \n 0.749760 | \n 0.910653 | \n 0.497142 | \n 0.452315 | \n
\n \n 568 | \n 0.0 | \n 0.036869 | \n 0.501522 | \n 0.028540 | \n 0.015907 | \n 0.000000 | \n 0.074351 | \n 0.000000 | \n 0.000000 | \n 0.266162 | \n ... | \n 0.054287 | \n 0.489072 | \n 0.043578 | \n 0.020497 | \n 0.124084 | \n 0.036043 | \n 0.000000 | \n 0.000000 | \n 0.257441 | \n 0.100682 | \n
\n \n
\n
569 rows × 31 columns
\n
"
+ },
+ "execution_count": 76,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-06-08T17:45:09.614420700Z",
+ "start_time": "2024-06-08T17:45:09.479821700Z"
+ }
+ },
+ "id": "4294a8ce6b3bf0d5"
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "#### Data preprocessing"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "74e70a93ab91ece2"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "outputs": [],
+ "source": [
+ "# Split data into training and testing sets\n",
+ "X = data.iloc[:, 1:]\n",
+ "y = data.iloc[:, 0]\n",
+ "\n",
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
+ "\n",
+ "# Standardize the data\n",
+ "scaler = StandardScaler()\n",
+ "X_train = scaler.fit_transform(X_train)\n",
+ "X_test = scaler.transform(X_test)\n",
+ "\n",
+ "# Convert data to PyTorch tensors\n",
+ "X_train = torch.FloatTensor(X_train)\n",
+ "X_test = torch.FloatTensor(X_test)\n",
+ "y_train = torch.FloatTensor(y_train.values).view(-1, 1)\n",
+ "y_test = torch.FloatTensor(y_test.values).view(-1, 1)\n",
+ "\n",
+ "# Transfer data to GPU if available\n",
+ "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
+ "\n",
+ "X_train = X_train.to(device)\n",
+ "X_test = X_test.to(device)\n",
+ "y_train = y_train.to(device)\n",
+ "y_test = y_test.to(device)"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-06-08T16:03:06.981298Z",
+ "start_time": "2024-06-08T16:03:06.957759100Z"
+ }
+ },
+ "id": "1fcdf94e46907575"
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "#### Neural network architectures"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "1a150bd5c3a959"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "outputs": [],
+ "source": [
+ "# V1\n",
+ "# Three fully connected layers with ReLU activation function\n",
+ "# Output layer with Sigmoid activation function\n",
+ "class NeuralNetworkV1(nn.Module):\n",
+ " def __init__(self, input_size, hidden_size):\n",
+ " super(NeuralNetworkV1, self).__init__()\n",
+ " \n",
+ " self.fc1 = nn.Linear(input_size, hidden_size)\n",
+ " self.fc2 = nn.Linear(hidden_size, hidden_size // 2)\n",
+ " self.fc3 = nn.Linear(hidden_size // 2, 1)\n",
+ "\n",
+ " self.relu = nn.ReLU()\n",
+ " self.sigmoid = nn.Sigmoid()\n",
+ " \n",
+ " def forward(self, x):\n",
+ " out = self.fc1(x)\n",
+ " out = self.relu(out)\n",
+ " out = self.fc2(out)\n",
+ " out = self.relu(out)\n",
+ " out = self.fc3(out)\n",
+ " out = self.sigmoid(out)\n",
+ " return out"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-06-08T16:04:14.970423300Z",
+ "start_time": "2024-06-08T16:04:14.953618100Z"
+ }
+ },
+ "id": "9fba79643e9e76f3"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "outputs": [],
+ "source": [
+ "# V2\n",
+ "# Four fully connected layers with ReLU activation function and dropout layers\n",
+ "# Output layer with Sigmoid activation function\n",
+ "class NeuralNetworkV2(nn.Module):\n",
+ " def __init__(self, input_size, hidden_size):\n",
+ " super(NeuralNetworkV2, self).__init__()\n",
+ " \n",
+ " self.fc1 = nn.Linear(input_size, hidden_size)\n",
+ " self.dropout1 = nn.Dropout(0.5)\n",
+ " self.fc2 = nn.Linear(hidden_size, hidden_size // 2)\n",
+ " self.dropout2 = nn.Dropout(0.5)\n",
+ " self.fc3 = nn.Linear(hidden_size // 2, hidden_size // 4)\n",
+ " self.fc4 = nn.Linear(hidden_size // 4, 1)\n",
+ "\n",
+ " self.relu = nn.ReLU()\n",
+ " self.sigmoid = nn.Sigmoid()\n",
+ " \n",
+ " def forward(self, x):\n",
+ " out = self.fc1(x)\n",
+ " out = self.relu(out)\n",
+ " out = self.dropout1(out)\n",
+ " out = self.fc2(out)\n",
+ " out = self.relu(out)\n",
+ " out = self.dropout2(out)\n",
+ " out = self.fc3(out)\n",
+ " out = self.relu(out)\n",
+ " out = self.fc4(out)\n",
+ " out = self.sigmoid(out)\n",
+ " return out"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-06-08T16:04:15.743609500Z",
+ "start_time": "2024-06-08T16:04:15.731835400Z"
+ }
+ },
+ "id": "d9d6297f85fb83fc"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "outputs": [],
+ "source": [
+ "# V3\n",
+ "# Four fully connected layers with Leaky ReLU activation function\n",
+ "# Output layer with Sigmoid activation function\n",
+ "class NeuralNetworkV3(nn.Module):\n",
+ " def __init__(self, input_size, hidden_size):\n",
+ " super(NeuralNetworkV3, self).__init__()\n",
+ " \n",
+ " self.fc1 = nn.Linear(input_size, hidden_size)\n",
+ " self.fc2 = nn.Linear(hidden_size, hidden_size // 2)\n",
+ " self.fc3 = nn.Linear(hidden_size // 2, hidden_size // 4)\n",
+ " self.fc4 = nn.Linear(hidden_size // 4, 1)\n",
+ "\n",
+ " self.leaky_relu = nn.LeakyReLU(0.1)\n",
+ " self.sigmoid = nn.Sigmoid()\n",
+ " \n",
+ " def forward(self, x):\n",
+ " out = self.fc1(x)\n",
+ " out = self.leaky_relu(out)\n",
+ " out = self.fc2(out)\n",
+ " out = self.leaky_relu(out)\n",
+ " out = self.fc3(out)\n",
+ " out = self.leaky_relu(out)\n",
+ " out = self.fc4(out)\n",
+ " out = self.sigmoid(out)\n",
+ " return out"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-06-08T16:04:15.989218400Z",
+ "start_time": "2024-06-08T16:04:15.971488Z"
+ }
+ },
+ "id": "e9d8ad2014841d93"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "outputs": [],
+ "source": [
+ "# V4\n",
+ "# Two convolutional layers with ReLU activation function and max pooling layers\n",
+ "# Two fully connected layers with ReLU activation function\n",
+ "# Output layer with Sigmoid activation function\n",
+ "class NeuralNetworkV4(nn.Module):\n",
+ " def __init__(self, input_size, hidden_size):\n",
+ " super(NeuralNetworkV4, self).__init__()\n",
+ " \n",
+ " self.conv1 = nn.Conv1d(1, 16, kernel_size=3, stride=1, padding=1)\n",
+ " self.conv2 = nn.Conv1d(16, 32, kernel_size=3, stride=1, padding=1)\n",
+ " self.pool = nn.MaxPool1d(kernel_size=2, stride=2, padding=0)\n",
+ " \n",
+ " # Calculate the output size after the conv and pooling layers\n",
+ " conv_output_size = input_size // 2 # After two pooling layers with stride 2\n",
+ " conv_output_size = conv_output_size // 2 # After the second pooling layer\n",
+ " \n",
+ " self.fc1 = nn.Linear(32 * conv_output_size, hidden_size)\n",
+ " self.fc2 = nn.Linear(hidden_size, 1)\n",
+ "\n",
+ " self.relu = nn.ReLU()\n",
+ " self.sigmoid = nn.Sigmoid()\n",
+ " \n",
+ " def forward(self, x):\n",
+ " x = x.unsqueeze(1) # Add channel dimension\n",
+ " out = self.conv1(x)\n",
+ " out = self.relu(out)\n",
+ " out = self.pool(out)\n",
+ " out = self.conv2(out)\n",
+ " out = self.relu(out)\n",
+ " out = self.pool(out)\n",
+ " out = out.view(out.size(0), -1) # Flatten the tensor\n",
+ " out = self.fc1(out)\n",
+ " out = self.relu(out)\n",
+ " out = self.fc2(out)\n",
+ " out = self.sigmoid(out)\n",
+ " return out"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-06-08T16:25:44.294141500Z",
+ "start_time": "2024-06-08T16:25:44.266927300Z"
+ }
+ },
+ "id": "19adc0031ce51f33"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "outputs": [],
+ "source": [
+ "# V5\n",
+ "# LSTM layer with ReLU activation function\n",
+ "# Two fully connected layers with ReLU activation function\n",
+ "# Output layer with Sigmoid activation function\n",
+ "class NeuralNetworkV5(nn.Module):\n",
+ " def __init__(self, input_size, hidden_size):\n",
+ " super(NeuralNetworkV5, self).__init__()\n",
+ " \n",
+ " self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)\n",
+ " self.fc1 = nn.Linear(hidden_size, hidden_size // 2)\n",
+ " self.fc2 = nn.Linear(hidden_size // 2, 1)\n",
+ "\n",
+ " self.relu = nn.ReLU()\n",
+ " self.sigmoid = nn.Sigmoid()\n",
+ " \n",
+ " def forward(self, x):\n",
+ " out, _ = self.lstm(x)\n",
+ " out = out[:, -1, :] # Take the last output of the LSTM\n",
+ " out = self.fc1(out)\n",
+ " out = self.relu(out)\n",
+ " out = self.fc2(out)\n",
+ " out = self.sigmoid(out)\n",
+ " return out"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-06-08T16:25:45.194410100Z",
+ "start_time": "2024-06-08T16:25:45.173984800Z"
+ }
+ },
+ "id": "3b404d9e7019d04"
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "#### Training and evaluation"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "7966001ff35b88d7"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 61,
+ "outputs": [],
+ "source": [
+ "# Training function\n",
+ "def train(model, X_train, y_train, criterion, optimizer, epochs=100):\n",
+ " \"\"\"\n",
+ " Train the neural network.\n",
+ " \"\"\"\n",
+ " for epoch in range(epochs):\n",
+ " optimizer.zero_grad()\n",
+ " y_pred = model(X_train)\n",
+ " loss = criterion(y_pred, y_train)\n",
+ " loss.backward()\n",
+ " optimizer.step()\n",
+ " \n",
+ " if (epoch + 1) % 10 == 0:\n",
+ " print(f'Epoch {epoch + 1}/{epochs}, Loss: {loss.item()}')"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-06-08T16:25:46.534167500Z",
+ "start_time": "2024-06-08T16:25:46.524741Z"
+ }
+ },
+ "id": "ebab09eac524c418"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "outputs": [],
+ "source": [
+ "# Evaluation function\n",
+ "def evaluate(model, X_test, y_test):\n",
+ " \"\"\"\n",
+ " Evaluate the neural network.\n",
+ " \"\"\"\n",
+ " with torch.no_grad():\n",
+ " y_pred = model(X_test)\n",
+ " y_pred = (y_pred > 0.5).float()\n",
+ " cm = confusion_matrix(y_test.cpu(), y_pred.cpu())\n",
+ " cr = classification_report(y_test.cpu(), y_pred.cpu(), target_names=['Benign', 'Malignant'], output_dict=True)\n",
+ " acc = accuracy_score(y_test.cpu(), y_pred.cpu())\n",
+ " \n",
+ " return cm, cr, acc"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-06-08T16:25:46.825080Z",
+ "start_time": "2024-06-08T16:25:46.805541600Z"
+ }
+ },
+ "id": "b89d7e317f1c8b63"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "outputs": [],
+ "source": [
+ "# Neural network parameters\n",
+ "input_size = X_train.shape[1]\n",
+ "hidden_size = 128\n",
+ "learning_rate = 0.001\n",
+ "weight_decay = 0.0001\n",
+ "epochs = 1000"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-06-08T16:25:47.991207300Z",
+ "start_time": "2024-06-08T16:25:47.974823800Z"
+ }
+ },
+ "id": "d967f53803f97353"
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "#### Neural network V1"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "b8df2e2d1ce6e786"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 10/1000, Loss: 0.4779872000217438\n",
+ "Epoch 20/1000, Loss: 0.27251550555229187\n",
+ "Epoch 30/1000, Loss: 0.15164388716220856\n",
+ "Epoch 40/1000, Loss: 0.10145729035139084\n",
+ "Epoch 50/1000, Loss: 0.07789547741413116\n",
+ "Epoch 60/1000, Loss: 0.06484830379486084\n",
+ "Epoch 70/1000, Loss: 0.05551866441965103\n",
+ "Epoch 80/1000, Loss: 0.04840008169412613\n",
+ "Epoch 90/1000, Loss: 0.042578838765621185\n",
+ "Epoch 100/1000, Loss: 0.03765585273504257\n",
+ "Epoch 110/1000, Loss: 0.03336893767118454\n",
+ "Epoch 120/1000, Loss: 0.02957029454410076\n",
+ "Epoch 130/1000, Loss: 0.02613999880850315\n",
+ "Epoch 140/1000, Loss: 0.023030269891023636\n",
+ "Epoch 150/1000, Loss: 0.02021847851574421\n",
+ "Epoch 160/1000, Loss: 0.01771070621907711\n",
+ "Epoch 170/1000, Loss: 0.015495861880481243\n",
+ "Epoch 180/1000, Loss: 0.013572530820965767\n",
+ "Epoch 190/1000, Loss: 0.011898759752511978\n",
+ "Epoch 200/1000, Loss: 0.010441687889397144\n",
+ "Epoch 210/1000, Loss: 0.009163236245512962\n",
+ "Epoch 220/1000, Loss: 0.00809294544160366\n",
+ "Epoch 230/1000, Loss: 0.007174020167440176\n",
+ "Epoch 240/1000, Loss: 0.006399359088391066\n",
+ "Epoch 250/1000, Loss: 0.005741355009377003\n",
+ "Epoch 260/1000, Loss: 0.005172951612621546\n",
+ "Epoch 270/1000, Loss: 0.004688368644565344\n",
+ "Epoch 280/1000, Loss: 0.004283885937184095\n",
+ "Epoch 290/1000, Loss: 0.003929890692234039\n",
+ "Epoch 300/1000, Loss: 0.0036243184003978968\n",
+ "Epoch 310/1000, Loss: 0.0033553754910826683\n",
+ "Epoch 320/1000, Loss: 0.0031130558345466852\n",
+ "Epoch 330/1000, Loss: 0.0028987200930714607\n",
+ "Epoch 340/1000, Loss: 0.0027084406465291977\n",
+ "Epoch 350/1000, Loss: 0.0025372877717018127\n",
+ "Epoch 360/1000, Loss: 0.002381594618782401\n",
+ "Epoch 370/1000, Loss: 0.002238793997094035\n",
+ "Epoch 380/1000, Loss: 0.002110145753249526\n",
+ "Epoch 390/1000, Loss: 0.001990949036553502\n",
+ "Epoch 400/1000, Loss: 0.0018805447034537792\n",
+ "Epoch 410/1000, Loss: 0.0017787017859518528\n",
+ "Epoch 420/1000, Loss: 0.0016847399529069662\n",
+ "Epoch 430/1000, Loss: 0.001597930327989161\n",
+ "Epoch 440/1000, Loss: 0.001518208417110145\n",
+ "Epoch 450/1000, Loss: 0.0014447758439928293\n",
+ "Epoch 460/1000, Loss: 0.0013784606708213687\n",
+ "Epoch 470/1000, Loss: 0.0013172627659514546\n",
+ "Epoch 480/1000, Loss: 0.0012608648976311088\n",
+ "Epoch 490/1000, Loss: 0.001208683243021369\n",
+ "Epoch 500/1000, Loss: 0.0011611600639298558\n",
+ "Epoch 510/1000, Loss: 0.0011176610132679343\n",
+ "Epoch 520/1000, Loss: 0.0010775947012007236\n",
+ "Epoch 530/1000, Loss: 0.0010414356365799904\n",
+ "Epoch 540/1000, Loss: 0.0010077828774228692\n",
+ "Epoch 550/1000, Loss: 0.000977047486230731\n",
+ "Epoch 560/1000, Loss: 0.0009483486064709723\n",
+ "Epoch 570/1000, Loss: 0.0009219619678333402\n",
+ "Epoch 580/1000, Loss: 0.000897533493116498\n",
+ "Epoch 590/1000, Loss: 0.0008748812833800912\n",
+ "Epoch 600/1000, Loss: 0.0008537117973901331\n",
+ "Epoch 610/1000, Loss: 0.0008338657789863646\n",
+ "Epoch 620/1000, Loss: 0.0008152445661835372\n",
+ "Epoch 630/1000, Loss: 0.000797846878413111\n",
+ "Epoch 640/1000, Loss: 0.0007811780087649822\n",
+ "Epoch 650/1000, Loss: 0.0007652725907973945\n",
+ "Epoch 660/1000, Loss: 0.0007502862135879695\n",
+ "Epoch 670/1000, Loss: 0.0007362824399024248\n",
+ "Epoch 680/1000, Loss: 0.0007233091746456921\n",
+ "Epoch 690/1000, Loss: 0.0007109907455742359\n",
+ "Epoch 700/1000, Loss: 0.0006993163260631263\n",
+ "Epoch 710/1000, Loss: 0.0006883330643177032\n",
+ "Epoch 720/1000, Loss: 0.000678009819239378\n",
+ "Epoch 730/1000, Loss: 0.0006681602098979056\n",
+ "Epoch 740/1000, Loss: 0.0006588594405911863\n",
+ "Epoch 750/1000, Loss: 0.0006500912713818252\n",
+ "Epoch 760/1000, Loss: 0.0006416388787329197\n",
+ "Epoch 770/1000, Loss: 0.0006337724043987691\n",
+ "Epoch 780/1000, Loss: 0.0006261061644181609\n",
+ "Epoch 790/1000, Loss: 0.0006186887621879578\n",
+ "Epoch 800/1000, Loss: 0.0006119576282799244\n",
+ "Epoch 810/1000, Loss: 0.0006054439581930637\n",
+ "Epoch 820/1000, Loss: 0.0005992540973238647\n",
+ "Epoch 830/1000, Loss: 0.0005932800122536719\n",
+ "Epoch 840/1000, Loss: 0.000587515824008733\n",
+ "Epoch 850/1000, Loss: 0.0005819853395223618\n",
+ "Epoch 860/1000, Loss: 0.0005764576490037143\n",
+ "Epoch 870/1000, Loss: 0.0005712246056646109\n",
+ "Epoch 880/1000, Loss: 0.0005661725299432874\n",
+ "Epoch 890/1000, Loss: 0.0005614019464701414\n",
+ "Epoch 900/1000, Loss: 0.0005567952175624669\n",
+ "Epoch 910/1000, Loss: 0.0005523671861737967\n",
+ "Epoch 920/1000, Loss: 0.000548191019333899\n",
+ "Epoch 930/1000, Loss: 0.0005440027453005314\n",
+ "Epoch 940/1000, Loss: 0.0005400135414674878\n",
+ "Epoch 950/1000, Loss: 0.0005360668292269111\n",
+ "Epoch 960/1000, Loss: 0.0005323308287188411\n",
+ "Epoch 970/1000, Loss: 0.0005282927886582911\n",
+ "Epoch 980/1000, Loss: 0.0005240424652583897\n",
+ "Epoch 990/1000, Loss: 0.0005197781720198691\n",
+ "Epoch 1000/1000, Loss: 0.0005156174884177744\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Neural network V1\n",
+ "model_v1 = NeuralNetworkV1(input_size, hidden_size).to(device)\n",
+ "criterion_v1 = nn.BCELoss()\n",
+ "optimizer_v1 = optim.Adam(model_v1.parameters(), lr=learning_rate, weight_decay=weight_decay)\n",
+ "\n",
+ "# Train the model\n",
+ "train(model_v1, X_train, y_train, criterion_v1, optimizer_v1, epochs)\n",
+ "\n",
+ "# Evaluate the model\n",
+ "cm_v1, cr_v1, acc_v1 = evaluate(model_v1, X_test, y_test)"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-06-08T16:07:07.255395800Z",
+ "start_time": "2024-06-08T16:07:04.326790700Z"
+ }
+ },
+ "id": "7f48dfd17faaa0b3"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "outputs": [
+ {
+ "data": {
+ "text/plain": "