{ "cells": [ { "cell_type": "markdown", "id": "c2c2eb33", "metadata": {}, "source": [ "# PyStruct - Structured Learning in Python #\n", "\n", "PyStruct is structured learning and prediction library. It currently implements max-margin methods and supports different types of structures like chains or 2D grids.\n", "\n", "## Installation ##\n", "\n", "To install pystruct, you need cvxopt, cython and scikit-learn (which requires numpy and scipy).\n", "The easiest way to install pystruct is using pip:\n", "\n", "`pip install pystruct`" ] }, { "cell_type": "markdown", "id": "17e88a49", "metadata": {}, "source": [ "# Example: OCR Letter sequence recognition #\n", "\n", "This example illustrates the use of a chain CRF for optical character recognition. The example is taken from Taskar et al. *Max-margin markov random fields*.\n", "\n", "\n", "\n", "We compare classification using:\n", "\n", "\n", "\n", "There are obvious extensions that both methods could benefit from, such as window features or non-linear kernels. This example is more meant to give a demonstration of the CRF than to show its superiority." ] }, { "cell_type": "code", "execution_count": 16, "id": "4b417ea3", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from sklearn.svm import LinearSVC\n", "\n", "from pystruct.datasets import load_letters\n", "from pystruct.models import ChainCRF\n", "from pystruct.learners import FrankWolfeSSVM" ] }, { "cell_type": "code", "execution_count": 17, "id": "9832e08d", "metadata": {}, "outputs": [], "source": [ "abc = \"abcdefghijklmnopqrstuvwxyz\"\n", "\n", "letters = load_letters()\n", "X, y, folds = letters['data'], letters['labels'], letters['folds']\n", "# we convert the lists to object arrays, as that makes slicing much more convenient\n", "X, y = np.array(X, dtype=object), np.array(y, dtype=object)\n", "X_train, X_test = X[folds == 1], X[folds != 1]\n", "y_train, y_test = y[folds == 1], y[folds != 1]" ] }, { "cell_type": "code", "execution_count": 18, "id": "3315839c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "LinearSVC(C=0.1, class_weight=None, dual=False, fit_intercept=True,\n", " intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n", " multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n", " verbose=0)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Train linear SVM\n", "svm = LinearSVC(dual=False, C=.1)\n", "# flatten input\n", "svm.fit(np.vstack(X_train), np.hstack(y_train))" ] }, { "cell_type": "code", "execution_count": 19, "id": "1c45d7e7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "FrankWolfeSSVM(C=0.1, batch_mode=False, check_dual_every=10, do_averaging=True,\n", " line_search=True, logger=None, max_iter=11,\n", " model=ChainCRF(n_states: 26, inference_method: max-product),\n", " n_jobs=1, random_state=None, sample_method='perm',\n", " show_loss_every=0, tol=0.001, verbose=0)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Train linear chain CRF\n", "model = ChainCRF()\n", "ssvm = FrankWolfeSSVM(model=model, C=.1, max_iter=11)\n", "ssvm.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 20, "id": "5ce129b2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Test score with chain CRF: 0.786754\n", "Test score with linear SVM: 0.713791\n" ] } ], "source": [ "print(\"Test score with chain CRF: %f\" % ssvm.score(X_test, y_test))\n", "\n", "print(\"Test score with linear SVM: %f\" % svm.score(np.vstack(X_test),\n", " np.hstack(y_test)))" ] }, { "cell_type": "code", "execution_count": 21, "id": "ccd01fac", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# plot some word sequenced\n", "n_words = 4\n", "rnd = np.random.RandomState(1)\n", "selected = rnd.randint(len(y_test), size=n_words)\n", "max_word_len = max([len(y_) for y_ in y_test[selected]])\n", "fig, axes = plt.subplots(n_words, max_word_len, figsize=(10, 10))\n", "fig.subplots_adjust(wspace=0)\n", "for ind, axes_row in zip(selected, axes):\n", " y_pred_svm = svm.predict(X_test[ind])\n", " y_pred_chain = ssvm.predict([X_test[ind]])[0]\n", " for i, (a, image, y_true, y_svm, y_chain) in enumerate(\n", " zip(axes_row, X_test[ind], y_test[ind], y_pred_svm, y_pred_chain)):\n", " a.matshow(image.reshape(16, 8), cmap=plt.cm.Greys)\n", " a.text(0, 3, abc[y_true], color=\"#00AA00\", size=25)\n", " a.text(0, 14, abc[y_svm], color=\"#5555FF\", size=25)\n", " a.text(5, 14, abc[y_chain], color=\"#FF5555\", size=25)\n", " a.set_xticks(())\n", " a.set_yticks(())\n", " for ii in range(i + 1, max_word_len):\n", " axes_row[ii].set_visible(False)\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "b82e8368", "metadata": {}, "source": [ "The figure shows the segmented letters of four words from the test set. In set are the ground truth (green), the prediction using SVM (blue) and the prediction using a chain CRF (red)." ] }, { "cell_type": "code", "execution_count": 22, "id": "8d7af75a", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.matshow(ssvm.w[26 * 8 * 16:].reshape(26, 26))\n", "plt.colorbar()\n", "plt.title(\"Transition parameters of the chain CRF.\")\n", "plt.xticks(np.arange(26), abc)\n", "plt.yticks(np.arange(26), abc)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "e6fd1650", "metadata": {}, "source": [ "The figure shows the pairwise potentials learned by the chain CRF. The strongest patterns are *y after l* and *n after i*.\n", "\n", "There are obvious extensions that both methods could benefit from, such as window features or non-linear kernels. " ] } ], "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.13" } }, "nbformat": 4, "nbformat_minor": 5 }