Skip to content

Instantly share code, notes, and snippets.

@ground0state
Created December 20, 2020 14:43
Show Gist options
  • Save ground0state/81d476140267c825761920cfa1ca80cb to your computer and use it in GitHub Desktop.
Save ground0state/81d476140267c825761920cfa1ca80cb to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "skorch.ipynb",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "code",
"metadata": {
"id": "AQyad6A88Yqs",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 204
},
"outputId": "70da33bf-46ef-4c6c-822c-0fbd6b2f401b"
},
"source": [
"! pip install skorch"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Collecting skorch\n",
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/42/21/4936b881b33de285faa0b36209afe4f9724a0875b2225abdc63b23d384a3/skorch-0.8.0-py3-none-any.whl (113kB)\n",
"\r\u001b[K |██▉ | 10kB 19.1MB/s eta 0:00:01\r\u001b[K |█████▊ | 20kB 25.6MB/s eta 0:00:01\r\u001b[K |████████▋ | 30kB 17.3MB/s eta 0:00:01\r\u001b[K |███████████▌ | 40kB 13.0MB/s eta 0:00:01\r\u001b[K |██████████████▍ | 51kB 11.1MB/s eta 0:00:01\r\u001b[K |█████████████████▎ | 61kB 10.9MB/s eta 0:00:01\r\u001b[K |████████████████████▏ | 71kB 9.9MB/s eta 0:00:01\r\u001b[K |███████████████████████ | 81kB 10.2MB/s eta 0:00:01\r\u001b[K |██████████████████████████ | 92kB 10.2MB/s eta 0:00:01\r\u001b[K |████████████████████████████▉ | 102kB 10.3MB/s eta 0:00:01\r\u001b[K |███████████████████████████████▊| 112kB 10.3MB/s eta 0:00:01\r\u001b[K |████████████████████████████████| 122kB 10.3MB/s \n",
"\u001b[?25hRequirement already satisfied: scipy>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from skorch) (1.4.1)\n",
"Requirement already satisfied: tabulate>=0.7.7 in /usr/local/lib/python3.6/dist-packages (from skorch) (0.8.7)\n",
"Requirement already satisfied: numpy>=1.13.3 in /usr/local/lib/python3.6/dist-packages (from skorch) (1.18.5)\n",
"Requirement already satisfied: tqdm>=4.14.0 in /usr/local/lib/python3.6/dist-packages (from skorch) (4.41.1)\n",
"Requirement already satisfied: scikit-learn>=0.19.1 in /usr/local/lib/python3.6/dist-packages (from skorch) (0.22.2.post1)\n",
"Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.6/dist-packages (from scikit-learn>=0.19.1->skorch) (0.15.1)\n",
"Installing collected packages: skorch\n",
"Successfully installed skorch-0.8.0\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "K4GzalEC8enW"
},
"source": [
"import pickle\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"import torch\n",
"from torch import nn\n",
"import torch.nn.functional as F\n",
"\n",
"from sklearn.manifold import TSNE\n",
"from sklearn.datasets import make_classification\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import classification_report, accuracy_score\n",
"\n",
"from skorch import NeuralNetClassifier\n",
"from skorch.callbacks import Callback, Checkpoint, EarlyStopping\n",
"from skorch.dataset import CVSplit\n",
"\n",
"torch.manual_seed(0);"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "WyW3IVUf8kAD"
},
"source": [
"# make dataset\n",
"x, y = make_classification(\n",
" n_samples=300,\n",
" n_classes=2,\n",
" n_features=5,\n",
" # scale=[10, 10, 20, 20, 20],\n",
" random_state=0\n",
" )\n",
"\n",
"# split dataset (train:test = 7:3)\n",
"x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=42)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "NDug5lxh8nUc",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 374
},
"outputId": "97b0067f-6f02-4b3c-b278-2e847922e2ff"
},
"source": [
"def plot_tsne(x, y, colormap=plt.cm.Paired):\n",
" '''Visualize features with t-SNE'''\n",
" plt.figure(figsize=(8, 6))\n",
"\n",
" # clean the figure\n",
" plt.clf()\n",
"\n",
" tsne = TSNE()\n",
" x_embedded = tsne.fit_transform(x)\n",
" plt.scatter(x_embedded[:, 0], x_embedded[:, 1], c=y, cmap=colormap)\n",
"\n",
" # plt.xticks(())\n",
" # plt.yticks(())\n",
" plt.show()\n",
"\n",
"# Visualize features\n",
"plot_tsne(x_train, y_train)"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x432 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "yVTt6fwm8q6r"
},
"source": [
"class Net(nn.Module):\n",
" def __init__(self, input=5):\n",
" super(Net, self).__init__()\n",
" self.layer1 = nn.Linear(input, 100)\n",
" self.layer2 = nn.Linear(100, 200, bias=True)\n",
" self.layer3 = nn.Linear(200, 10, bias=True)\n",
" self.layer4 = nn.Linear(10, 2, bias=True)\n",
"\n",
" def forward(self, x):\n",
" x = x.float()\n",
" x = F.relu(self.layer1(x))\n",
" x = F.relu(self.layer2(x))\n",
" x = F.relu(self.layer3(x))\n",
" x = self.layer4(x)\n",
" output = F.softmax(x, dim=-1)\n",
" return output"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "sfZQ7L7k8zPx",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"outputId": "e725be20-1f24-49b6-c064-9e86c2a6bec8"
},
"source": [
"monitor = lambda Net: all(Net.history[-1, ('train_loss_best', 'valid_loss_best')])\n",
"\n",
"# set param(make trainer)\n",
"model = NeuralNetClassifier(\n",
" Net,\n",
" max_epochs=100,\n",
" lr=0.01,\n",
" warm_start=True,\n",
" # optimizer=torch.optim.Adam,\n",
" optimizer=torch.optim.SGD,\n",
" optimizer__momentum=0.9,\n",
" iterator_train__shuffle=True,\n",
" callbacks=[Checkpoint(), EarlyStopping()],\n",
" # train_split=CVSplit(cv=10, stratified=True, random_state=0)\n",
" )\n",
"\n",
"# learn\n",
"model.fit(x, y)"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
" epoch train_loss valid_acc valid_loss cp dur\n",
"------- ------------ ----------- ------------ ---- ------\n",
" 1 \u001b[36m0.7079\u001b[0m \u001b[32m0.4833\u001b[0m \u001b[35m0.7089\u001b[0m + 0.3378\n",
" 2 \u001b[36m0.7019\u001b[0m 0.4833 \u001b[35m0.6995\u001b[0m + 0.0087\n",
" 3 \u001b[36m0.6919\u001b[0m 0.4833 \u001b[35m0.6885\u001b[0m + 0.0081\n",
" 4 \u001b[36m0.6821\u001b[0m 0.4833 \u001b[35m0.6809\u001b[0m + 0.0078\n",
" 5 \u001b[36m0.6751\u001b[0m \u001b[32m0.5167\u001b[0m \u001b[35m0.6730\u001b[0m + 0.0090\n",
" 6 \u001b[36m0.6670\u001b[0m \u001b[32m0.6000\u001b[0m \u001b[35m0.6638\u001b[0m + 0.0093\n",
" 7 \u001b[36m0.6579\u001b[0m \u001b[32m0.7500\u001b[0m \u001b[35m0.6529\u001b[0m + 0.0077\n",
" 8 \u001b[36m0.6467\u001b[0m \u001b[32m0.7833\u001b[0m \u001b[35m0.6396\u001b[0m + 0.0076\n",
" 9 \u001b[36m0.6333\u001b[0m \u001b[32m0.8500\u001b[0m \u001b[35m0.6231\u001b[0m + 0.0072\n",
" 10 \u001b[36m0.6168\u001b[0m \u001b[32m0.8833\u001b[0m \u001b[35m0.6035\u001b[0m + 0.0073\n",
" 11 \u001b[36m0.5966\u001b[0m 0.8500 \u001b[35m0.5810\u001b[0m + 0.0064\n",
" 12 \u001b[36m0.5742\u001b[0m 0.8500 \u001b[35m0.5561\u001b[0m + 0.0074\n",
" 13 \u001b[36m0.5489\u001b[0m 0.8833 \u001b[35m0.5286\u001b[0m + 0.0075\n",
" 14 \u001b[36m0.5197\u001b[0m 0.8833 \u001b[35m0.4993\u001b[0m + 0.0076\n",
" 15 \u001b[36m0.4889\u001b[0m 0.8833 \u001b[35m0.4686\u001b[0m + 0.0079\n",
" 16 \u001b[36m0.4559\u001b[0m 0.8833 \u001b[35m0.4368\u001b[0m + 0.0077\n",
" 17 \u001b[36m0.4219\u001b[0m 0.8833 \u001b[35m0.4050\u001b[0m + 0.0075\n",
" 18 \u001b[36m0.3863\u001b[0m 0.8833 \u001b[35m0.3739\u001b[0m + 0.0081\n",
" 19 \u001b[36m0.3521\u001b[0m 0.8833 \u001b[35m0.3440\u001b[0m + 0.0106\n",
" 20 \u001b[36m0.3196\u001b[0m 0.8667 \u001b[35m0.3157\u001b[0m + 0.0081\n",
" 21 \u001b[36m0.2880\u001b[0m 0.8667 \u001b[35m0.2895\u001b[0m + 0.0077\n",
" 22 \u001b[36m0.2614\u001b[0m 0.8667 \u001b[35m0.2661\u001b[0m + 0.0074\n",
" 23 \u001b[36m0.2382\u001b[0m 0.8667 \u001b[35m0.2449\u001b[0m + 0.0070\n",
" 24 \u001b[36m0.2170\u001b[0m 0.8667 \u001b[35m0.2267\u001b[0m + 0.0076\n",
" 25 \u001b[36m0.2011\u001b[0m 0.8667 \u001b[35m0.2109\u001b[0m + 0.0077\n",
" 26 \u001b[36m0.1882\u001b[0m 0.8667 \u001b[35m0.1971\u001b[0m + 0.0075\n",
" 27 \u001b[36m0.1762\u001b[0m 0.8833 \u001b[35m0.1854\u001b[0m + 0.0073\n",
" 28 \u001b[36m0.1676\u001b[0m 0.8833 \u001b[35m0.1758\u001b[0m + 0.0076\n",
" 29 \u001b[36m0.1605\u001b[0m \u001b[32m0.9000\u001b[0m \u001b[35m0.1678\u001b[0m + 0.0076\n",
" 30 \u001b[36m0.1553\u001b[0m \u001b[32m0.9167\u001b[0m \u001b[35m0.1610\u001b[0m + 0.0075\n",
" 31 \u001b[36m0.1507\u001b[0m \u001b[32m0.9333\u001b[0m \u001b[35m0.1556\u001b[0m + 0.0073\n",
" 32 \u001b[36m0.1480\u001b[0m 0.9333 \u001b[35m0.1509\u001b[0m + 0.0075\n",
" 33 \u001b[36m0.1433\u001b[0m 0.9333 \u001b[35m0.1472\u001b[0m + 0.0079\n",
" 34 \u001b[36m0.1406\u001b[0m 0.9333 \u001b[35m0.1439\u001b[0m + 0.0074\n",
" 35 \u001b[36m0.1381\u001b[0m 0.9333 \u001b[35m0.1411\u001b[0m + 0.0086\n",
" 36 \u001b[36m0.1359\u001b[0m 0.9333 \u001b[35m0.1387\u001b[0m + 0.0077\n",
" 37 \u001b[36m0.1334\u001b[0m \u001b[32m0.9500\u001b[0m \u001b[35m0.1369\u001b[0m + 0.0076\n",
" 38 \u001b[36m0.1315\u001b[0m 0.9500 \u001b[35m0.1354\u001b[0m + 0.0078\n",
" 39 \u001b[36m0.1296\u001b[0m 0.9500 \u001b[35m0.1339\u001b[0m + 0.0072\n",
" 40 \u001b[36m0.1277\u001b[0m 0.9500 \u001b[35m0.1327\u001b[0m + 0.0077\n",
" 41 \u001b[36m0.1263\u001b[0m 0.9500 \u001b[35m0.1319\u001b[0m + 0.0073\n",
" 42 \u001b[36m0.1246\u001b[0m 0.9500 \u001b[35m0.1310\u001b[0m + 0.0073\n",
" 43 \u001b[36m0.1231\u001b[0m 0.9500 \u001b[35m0.1299\u001b[0m + 0.0075\n",
" 44 \u001b[36m0.1218\u001b[0m 0.9500 \u001b[35m0.1291\u001b[0m + 0.0073\n",
" 45 \u001b[36m0.1207\u001b[0m 0.9500 \u001b[35m0.1280\u001b[0m + 0.0078\n",
" 46 \u001b[36m0.1192\u001b[0m 0.9500 \u001b[35m0.1273\u001b[0m + 0.0080\n",
" 47 \u001b[36m0.1181\u001b[0m 0.9500 \u001b[35m0.1266\u001b[0m + 0.0075\n",
" 48 \u001b[36m0.1172\u001b[0m 0.9500 \u001b[35m0.1261\u001b[0m + 0.0084\n",
" 49 \u001b[36m0.1158\u001b[0m 0.9500 \u001b[35m0.1258\u001b[0m + 0.0077\n",
" 50 \u001b[36m0.1147\u001b[0m 0.9500 \u001b[35m0.1256\u001b[0m + 0.0066\n",
" 51 \u001b[36m0.1137\u001b[0m 0.9500 0.1256 0.0083\n",
" 52 \u001b[36m0.1128\u001b[0m 0.9500 0.1257 0.0075\n",
" 53 \u001b[36m0.1120\u001b[0m 0.9500 0.1259 0.0075\n",
" 54 \u001b[36m0.1110\u001b[0m 0.9500 0.1257 0.0074\n",
" 55 \u001b[36m0.1101\u001b[0m 0.9500 \u001b[35m0.1251\u001b[0m + 0.0077\n",
" 56 \u001b[36m0.1093\u001b[0m 0.9500 \u001b[35m0.1244\u001b[0m + 0.0078\n",
" 57 \u001b[36m0.1083\u001b[0m 0.9500 \u001b[35m0.1240\u001b[0m + 0.0074\n",
" 58 \u001b[36m0.1076\u001b[0m 0.9500 \u001b[35m0.1233\u001b[0m + 0.0072\n",
" 59 \u001b[36m0.1068\u001b[0m 0.9500 \u001b[35m0.1231\u001b[0m + 0.0073\n",
" 60 \u001b[36m0.1058\u001b[0m 0.9500 \u001b[35m0.1227\u001b[0m + 0.0075\n",
" 61 \u001b[36m0.1052\u001b[0m 0.9500 \u001b[35m0.1225\u001b[0m + 0.0070\n",
" 62 \u001b[36m0.1045\u001b[0m 0.9500 \u001b[35m0.1221\u001b[0m + 0.0076\n",
" 63 \u001b[36m0.1037\u001b[0m 0.9500 \u001b[35m0.1219\u001b[0m + 0.0075\n",
" 64 \u001b[36m0.1033\u001b[0m 0.9500 0.1222 0.0077\n",
" 65 \u001b[36m0.1023\u001b[0m 0.9500 0.1222 0.0075\n",
" 66 \u001b[36m0.1016\u001b[0m 0.9500 0.1220 0.0069\n",
" 67 \u001b[36m0.1010\u001b[0m 0.9500 \u001b[35m0.1218\u001b[0m + 0.0074\n",
" 68 \u001b[36m0.1003\u001b[0m 0.9500 \u001b[35m0.1215\u001b[0m + 0.0074\n",
" 69 \u001b[36m0.0998\u001b[0m 0.9500 \u001b[35m0.1209\u001b[0m + 0.0077\n",
" 70 \u001b[36m0.0991\u001b[0m 0.9500 \u001b[35m0.1206\u001b[0m + 0.0075\n",
" 71 \u001b[36m0.0985\u001b[0m 0.9500 \u001b[35m0.1205\u001b[0m + 0.0076\n",
" 72 \u001b[36m0.0980\u001b[0m 0.9500 \u001b[35m0.1203\u001b[0m + 0.0076\n",
" 73 \u001b[36m0.0975\u001b[0m 0.9500 0.1205 0.0078\n",
" 74 \u001b[36m0.0970\u001b[0m 0.9500 0.1207 0.0076\n",
" 75 \u001b[36m0.0964\u001b[0m 0.9500 \u001b[35m0.1203\u001b[0m + 0.0071\n",
" 76 \u001b[36m0.0960\u001b[0m 0.9500 0.1205 0.0076\n",
" 77 \u001b[36m0.0954\u001b[0m 0.9500 \u001b[35m0.1202\u001b[0m + 0.0075\n",
" 78 \u001b[36m0.0949\u001b[0m 0.9500 \u001b[35m0.1200\u001b[0m + 0.0074\n",
" 79 \u001b[36m0.0944\u001b[0m 0.9500 \u001b[35m0.1197\u001b[0m + 0.0118\n",
" 80 \u001b[36m0.0941\u001b[0m 0.9500 \u001b[35m0.1192\u001b[0m + 0.0071\n",
" 81 \u001b[36m0.0935\u001b[0m 0.9500 \u001b[35m0.1191\u001b[0m + 0.0074\n",
" 82 \u001b[36m0.0930\u001b[0m 0.9500 0.1193 0.0077\n",
" 83 \u001b[36m0.0927\u001b[0m 0.9500 0.1191 0.0076\n",
" 84 \u001b[36m0.0922\u001b[0m 0.9500 0.1194 0.0076\n",
" 85 \u001b[36m0.0918\u001b[0m 0.9500 0.1197 0.0079\n",
"Stopping since valid_loss has not improved in the last 5 epochs.\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<class 'skorch.classifier.NeuralNetClassifier'>[initialized](\n",
" module_=Net(\n",
" (layer1): Linear(in_features=5, out_features=100, bias=True)\n",
" (layer2): Linear(in_features=100, out_features=200, bias=True)\n",
" (layer3): Linear(in_features=200, out_features=10, bias=True)\n",
" (layer4): Linear(in_features=10, out_features=2, bias=True)\n",
" ),\n",
")"
]
},
"metadata": {
"tags": []
},
"execution_count": 7
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "ctfned8D-HCt",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 187
},
"outputId": "fe2cc1dd-d716-4d7e-f083-c3b469ff8b02"
},
"source": [
"# predict\n",
"y_pred = model.predict(x_test)\n",
"# print(y_test-y_pred) # 真値と予測値の差分\n",
"\n",
"# print precision, recall, f1-score, support\n",
"print(classification_report(y_test, y_pred))\n",
"print(\"score:\", accuracy_score(y_test, y_pred))"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" 0 0.95 0.98 0.97 43\n",
" 1 0.98 0.96 0.97 47\n",
"\n",
" accuracy 0.97 90\n",
" macro avg 0.97 0.97 0.97 90\n",
"weighted avg 0.97 0.97 0.97 90\n",
"\n",
"score: 0.9666666666666667\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "2cfdUVR7-Io9",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 51
},
"outputId": "64105285-4472-487a-b2be-71dfe8b79d2f"
},
"source": [
"# save model\n",
"model_file = \"./best_model.pkl\"\n",
"with open(model_file, 'wb') as f:\n",
" pickle.dump(model, f)\n",
"\n",
"# load model\n",
"with open(model_file, mode='rb') as f:\n",
" best_model = pickle.load(f)"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/dist-packages/torch/serialization.py:402: UserWarning: Couldn't retrieve source code for container of type Net. It won't be checked for correctness upon loading.\n",
" \"type \" + obj.__name__ + \". It won't be checked \"\n"
],
"name": "stderr"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "GY3fiil3-RL5",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "1afb1739-c119-4415-c899-556c408ef33f"
},
"source": [
"!ls"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"best_model.pkl\thistory.json optimizer.pt params.pt sample_data\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "2WIMlcx5-VYC",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "5a39df30-9f99-4db1-ff24-af8503983577"
},
"source": [
"# 適当なデータを作成\n",
"my_data = np.array([[1, 2, 3, 4, 5]])\n",
"\n",
"# 推論\n",
"my_pred = best_model.predict(my_data)\n",
"print(\"result:\", my_pred) # result is 0 or 1"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"result: [1]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "x3Mm2rGk-ddN"
},
"source": [
""
],
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment