{ "metadata": { "name": "comparison_ordinal_logistic" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "from __future__ import print_function\n", "import numpy as np\n", "from sklearn import datasets, metrics, cross_validation\n", "from minirank import ordinal_logistic_fit, ordinal_logistic_predict" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 35 }, { "cell_type": "code", "collapsed": false, "input": [ "DOC = \"\"\"\n", "================================================================================\n", "Compare the prediction accuracy of different models on the boston dataset\n", "================================================================================\n", "\"\"\"\n", "print(DOC)\n", "boston = datasets.load_boston()\n", "X, y = boston.data, np.round(boston.target)\n", "X -= X.mean()\n", "y -= y.min()\n", "\n", "idx = np.argsort(y)\n", "X = X[idx]\n", "y = y[idx]\n", "cv = cross_validation.ShuffleSplit(y.size, n_iter=50, test_size=.1, random_state=0)\n", "score_logistic = []\n", "score_ordinal_logistic = []\n", "score_ridge = []\n", "for i, (train, test) in enumerate(cv):\n", " if not np.all(np.unique(y[train]) == np.unique(y)):\n", " # we need the train set to have all different classes\n", " continue\n", " assert np.all(np.unique(y[train]) == np.unique(y))\n", " train = np.sort(train)\n", " test = np.sort(test)\n", " w, theta = ordinal_logistic_fit(X[train], y[train])\n", " pred = ordinal_logistic_predict(w, theta, X[test], y)\n", " s = metrics.mean_absolute_error(y[test], pred)\n", " print('ERROR (ORDINAL) fold %s: %s' % (i+1, s))\n", " score_ordinal_logistic.append(s)\n", "\n", " from sklearn import linear_model\n", " clf = linear_model.LogisticRegression(C=1.)\n", " clf.fit(X[train], y[train])\n", " pred = clf.predict(X[test])\n", " s = metrics.mean_absolute_error(y[test], pred)\n", " print('ERROR (LOGISTIC) fold %s: %s' % (i+1, s))\n", " score_logistic.append(s)\n", "\n", " from sklearn import linear_model\n", " clf = linear_model.Ridge(alpha=1.)\n", " clf.fit(X[train], y[train])\n", " pred = np.round(clf.predict(X[test]))\n", " s = metrics.mean_absolute_error(y[test], pred)\n", " print('ERROR (LOGISTIC) fold %s: %s' % (i+1, s))\n", " score_ridge.append(s)\n", "\n", "\n", "print()\n", "print('MEAN ABSOLUTE ERROR (ORDINAL LOGISTIC): %s' % np.mean(score_ordinal_logistic))\n", "print('MEAN ABSOLUTE ERROR (LOGISTIC REGRESSION): %s' % np.mean(score_logistic))\n", "print('MEAN ABSOLUTE ERROR (RIDGE REGRESSION): %s' % np.mean(score_ridge))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n", "================================================================================\n", "Compare the prediction accuracy of different models on the boston dataset\n", "================================================================================\n", "\n", "ERROR (ORDINAL) fold 2: 2.78431372549" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 2: 4.23529411765" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 2: 3.25490196078\n", "ERROR (ORDINAL) fold 4: 3.88235294118" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 4: 4.60784313725" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 4: 3.58823529412\n", "ERROR (ORDINAL) fold 5: 3.27450980392" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 5: 4.23529411765" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 5: 3.21568627451\n", "ERROR (ORDINAL) fold 6: 3.50980392157" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 6: 4.03921568627" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 6: 3.47058823529\n", "ERROR (ORDINAL) fold 7: 2.66666666667" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 7: 2.82352941176" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 7: 2.96078431373\n", "ERROR (ORDINAL) fold 12: 4.03921568627" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 12: 4.70588235294" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 12: 4.50980392157\n", "ERROR (ORDINAL) fold 13: 4.23529411765" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 13: 4.09803921569" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 13: 4.43137254902\n", "ERROR (ORDINAL) fold 15: 3.1568627451" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 15: 4.74509803922" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 15: 4.09803921569\n", "ERROR (ORDINAL) fold 23: 3.39215686275" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 23: 3.92156862745" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 23: 3.72549019608\n", "ERROR (ORDINAL) fold 26: 3.54901960784" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 26: 5.25490196078" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 26: 4.03921568627\n", "ERROR (ORDINAL) fold 29: 2.96078431373" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 29: 3.09803921569" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 29: 2.17647058824\n", "ERROR (ORDINAL) fold 30: 2.80392156863" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 30: 3.0" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 30: 3.25490196078\n", "ERROR (ORDINAL) fold 33: 3.27450980392" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 33: 3.90196078431" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 33: 3.62745098039\n", "ERROR (ORDINAL) fold 34: 2.52941176471" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 34: 3.43137254902" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 34: 3.33333333333\n", "ERROR (ORDINAL) fold 38: 2.78431372549" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 38: 3.66666666667" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 38: 2.64705882353\n", "ERROR (ORDINAL) fold 39: 3.25490196078" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 39: 3.35294117647" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 39: 3.72549019608\n", "ERROR (ORDINAL) fold 40: 3.56862745098" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 40: 3.72549019608" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 40: 3.72549019608\n", "ERROR (ORDINAL) fold 41: 3.98039215686" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 41: 3.54901960784" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 41: 4.27450980392\n", "ERROR (ORDINAL) fold 42: 4.03921568627" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 42: 3.21568627451" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 42: 4.13725490196\n", "ERROR (ORDINAL) fold 45: 3.35294117647" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 45: 3.1568627451" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 45: 3.41176470588" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (ORDINAL) fold 46: 2.92156862745" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 46: 4.50980392157" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 46: 3.47058823529\n", "ERROR (ORDINAL) fold 48: 2.60784313725" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 48: 3.19607843137" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "ERROR (LOGISTIC) fold 48: 3.29411764706\n", "\n", "MEAN ABSOLUTE ERROR (ORDINAL LOGISTIC): 3.29857397504\n", "MEAN ABSOLUTE ERROR (LOGISTIC REGRESSION): 3.83957219251\n", "MEAN ABSOLUTE ERROR (RIDGE REGRESSION): 3.5623885918\n" ] } ], "prompt_number": 36 }, { "cell_type": "code", "collapsed": false, "input": [ "from pylab import *\n", "\n", "pos = arange(3)+1.1 # the bar centers on the y axis\n", "val = map(np.mean, (score_ordinal_logistic, score_logistic, score_ridge))\n", "xerr = map(np.std, (score_ordinal_logistic, score_logistic, score_ridge))\n", "\n", "barh(pos,val, xerr=xerr, align='center', alpha=.5, ecolor='black')\n", "yticks(pos, ('Ordinal Logistic', 'Multiclass Logistic', 'Linear Regression'), rotation=45)\n", "grid(True)\n", "xlabel('Mean Absolute Error (lower is better)', fontsize='x-large')\n", "tight_layout()\n", "savefig('bars_ordinal.png')\n", "show()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "display_data", "png": "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\nAAAASUVORK5CYII=\n" } ], "prompt_number": 47 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 45 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }