Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shadiakiki1986/1ee234b4e18924dbf4a49f9c4895e345 to your computer and use it in GitHub Desktop.
Save shadiakiki1986/1ee234b4e18924dbf4a49f9c4895e345 to your computer and use it in GitHub Desktop.
sklearn preprocessor - image centering - improves SVM-RBF against translation jitter.ipynb
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "sklearn preprocessor - image centering - improves SVM-RBF against translation jitter.ipynb",
"provenance": [],
"collapsed_sections": [],
"authorship_tag": "ABX9TyPKcZri36zDOzJcE2a56Lx2",
"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/shadiakiki1986/1ee234b4e18924dbf4a49f9c4895e345/sklearn-preprocessor-image-centering-improves-svm-rbf-against-translation-jitter.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8GaAZFCMWaw4"
},
"source": [
"Based on sklearn's [digit classification example](https://scikit-learn.org/stable/auto_examples/classification/plot_digits_classification.html#sphx-glr-auto-examples-classification-plot-digits-classification-py)\n",
"\n",
"Uses my digits dataset with translation jitter: https://github.com/shadiakiki1986/mnist-digits-jitter\n",
"\n",
"Published as gist: [sklearn preprocessor - image centering - improves SVM-RBF against translation jitter.ipynb](https://gist.github.com/shadiakiki1986/1ee234b4e18924dbf4a49f9c4895e345)\n",
"\n",
"Related gist but without centering: [SVM-RBF sensitivity to translation.ipynb](https://gist.github.com/shadiakiki1986/689980135fe9dde1d892127bde40a5a1)\n",
"\n",
"Proposed the image centering preprocessor as an sklearn feature: https://github.com/scikit-learn/scikit-learn/issues/20888"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6iuapqgYnf9w"
},
"source": [
"# dependencies"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "RrAkpWbdfPMu",
"outputId": "d905aa91-8c74-423b-b296-cbd5f025c444"
},
"source": [
"# then the padded and jittered data\n",
"!git clone https://github.com/shadiakiki1986/mnist-digits-jitter\n",
"\n",
"# Update: no need to gunzip since np.loadtxt can automatically do it\n",
"#!gunzip mnist-digits-jitter/digits_padded.csv.gz\n",
"#!gunzip mnist-digits-jitter/digits_jitter.csv.gz"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Cloning into 'mnist-digits-jitter'...\n",
"remote: Enumerating objects: 47, done.\u001b[K\n",
"remote: Counting objects: 100% (47/47), done.\u001b[K\n",
"remote: Compressing objects: 100% (44/44), done.\u001b[K\n",
"remote: Total 47 (delta 20), reused 8 (delta 1), pack-reused 0\u001b[K\n",
"Unpacking objects: 100% (47/47), done.\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "qln7PdsNnbGq"
},
"source": [
"# if uploading instead of github\n",
"#!mkdir -p mnist-digits-jitter\n",
"#!mv *gz mnist-digits-jitter/"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "HGkCzTmwXS4o"
},
"source": [
"# get data"
]
},
{
"cell_type": "code",
"metadata": {
"id": "wxWb-jzbXTdv"
},
"source": [
"# first the original data\n",
"from sklearn.datasets import load_digits\n",
"digits = load_digits()"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "66oFvhVEfZMk",
"outputId": "6d81d0f1-9d7c-4bc6-df76-854744bda83d"
},
"source": [
"import numpy as np\n",
"# np.loadtxt can decompress the files on read\n",
"digpad = {\"data\": np.loadtxt(\"mnist-digits-jitter/digits_padded.csv.gz\", delimiter=\",\", dtype=int)}\n",
"digjit = {\"data\": np.loadtxt(\"mnist-digits-jitter/digits_jitter.csv.gz\", delimiter=\",\", dtype=int)}\n",
"digpad[\"data\"].shape, digjit[\"data\"].shape"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"((1797, 225), (1797, 225))"
]
},
"metadata": {},
"execution_count": 4
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "nBjvLW_9f3YM"
},
"source": [
"# convert data to image (not flat)\n",
"#def im2data(digxxx_img):\n",
"# return np.vstack([img.reshape((-1,1)).squeeze() for img in digxxx_img])\n",
"\n",
"def data2im(digxxx_data):\n",
" \"\"\"\n",
" Inverse of img_to_array from https://keras.io/api/preprocessing/image/#img_to_array-function\n",
" \"\"\"\n",
" s = int(digxxx_data.shape[1]**.5)\n",
" l = digxxx_data.reshape((-1,s,s))\n",
" return l\n",
"\n",
"digjit[\"images\"] = data2im(digjit[\"data\"])\n",
"digpad[\"images\"] = data2im(digpad[\"data\"])\n",
"\n",
"assert digjit[\"data\"].shape == (1797, 225)\n",
"assert digpad[\"data\"].shape == (1797, 225)\n",
"assert digjit[\"images\"].shape == (1797, 15, 15)\n",
"assert digpad[\"images\"].shape == (1797, 15, 15)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "-lWgeNt6oWVl"
},
"source": [
"# utility plotting code\n",
"# From https://www.codespeedy.com/image-augmentation-using-skimage-in-python/\n",
"#basic Function to display image side by side\n",
"from matplotlib import pyplot as plt\n",
"def plot_side(img1, img2, title1, title2, cmap = None):\n",
" fig = plt.figure(tight_layout='auto', figsize=(5,5))\n",
" fig.add_subplot(221)\n",
" plt.title(title1)\n",
" plt.imshow(img1) #, origin=\"lower\")\n",
" plt.colorbar()\n",
"\n",
" fig.add_subplot(222)\n",
" plt.title(title2)\n",
" plt.imshow(img2) #, cmap = None, origin=\"lower\")\n",
" plt.colorbar()\n",
" return fig"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 199
},
"id": "oNH6xGZnoXnJ",
"outputId": "1269d88b-022f-4064-98bc-664882e117a0"
},
"source": [
"plot_side(digpad[\"images\"][0], digjit[\"images\"][0], \"no jitter\", \"with jitter\")\n",
"plt.show()"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 360x360 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "srQUt0XE1Hc3"
},
"source": [
"# util: translate function"
]
},
{
"cell_type": "code",
"metadata": {
"id": "mCoaqbHz1Iw4"
},
"source": [
"from skimage.transform import warp\n",
"#from skimage.transform import SimilarityTransform\n",
"from skimage.transform import EuclideanTransform\n",
"\n",
"# use sklearn transform\n",
"# https://scikit-image.org/docs/dev/api/skimage.transform.html\n",
"my_translate = lambda img, jx, jy: warp(img, EuclideanTransform(translation=(jx, jy)), preserve_range=True).astype(int)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "5iv7_IKT1LJg"
},
"source": [
"# test\n",
"#print(digpad[\"images\"][0])\n",
"#print(my_translate(digpad[\"images\"][0], 0, 0))\n",
"\n",
"assert (digpad[\"images\"][0] == my_translate(digpad[\"images\"][0], 0, 0)).all()"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "BvDdpxZIUVXe"
},
"source": [
"# preprocessing: center images\n",
"\n",
"Use take 2 with take 3"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "5z30q5YbXn6e"
},
"source": [
"## take 2: function"
]
},
{
"cell_type": "code",
"metadata": {
"id": "tXW80H44UXqg"
},
"source": [
"# Custom sklearn transformer that centers the images\n",
"# http://scipy-lectures.org/packages/scikit-image/#measuring-regions-properties\n",
"# https://scikit-image.org/docs/dev/auto_examples/segmentation/plot_regionprops.html\n",
"# https://kapernikov.com/tutorial-image-classification-with-scikit-learn/\n",
"from skimage import measure\n",
"from matplotlib import pyplot as plt\n",
"\n",
"def my_flatarray_to_square(x):\n",
" assert len(x.shape) == 1\n",
" s = x.shape[0]**.5\n",
" assert s == int(s)\n",
" s = int(s)\n",
" x = x.reshape((s,s))\n",
" return x\n",
"\n",
"\n",
"def my_center(X, flat_in, flat_out, verbose):\n",
" \"\"\"\n",
" X : if flat_in=False, one of the following:\n",
" - list of length n_samples where each entry is an array-like of shape (image dim 1, image dim 2)\n",
" - array-like of shape (n_samples, image dim 1, image dim 2)\n",
" - array-like of shape (image dim 1, image dim 2)\n",
" If flat_in=True, one of:\n",
" - list of length n_samples where each entry is an array-like of shape (image dim 1 * image dim 2, )\n",
" - array-like of shape (n_samples, image dim 1 * image dim 2)\n",
" - array-like of shape (image dim 1 * image dim 2,)\n",
"\n",
" flat_in: boolean. True => input is flat image or list of flat images or array of flat images\n",
" flat_out: boolean. True => return array of shape, depending on the input:\n",
" - (dim 1 * dim 2, )\n",
" - (n_samples, dim 1 * dim 2)\n",
" \"\"\"\n",
" if type(X) not in [list, np.ndarray]:\n",
" raise ValueError(f\"Unsupported type: {type(X)}\")\n",
"\n",
" do_multi = False\n",
" if type(X)==list:\n",
" do_multi = True\n",
" for i,x in enumerate(X):\n",
" if flat_in:\n",
" X[i] = my_flatarray_to_square(x)\n",
" else:\n",
" assert len(x.shape) == 2\n",
" elif type(X) == np.ndarray:\n",
" if flat_in:\n",
" if len(X.shape) == 1:\n",
" do_multi = False\n",
" X = my_flatarray_to_square(X)\n",
" elif len(X.shape) == 2:\n",
" do_multi = True\n",
" X = np.array([my_flatarray_to_square(x) for x in X])\n",
" else:\n",
" raise ValueError(f\"When flat_in=True, require X.shape in [1,2]. Found {X.shape}.\")\n",
" else:\n",
" if len(X.shape) == 2:\n",
" do_multi = False\n",
" elif len(X.shape) == 3:\n",
" do_multi = True\n",
" else:\n",
" raise ValueError(f\"Unsupported X.shape={X.shape}. Need len(X.shape) in [2,3]\")\n",
"\n",
" if do_multi:\n",
" o = [my_center(img, False, flat_out, verbose) for img in X]\n",
" o = np.array(o)\n",
" return o\n",
"\n",
" \n",
" img_jit = X\n",
" img_lab = measure.label(img_jit>0)\n",
" regions = measure.regionprops(img_lab)\n",
"\n",
" if verbose:\n",
" print(\"labels\")\n",
" print(img_lab)\n",
" print(\"regions\")\n",
" print([r.centroid for r in regions])\n",
" plt.imshow(img_jit)\n",
" for r in regions:\n",
" c = r.centroid\n",
" plt.scatter(c[1], c[0], color=\"red\")\n",
" \n",
" plt.title(\"input and centroid\")\n",
" plt.show()\n",
"\n",
" assert len(regions)==1\n",
"\n",
" # flip the x and y since I want the 1st dimension to be the \"y\"\n",
" c_dig = (regions[0].centroid[1], regions[0].centroid[0])\n",
"\n",
" # center of image\n",
" c_img = tuple([x//2 for x in img_jit.shape])\n",
"\n",
" # delta\n",
" d = tuple([round(x1-x2) for x1, x2 in zip(c_dig, c_img)])\n",
"\n",
" img_cent = my_translate(img_jit, d[0], d[1])\n",
"\n",
" if verbose:\n",
" plot_side(img_jit, img_cent, \"with jitter\", \"centered\")\n",
" plt.scatter(c_dig[0], c_dig[1], color=\"red\")\n",
" plt.scatter(c_img[0], c_img[1], color=\"green\")\n",
" plt.show()\n",
"\n",
" if flat_out:\n",
" assert len(img_cent.shape)==2\n",
" img_cent = img_cent.reshape((img_cent.shape[0]*img_cent.shape[1], 1)).squeeze()\n",
"\n",
" return img_cent"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"id": "D_l9jVZ4boNq",
"outputId": "0e1c35e0-ef05-441f-a342-09cd1643d410"
},
"source": [
"# test on single image\n",
"# Update: Digit 7 uncovered a major bug in flipping the x,y of the centroid\n",
"i = 7\n",
"print(digjit[\"images\"][i])\n",
"img_cent = my_center(digjit[\"images\"][i], flat_in=False, flat_out=False, verbose=True)\n",
"assert img_cent.shape == (15, 15)"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"[[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
" [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
" [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
" [ 0 0 0 0 0 0 0 0 7 8 13 16 15 1 0]\n",
" [ 0 0 0 0 0 0 0 0 7 7 4 11 12 0 0]\n",
" [ 0 0 0 0 0 0 0 0 0 0 8 13 1 0 0]\n",
" [ 0 0 0 0 0 0 0 4 8 8 15 15 6 0 0]\n",
" [ 0 0 0 0 0 0 0 2 11 15 15 4 0 0 0]\n",
" [ 0 0 0 0 0 0 0 0 0 16 5 0 0 0 0]\n",
" [ 0 0 0 0 0 0 0 0 9 15 1 0 0 0 0]\n",
" [ 0 0 0 0 0 0 0 0 13 5 0 0 0 0 0]\n",
" [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
" [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
" [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
" [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]\n",
"labels\n",
"[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
" [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
" [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
" [0 0 0 0 0 0 0 0 1 1 1 1 1 1 0]\n",
" [0 0 0 0 0 0 0 0 1 1 1 1 1 0 0]\n",
" [0 0 0 0 0 0 0 0 0 0 1 1 1 0 0]\n",
" [0 0 0 0 0 0 0 1 1 1 1 1 1 0 0]\n",
" [0 0 0 0 0 0 0 1 1 1 1 1 0 0 0]\n",
" [0 0 0 0 0 0 0 0 0 1 1 0 0 0 0]\n",
" [0 0 0 0 0 0 0 0 1 1 1 0 0 0 0]\n",
" [0 0 0 0 0 0 0 0 1 1 0 0 0 0 0]\n",
" [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
" [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
" [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n",
" [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]\n",
"regions\n",
"[(5.84375, 9.71875)]\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 360x360 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "AGjOrHTopgNF"
},
"source": [
"# test single, flat_out\n",
"assert my_center(digjit[\"images\"][0], flat_in=False, flat_out=True, verbose=False).shape == (225,)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "RjqjBDb1slwu"
},
"source": [
"# test single, flat_in, flat_out\n",
"assert my_center(digjit[\"data\"][0], flat_in=True, flat_out=True, verbose=False).shape == (225,)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "kXSQk_iEs1q_"
},
"source": [
"# test list, flat_out\n",
"assert my_center(digjit[\"images\"][:3], flat_in=False, flat_out=True, verbose=False).shape == (3, 225)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "2I09sdTytYR3"
},
"source": [
"# test list, flat_in, flat_out\n",
"assert digjit[\"data\"][:3].shape == (3, 225)\n",
"assert my_center(digjit[\"data\"][:3], flat_in=True, flat_out=True, verbose=False).shape == (3, 225)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "3nzOrrDCgxtq"
},
"source": [
"## take 4: sklearn function transformer"
]
},
{
"cell_type": "code",
"metadata": {
"id": "aG4T2b6SgztF"
},
"source": [
"# https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.FunctionTransformer.html\n",
"from sklearn.preprocessing import FunctionTransformer\n",
"image_center_transformer = FunctionTransformer(lambda X: my_center(X, True, True, False))"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"id": "t-A5wYvThMzp",
"outputId": "1ada57b6-71c2-490f-fd0f-5842246d6077"
},
"source": [
"# test\n",
"n_test = 10\n",
"img_cent = image_center_transformer.fit_transform(digjit[\"data\"][:n_test])\n",
"\n",
"for i in range(n_test):\n",
" print(f\"Label #{i}: {digits.target[i]}\")\n",
" plot_side(digjit[\"images\"][i], img_cent[i, :].reshape((15,15)), \"with jitter\", \"centered\")\n",
" plt.show()"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Label #0: 0\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 360x360 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
},
{
"output_type": "stream",
"text": [
"Label #1: 1\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 360x360 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
},
{
"output_type": "stream",
"text": [
"Label #2: 2\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 360x360 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
},
{
"output_type": "stream",
"text": [
"Label #3: 3\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 360x360 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
},
{
"output_type": "stream",
"text": [
"Label #4: 4\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 360x360 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
},
{
"output_type": "stream",
"text": [
"Label #5: 5\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 360x360 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
},
{
"output_type": "stream",
"text": [
"Label #6: 6\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 360x360 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
},
{
"output_type": "stream",
"text": [
"Label #7: 7\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 360x360 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
},
{
"output_type": "stream",
"text": [
"Label #8: 8\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 360x360 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
},
{
"output_type": "stream",
"text": [
"Label #9: 9\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 360x360 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 282
},
"id": "c3hlcfUPyfu3",
"outputId": "cfe62c90-9b26-4bc0-f0d1-a67b597ed9e7"
},
"source": [
"plt.imshow(digjit[\"images\"][9])\n",
"plt.show()\n",
"digits.target[9]"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"9"
]
},
"metadata": {},
"execution_count": 18
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "qF3yiSeGzKFg",
"outputId": "ef628d66-059b-4a46-b425-2900ecfabe9e"
},
"source": [
"# test on original un-jittered data\n",
"n_test = 10 # number of digits in dataset\n",
"img_cent = image_center_transformer.fit_transform(digpad[\"data\"][:n_test])\n",
"assert img_cent.shape == (10,225)\n",
"\n",
"for i in range(n_test):\n",
" is_eq = (digpad[\"images\"][i] == img_cent[i, :].reshape((15,15))).all()\n",
" print(f\"Label #{i}: {digits.target[i]}. unjittered ==? centered: {is_eq}\")\n",
" #plot_side(digpad[\"images\"][i], img_cent[i, :].reshape((14,14)), \"unjittered\", \"centered\")\n",
" #plt.show()"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Label #0: 0. unjittered ==? centered: False\n",
"Label #1: 1. unjittered ==? centered: True\n",
"Label #2: 2. unjittered ==? centered: False\n",
"Label #3: 3. unjittered ==? centered: False\n",
"Label #4: 4. unjittered ==? centered: True\n",
"Label #5: 5. unjittered ==? centered: True\n",
"Label #6: 6. unjittered ==? centered: True\n",
"Label #7: 7. unjittered ==? centered: False\n",
"Label #8: 8. unjittered ==? centered: True\n",
"Label #9: 9. unjittered ==? centered: False\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "GoEc1Sur0U62",
"outputId": "aa899e37-fd0f-459f-c2ad-25ae2324cfe8"
},
"source": [
"digpad[\"images\"][i]"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 2, 16, 16, 16, 13, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 3, 16, 12, 10, 14, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 1, 16, 1, 12, 15, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 13, 16, 9, 15, 2, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 3, 0, 9, 11, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 9, 15, 4, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 9, 12, 13, 3, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])"
]
},
"metadata": {},
"execution_count": 20
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "bJSoC3NH0V-k",
"outputId": "39fded48-a235-4ebd-d67d-371da9ac1d6a"
},
"source": [
"#(img_cent[i, :].reshape((15,15)) * 1e19).astype(int)\n",
"img_cent[i, :].reshape((15,15))"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 2, 16, 16, 16, 13, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 3, 16, 12, 10, 14, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 1, 16, 1, 12, 15, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 13, 16, 9, 15, 2, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 3, 0, 9, 11, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 9, 15, 4, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 9, 12, 13, 3, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])"
]
},
"metadata": {},
"execution_count": 21
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EjiCcTu0jp0_"
},
"source": [
"# run svm and knn"
]
},
{
"cell_type": "code",
"metadata": {
"id": "CIg193J-muvs"
},
"source": [
"#%pdb off"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "VIT0GtY0ww5a",
"outputId": "9a86ff31-1d1d-49a9-de1e-e177951e1e28"
},
"source": [
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn import metrics, svm, model_selection\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.decomposition import PCA\n",
"#import datetime as dt\n",
"import time\n",
"from sklearn.base import clone as sk_clone\n",
"\n",
"# trying to add pca because automl-sklearn did it with k-nearest neighbors\n",
"# Updae: PCA doesn't improve accuracy, but speeds up execution\n",
"pca = PCA(n_components = .8, svd_solver = \"full\")\n",
"\n",
"clf_l = [\n",
" # n neighbors = 3 is better than any of 1,2,4,5\n",
" (\"KNN #1\", KNeighborsClassifier(n_neighbors=3)),\n",
" #(\"KNN #2\", KNeighborsClassifier(n_neighbors=4, weights=\"distance\")), # same arguments as automl-sklearn\n",
" # default is kernel=rbf\n",
" # Gamme 1e-3 is better than any of (1e-5,1e-4,1e-2,1e-1)\n",
" # Try linear, poly, RBF as xtomasch gist\n",
" # https://gist.github.com/xtomasch/84d1d8574ef51eb8d42e77560d647e06\n",
" #(\"SVM linear\", svm.SVC(kernel=\"linear\")), # slow and bad performance anyway, so skip\n",
" (\"SVM poly\", svm.SVC(kernel=\"poly\")),\n",
" (\"SVM RBF\", svm.SVC(kernel=\"rbf\", gamma=0.001)),\n",
"]\n",
"\n",
"X_l = [\n",
" (\"no jitter\", digpad[\"data\"]),\n",
" (\"with jitter\", digjit[\"data\"]),\n",
" ]\n",
"\n",
"print(\"(data, center, pca, classifier): accuracy (duration)\")\n",
"print(\"------------------------------------\")\n",
"for X_name, X_i in X_l:\n",
"#for X_name, X_i in X_l[-1:]: # only jitter\n",
" for with_center in [False, True]:\n",
" for with_pca in [False, True]:\n",
" print(\"\")\n",
" for clf_name, clf_i in clf_l:\n",
" #for clf_name, clf_i in clf_l[:1]: # only KNN\n",
" dt_start = time.time()\n",
"\n",
" steps = []\n",
" if with_center: steps.append(('centerer', image_center_transformer))\n",
" if with_pca: steps.append(('PCA', pca))\n",
" steps.append(('classifier', clf_i))\n",
"\n",
" pipe = Pipeline(steps=steps)\n",
"\n",
" # use clone so as to reset between runs\n",
" # Update: tests show no changes in results due to this, so maybe it's unnecessary, but keeping it anyway to be safe.\n",
" pipe = sk_clone(pipe)\n",
"\n",
" results = model_selection.cross_val_score(pipe, X_i, digits.target)\n",
"\n",
" dt_end = time.time() # dt_end - dt_start will be 0 if execution time < 0.1 seconds\n",
"\n",
" # FIXME\n",
" # Note: pipe.fit mixes between (n_features, n_samples) and (n_samples, n_features) ?\n",
" #results = pipe.fit(X_i.T, digits.target).score(digits.target)\n",
" print(f\"({X_name}, {'with center' if with_center else 'no center'}, {'with pca' if with_pca else 'without pca'}, {clf_name}): \\t {np.mean(results).round(2)} ({round(dt_end - dt_start,1)} s)\")\n",
" #break # FIXME\n",
"\n",
" if np.std(results) >= .05:\n",
" print(f\"\\t ******\")\n",
" print(f\"\\t Detailed scores per cross-validation run: {[round(x,2) for x in results]}\")\n",
" print(f\"\\t std scores: {np.std(results).round(3)}\")\n",
" print(\"\")\n",
"\n",
" "
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"(data, center, pca, classifier): accuracy (duration)\n",
"------------------------------------\n",
"\n",
"(no jitter, no center, without pca, KNN #1): \t 0.97 (1.4 s)\n",
"(no jitter, no center, without pca, SVM poly): \t 0.96 (1.3 s)\n",
"(no jitter, no center, without pca, SVM RBF): \t 0.97 (2.3 s)\n",
"\n",
"(no jitter, no center, with pca, KNN #1): \t 0.95 (0.5 s)\n",
"(no jitter, no center, with pca, SVM poly): \t 0.94 (0.7 s)\n",
"(no jitter, no center, with pca, SVM RBF): \t 0.96 (0.8 s)\n",
"\n",
"(no jitter, with center, without pca, KNN #1): \t 0.95 (3.5 s)\n",
"(no jitter, with center, without pca, SVM poly): \t 0.95 (3.8 s)\n",
"(no jitter, with center, without pca, SVM RBF): \t 0.96 (5.2 s)\n",
"\n",
"(no jitter, with center, with pca, KNN #1): \t 0.94 (3.2 s)\n",
"(no jitter, with center, with pca, SVM poly): \t 0.94 (3.2 s)\n",
"(no jitter, with center, with pca, SVM RBF): \t 0.95 (3.3 s)\n",
"\n",
"(with jitter, no center, without pca, KNN #1): \t 0.35 (1.1 s)\n",
"(with jitter, no center, without pca, SVM poly): \t 0.27 (5.5 s)\n",
"(with jitter, no center, without pca, SVM RBF): \t 0.32 (8.2 s)\n",
"\n",
"(with jitter, no center, with pca, KNN #1): \t 0.32 (0.7 s)\n",
"\t ******\n",
"\t Detailed scores per cross-validation run: [0.25, 0.3, 0.37, 0.38, 0.28]\n",
"\t std scores: 0.053\n",
"(with jitter, no center, with pca, SVM poly): \t 0.27 (1.4 s)\n",
"(with jitter, no center, with pca, SVM RBF): \t 0.28 (2.2 s)\n",
"\t ******\n",
"\t Detailed scores per cross-validation run: [0.22, 0.26, 0.32, 0.36, 0.25]\n",
"\t std scores: 0.051\n",
"\n",
"(with jitter, with center, without pca, KNN #1): \t 0.95 (3.5 s)\n",
"(with jitter, with center, without pca, SVM poly): \t 0.95 (3.9 s)\n",
"(with jitter, with center, without pca, SVM RBF): \t 0.96 (5.2 s)\n",
"\n",
"(with jitter, with center, with pca, KNN #1): \t 0.94 (3.0 s)\n",
"(with jitter, with center, with pca, SVM poly): \t 0.93 (3.1 s)\n",
"(with jitter, with center, with pca, SVM RBF): \t 0.95 (3.2 s)\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "zVJwX_4ylZy_"
},
"source": [
"#len(X_i)\n",
"#X_i[0].shape\n",
"#image_center_transformer.fit_transform(X_i).shape\n",
"\n",
"# chain with fit_transform\n",
"# image_flatten_transformer.fit_transform(image_center_transformer.fit_transform(X_i)).shape\n",
"\n",
"# chain with separate calls to fit and transform\n",
"#X_cent = image_center_transformer.fit(X_i).transform(X_i)\n",
"#image_flatten_transformer.fit(X_cent).transform(X_cent).shape"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "0qH4IzNpmXyu"
},
"source": [
"# try auto-sklearn\n",
"\n",
"https://www.automl.org/automl/auto-sklearn/\n",
"\n",
"https://automl.github.io/auto-sklearn/master/\n",
"\n",
"Note: From the github.io page, the authors write \"This will run for one hour and should result in an accuracy above 0.98.\". So not running on the un-jittered digits dataset for now."
]
},
{
"cell_type": "code",
"metadata": {
"id": "kr-XX4ebnM4p",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "7076d2b7-ac28-46af-80bf-ccab57469924"
},
"source": [
"!pip install --quiet auto-sklearn\n",
"# RESTART kernel and load data again"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"\u001b[K |████████████████████████████████| 6.3 MB 8.1 MB/s \n",
"\u001b[K |████████████████████████████████| 28.5 MB 52 kB/s \n",
"\u001b[K |████████████████████████████████| 22.3 MB 70.3 MB/s \n",
"\u001b[K |████████████████████████████████| 722 kB 60.1 MB/s \n",
"\u001b[K |████████████████████████████████| 4.2 MB 38.0 MB/s \n",
"\u001b[K |████████████████████████████████| 4.0 MB 52.4 MB/s \n",
"\u001b[K |████████████████████████████████| 208 kB 59.5 MB/s \n",
"\u001b[K |████████████████████████████████| 973 kB 44.5 MB/s \n",
"\u001b[K |████████████████████████████████| 118 kB 53.3 MB/s \n",
"\u001b[?25h Building wheel for auto-sklearn (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
" Building wheel for pynisher (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
" Building wheel for liac-arff (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
"\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
"albumentations 0.1.12 requires imgaug<0.2.7,>=0.2.5, but you have imgaug 0.2.9 which is incompatible.\u001b[0m\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "22lYRMGLmx-n"
},
"source": [
"from sklearn.model_selection import train_test_split\n",
"\n",
"# Split data into 50% train and 50% test subsets\n",
"X_pad_train, X_pad_test, X_jit_train, X_jit_test, y_train, y_test = train_test_split(\n",
" digpad[\"data\"], digjit[\"data\"], digits.target,\n",
" test_size=0.5,\n",
" #shuffle=False # cannot stratify without shuffle=True\n",
" shuffle=True, stratify=digits.target\n",
")"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 392
},
"id": "5BB7fuHSl9nQ",
"outputId": "23c94da6-be4b-462f-b0c9-193b48b294c4"
},
"source": [
"import sklearn.metrics\n",
"\n",
"# Got error about NVM uninitialized, so trying version 2\n",
"# Update: got the same. Maybe because I'm testing with time_left...=30 or n_jobs=2\n",
"from autosklearn.classification import AutoSklearnClassifier\n",
"cls = AutoSklearnClassifier(n_jobs=1, time_left_for_this_task=120)\n",
"\n",
"#from autosklearn.experimental.askl2 import AutoSklearn2Classifier\n",
"#cls = AutoSklearn2Classifier(n_jobs=1, time_left_for_this_task=30)\n",
"\n",
"cls.fit(X_jit_train, y_train)\n",
"predictions = cls.predict(X_jit_test)\n",
"acc = sklearn.metrics.accuracy_score(y_test, predictions).round(2)\n",
"#print(f\"X_train = no jitter, accuracy = {acc}\")\n",
"acc"
],
"execution_count": null,
"outputs": [
{
"output_type": "error",
"ename": "IncorrectPackageVersionError",
"evalue": "ignored",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mIncorrectPackageVersionError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-27-072a5e48bba5>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# Got error about NVM uninitialized, so trying version 2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m# Update: got the same. Maybe because I'm testing with time_left...=30 or n_jobs=2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mautosklearn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclassification\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mAutoSklearnClassifier\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mcls\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mAutoSklearnClassifier\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtime_left_for_this_task\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m120\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/autosklearn/__init__.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mrequirements\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrequirements\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'utf-8'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0mdependencies\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mverify_packages\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrequirements\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 14\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;34m'posix'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/autosklearn/util/dependencies.py\u001b[0m in \u001b[0;36mverify_packages\u001b[0;34m(packages)\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0moperation\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmatch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroup\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'operation1'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0mversion\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmatch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroup\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'version1'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 25\u001b[0;31m \u001b[0m_verify_package\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moperation\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mversion\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 26\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Unable to read requirement: %s'\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mpackage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/autosklearn/util/dependencies.py\u001b[0m in \u001b[0;36m_verify_package\u001b[0;34m(name, operation, version)\u001b[0m\n\u001b[1;32m 60\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mcheck\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 61\u001b[0m raise IncorrectPackageVersionError(name, installed_version, operation,\n\u001b[0;32m---> 62\u001b[0;31m required_version)\n\u001b[0m\u001b[1;32m 63\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 64\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mIncorrectPackageVersionError\u001b[0m: found 'scipy' version 1.4.1 but requires scipy version >=1.7.0"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "nh6HOT2F88lj"
},
"source": [
"cls"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "aeVAeOFB9lhU"
},
"source": [
"Inspect results as per https://automl.github.io/auto-sklearn/master/manual.html#manual"
]
},
{
"cell_type": "code",
"metadata": {
"id": "K8qajCOQ8_Kk"
},
"source": [
"cls.cv_results_"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "-LkmR2mz9OOg"
},
"source": [
"print(cls.sprint_statistics())"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "RfMKiVNz9Sg8"
},
"source": [
"print(cls.show_models())"
],
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment