Escolha de um classificador

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.

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.

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.

In [1]:
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn import svm

iris = datasets.load_iris()
print(iris.data.shape, iris.target.shape)
(150, 4) (150,)

Divisão em treinamento e teste

Aqui não há escolha de um modelo. Apenas trein-se um classifcador e em seguida verifica-se seu desempenho sobre o conjunto de teste.

In [2]:
X_train, X_test, y_train, y_test = train_test_split( \
        iris.data, iris.target, test_size=0.4, random_state=0)

print(X_train.shape, y_train.shape)
print(X_test.shape, y_test.shape)

clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
clf.score(X_test, y_test)
(90, 4) (90,)
(60, 4) (60,)
Out[2]:
0.96666666666666667

Validação cruzada

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.

In [3]:
from sklearn.model_selection import cross_val_score

clf = svm.SVC(kernel='linear', C=1)
scores = cross_val_score(clf, iris.data, iris.target, cv=5)
print(scores)

print("Accuracy: %0.2f (+/- %0.2f)" %(scores.mean(), scores.std()*2))
[ 0.96666667  1.          0.96666667  0.96666667  1.        ]
Accuracy: 0.98 (+/- 0.03)

Predição por validação cruzada

(apenas para saber como foi a classificação de cada amostra quando o mesmo estava no fold de teste)

In [4]:
from sklearn import metrics
from sklearn.model_selection import cross_val_predict

predicted = cross_val_predict(clf, iris.data, iris.target, cv=10)
pred_acc = metrics.accuracy_score(iris.target, predicted) 
print(pred_acc)
0.973333333333