{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Escolha de um classificador\n", "\n", "Treinar vários classificadores e escolher aquele com menor erro no conjunto de treinamento (o conjunto usado para o treinamento) não é uma boa escolha. É possível que o classificador tenha se super-ajustado aos dados de treinamento e não apresente desempenho similar em relação a outros dados novos.\n", "\n", "Procedimento comum: dividir o conjunto de treinamento em treinamento e validação. Treinar no conjunto de treinamento e avaliar o desempenho no conjunto de validação para escolher um modelo.\n", "\n", "O desempenho no conjunto de validação pode, no entanto, não refletir o desempenho esperado (afinal, escolheu-se aquele com o melhor desempenho no conjunto de validação). Para estimar o desempenho esperado usa-se um conjunto distinto, chamado conjunto de teste. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Exemplo retirado de http://scikit-learn.org/stable/modules/cross_validation.html" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\n", "from sklearn.model_selection import train_test_split\n", "from sklearn import datasets\n", "from sklearn import svm\n", "\n", "iris = datasets.load_iris()\n", "print(iris.data.shape, iris.target.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Divisão em treinamento e teste\n", "\n", "Aqui não há escolha de um modelo. Apenas trein-se um classifcador\n", "e em seguida verifica-se seu desempenho sobre o conjunto de teste." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "X_train, X_test, y_train, y_test = train_test_split( \\\n", " iris.data, iris.target, test_size=0.4, random_state=0)\n", "\n", "print(X_train.shape, y_train.shape)\n", "print(X_test.shape, y_test.shape)\n", "\n", "clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)\n", "clf.score(X_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Validação cruzada\n", "\n", "Validação cruzada pode ser usada para escolha de um modelo. Abaixo mostra-se o treinamento de apenas um modelo. Isso pode ser repetido para vários modelos e então pode ser escolhido aquele com melhor desempenho na validação cruzada." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from sklearn.model_selection import cross_val_score\n", "\n", "clf = svm.SVC(kernel='linear', C=1)\n", "scores = cross_val_score(clf, iris.data, iris.target, cv=5)\n", "print(scores)\n", "\n", "print(\"Accuracy: %0.2f (+/- %0.2f)\" %(scores.mean(), scores.std()*2))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Predição por validação cruzada\n", "(apenas para saber como foi a classificação de cada amostra quando o mesmo estava no fold de teste)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from sklearn import metrics\n", "from sklearn.model_selection import cross_val_predict\n", "\n", "predicted = cross_val_predict(clf, iris.data, iris.target, cv=10)\n", "pred_acc = metrics.accuracy_score(iris.target, predicted) \n", "print(pred_acc)" ] } ], "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.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }