{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "from sklearn.model_selection import train_test_split\n", "import matplotlib.pyplot as plt\n", "import torch\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from torch.utils.data import Dataset, DataLoader" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class DiabetesDataset(Dataset):\n", " \"\"\" Diabetes dataset.\"\"\"\n", "\n", " # Initialize your data, download, etc.\n", " def __init__(self):\n", " data = pd.read_csv(\"diabetes.csv\", header = None)\n", " self.len = 500\n", " self.x_data = torch.from_numpy(data.iloc[:500, 0:-1].values)\n", " self.y_data = torch.from_numpy(data.iloc[:500, -1].values)\n", "\n", " def __getitem__(self, index):\n", " return self.x_data[index], self.y_data[index]\n", "\n", " def __len__(self):\n", " return self.len" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dataset = DiabetesDataset()\n", "train_loader = DataLoader(dataset=dataset,\n", " batch_size=128,\n", " shuffle=True,\n", " num_workers=2)" ] }, { "cell_type": "code", "execution_count": 5, "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", "
012345678
0-0.2941180.4874370.180328-0.2929290.0000000.001490-0.531170-0.0333330
1-0.882353-0.1457290.081967-0.4141410.000000-0.207153-0.766866-0.6666671
2-0.0588240.8391960.0491800.0000000.000000-0.305514-0.492741-0.6333330
3-0.882353-0.1055280.081967-0.535354-0.777778-0.162444-0.9239970.0000001
40.0000000.376884-0.344262-0.292929-0.6028370.2846500.887276-0.6000000
\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 \\\n", "0 -0.294118 0.487437 0.180328 -0.292929 0.000000 0.001490 -0.531170 \n", "1 -0.882353 -0.145729 0.081967 -0.414141 0.000000 -0.207153 -0.766866 \n", "2 -0.058824 0.839196 0.049180 0.000000 0.000000 -0.305514 -0.492741 \n", "3 -0.882353 -0.105528 0.081967 -0.535354 -0.777778 -0.162444 -0.923997 \n", "4 0.000000 0.376884 -0.344262 -0.292929 -0.602837 0.284650 0.887276 \n", "\n", " 7 8 \n", "0 -0.033333 0 \n", "1 -0.666667 1 \n", "2 -0.633333 0 \n", "3 0.000000 1 \n", "4 -0.600000 0 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test = pd.read_csv(\"diabetes.csv\", header = None)\n", "test.head()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "test_x = torch.from_numpy(test.iloc[500:, 0:-1].values)\n", "test_y = torch.from_numpy(test.iloc[500:, -1].values)\n", "test_x = torch.tensor(test_x, dtype = torch.float)\n", "test_y = torch.tensor(test_y, dtype = torch.float).reshape(-1,1)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class LogisticRegression(torch.nn.Module):\n", " def __init__(self):\n", " super(LogisticRegression,self).__init__()\n", " self.l1 = torch.nn.Linear(8,6)\n", " self.l2 = torch.nn.Linear(6,4)\n", " self.l3 = torch.nn.Linear(4,1)\n", " self.sigmoid = torch.nn.Sigmoid()\n", " self.relu = torch.nn.ReLU()\n", " self.tanh = torch.nn.Tanh()\n", " def forward(self,x):\n", " o1 = self.tanh(self.l1(x))\n", " o2 = self.tanh(self.l2(o1))\n", " o3 = self.tanh(self.l3(o2))\n", " return self.sigmoid(o3)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "model = LogisticRegression()\n", "criterion = torch.nn.BCELoss()\n", "optimizer = torch.optim.RMSprop(model.parameters(), lr = 0.01)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "epoch_list = []\n", "train_loss = []\n", "test_loss = []" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ "for epoch in range(200):\n", " lo = []\n", " y_pred = model(test_x)\n", " test_l = criterion(y_pred, test_y)\n", " test_loss.append(test_l.item())\n", " \n", " for i, data in enumerate(train_loader, 0):\n", " # get the inputs\n", " inputs, labels = data\n", "\n", " # wrap them in Variable\n", " x, y = torch.tensor(inputs, dtype = torch.float), torch.tensor(labels.reshape(-1,1), dtype = torch.float)\n", " y_pred = model(x)\n", " loss = criterion(y_pred, y)\n", " loss.backward()\n", " optimizer.step()\n", " optimizer.zero_grad()\n", " lo.append(loss.item())\n", " train_loss.append(np.mean(lo))\n", " epoch_list.append(epoch)\n", " " ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(epoch_list, train_loss, label = \"Train loss\") \n", "plt.plot(epoch_list, test_loss, label = \"Test loss\")\n", "plt.legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Test Accuracy" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn.metrics import accuracy_score" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "y_pred = model(test_x)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "y_pred = y_pred >0.5" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.7953667953667953" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "accuracy_score(y_pred, test_y)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.4" } }, "nbformat": 4, "nbformat_minor": 2 }