224 lines
18 KiB
Text
Executable file
224 lines
18 KiB
Text
Executable file
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Experiments with the one vs rest multiclass classification scheme"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"%matplotlib inline\n",
|
|
"\n",
|
|
"from sklearn import datasets\n",
|
|
"from sklearn.multiclass import OneVsRestClassifier as OvR\n",
|
|
"from sklearn.svm import LinearSVC\n",
|
|
"import numpy as np\n",
|
|
"import copy\n",
|
|
"from matplotlib import pyplot as plt"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"digits = datasets.load_digits()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"We will use the \"Optical Recognition of Handwritten Digits Data Set\" from UCI (included in scikit learn and already loaded on the previous line). Let us plot the first 10 images in the dataset."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\nAABJRU5ErkJggg==\n",
|
|
"text/plain": [
|
|
"<matplotlib.figure.Figure at 0x109b68190>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"for index, image in enumerate(digits.images[:10]):\n",
|
|
" plt.subplot(2, 5, index + 1)\n",
|
|
" plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Let us create a training set using the first 1000 images and a test set using the rest of the data."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[ 0. 0. 5. 13. 9. 1. 0. 0. 0. 0. 13. 15. 10. 15. 5.\n",
|
|
" 0. 0. 3. 15. 2. 0. 11. 8. 0. 0. 4. 12. 0. 0. 8.\n",
|
|
" 8. 0. 0. 5. 8. 0. 0. 9. 8. 0. 0. 4. 11. 0. 1.\n",
|
|
" 12. 7. 0. 0. 2. 14. 5. 10. 12. 0. 0. 0. 0. 6. 13.\n",
|
|
" 10. 0. 0. 0.]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"X,y = digits.data[0:1000], digits.target[0:1000]\n",
|
|
"X_test, y_test = digits.data[1000:], digits.target[1000:]\n",
|
|
"print(X[0])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"scikit-learn provide us with an One-Vs-Rest classifier that we already imported with name `OvR`. Let us use that classifier to fit the training set and to make predictions over the test set:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"binaryLearner = LinearSVC(random_state=0)\n",
|
|
"\n",
|
|
"oneVrestLearningAlgorithm = OvR(binaryLearner)\n",
|
|
"oneVrestLearningAlgorithm.fit(X,y)\n",
|
|
"predicted_labels = oneVrestLearningAlgorithm.predict(X_test)\n",
|
|
"\n",
|
|
"# n.b.: the above is equivalent to:\n",
|
|
"# predicted_labels = OvR(LinearSVC(random_state=0)).fit(X,y).predict(X_test)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"print \"Accuracy: %s\" % (1.0 - np.count_nonzero(y_test - predicted_labels) / float(len(predicted_labels)))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Exercise"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Reimplement the OvR classifier by completing the methods in the following class [[1](#hint1)]:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"class OneVsRestClassifier:\n",
|
|
" def __init__(self, learner):\n",
|
|
" #... to be done ...\n",
|
|
" return 1\n",
|
|
"\n",
|
|
" def fit(self, data, labels):\n",
|
|
" #... to be done ...\n",
|
|
"\n",
|
|
" return self\n",
|
|
"\n",
|
|
" def predict(self, data):\n",
|
|
" #... to be done ...\n",
|
|
" return 1"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Calculate the accuracy of your solution using the following code [[2](#hint2)]:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"ovr = OneVsRestClassifier(LinearSVC(random_state=0))\n",
|
|
"predicted_labels = ovr.fit(X,y).predict(X_test)\n",
|
|
"print \"Accuracy: %s\" % (1.0-np.count_nonzero(predicted_labels-y_test)/float(len(y_test)))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"<a name=\"hint1\">Hint 1:</a> Feel free to organize your code as you like (add as many methods as you believe are necessary).\n",
|
|
"\n",
|
|
"<a name=\"hint2\">Hint 2:</a> The scheme provided by scikit-learn is a little different from the one we have seen in the lessons. It is normal if your accuracy is not as good as the one obtained above (expect the accuracy to be between 0.8 and 0.9)."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"anaconda-cloud": {},
|
|
"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.7.7"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 1
|
|
}
|