Exercício 01 - Titanic

Esse exercício tem como objetivo exercitar os conceitos básicos de dataset e de aprendizagem de máquina vistos no tutorial HelloWorld e prepara-lo para o que será abordado nas próximas aulas.

No exercício vamos trabalhar com um outro clássico dataset de aprendizagem de máquina: sobreviventes do titanic. Este também é um problema de classificação que visa dado um conjunto de informações dos passageiros do titanic, pretende-se classifica-los em "sobreviveu" ou "não sobreviveu" ao naufrágio.

A sua tarefa principal é pesquisar sobre o KNN no scikit learn e aplica-lo a este problema.

A base não vem com o ScikitLearn e vamos precisar baixar e carrega-la para trabalhar neste exemplo.

Para baixar e deixar a base pronta para uso segui o tutorial a seguir:

http://nbviewer.jupyter.org/github/savarin/pyconuk-introtutorial/blob/master/notebooks/Section%201-0%20-%20First%20Cut.ipynb

Como a base é da competição do Kaggle, não irei disponibiliza-la aqui. Para baixar os arquivos necessários, acesse:

https://www.kaggle.com/c/titanic/data (é necessário fazer um cadastro no Kaggle)

Preparando a base de dados

Esta etapa não é o foco do nosso exercício. Sendo assim, só irei reproduzir o passo a passo do link passado anteriormente.


In [1]:
import pandas as pd
import numpy as np

#Lendo a base de dados
df = pd.read_csv('../datasets/titanic/train.csv')

print("Tabela Original")
df.head()


Tabela Original
Out[1]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S

In [2]:
df = df.drop(['Name', 'Ticket', 'Cabin'], axis=1)
df = df.dropna()
df['Gender'] = df['Sex'].map({'female': 0, 'male':1}).astype(int)
df['Port'] = df['Embarked'].map({'C':1, 'S':2, 'Q':3}).astype(int)
df = df.drop(['Sex', 'Embarked'], axis=1)
cols = df.columns.tolist()
cols = [cols[1]] + cols[0:1] + cols[2:]
df = df[cols]


print("Tabela depois de processada")
df.head()


Tabela depois de processada
Out[2]:
Survived PassengerId Pclass Age SibSp Parch Fare Gender Port
0 0 1 3 22.0 1 0 7.2500 1 2
1 1 2 1 38.0 1 0 71.2833 0 1
2 1 3 3 26.0 0 0 7.9250 0 2
3 1 4 1 35.0 1 0 53.1000 0 2
4 0 5 3 35.0 0 0 8.0500 1 2

Por fim, geramos nossa base de treino e teste no formato para o ScikitLearn


In [7]:
dataset = {
    'data': df.values[0:,2:],
    'target': df.values[0:,0]
}

In [8]:
X = dataset['data']
y = dataset['target']

Tarefas

Como o propósito desse exercício não é submeter para o Kaggle, vamos ter que criar nossa própria base de testes. A base de teste disponibilizada pelo kaggle não vem com o gabarito, logo não poderíamos utilizar o aprendizado supervisionado.

Sendo assim, as tarefas deste exercício são:

  1. Separe sua base em treino e teste. Para o teste use 10% da base original.
  2. Aplique o algoritmo de Árvore de Decisão visto no HelloWorld e calcule a acurácia na base de teste
  3. Pesquise sobre o KNN e aplique-o sobre a mesma base de dados e calcule a acurácia

Resposta do item 1


In [11]:
from sklearn.model_selection import train_test_split

X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=0.1, random_state=4)

print(X.shape)
print(X_train.shape)
print(X_test.shape)


(712, 7)
(640, 7)
(72, 7)

Resposta do item 2


In [13]:
from sklearn import tree

clf_tree = tree.DecisionTreeClassifier(criterion='entropy')
clf_tree = clf_tree.fit(X_train, Y_train)

In [44]:
pred = clf_tree.predict(X_test)

In [22]:
from sklearn import metrics

acc = metrics.accuracy_score(Y_test, pred)

print("Acurácia da árvore de decisão", acc)


Acurácia da árvore de decisão 0.791666666667

Resposta do item 3


In [43]:
from sklearn.neighbors import KNeighborsClassifier

k_range = list(range(1, 30))

maior_k = 0.0
maior_acc_test = 0.0

print("k\t\tAcc Test\t\tAcc Train")

for k in k_range:
    knn = KNeighborsClassifier(n_neighbors=k)
    knn = knn.fit(X_train, Y_train)
    acc_test = knn.score(X_test, Y_test)
    acc_train = knn.score(X_train, Y_train)
    
    if acc_test > maior_acc_test:
        maior_k = k
        maior_acc_test = acc_test
    
    
    print(str(k)+"\t\t"+str(acc_test)+"\t\t"+str(acc_train))

print()
print("Maior valor de K é", maior_k, "com acurácia em teste igual a", maior_acc_test)


k		Acc Test		Acc Train
1		0.638888888889		0.9859375
2		0.583333333333		0.8203125
3		0.666666666667		0.81875
4		0.652777777778		0.78125
5		0.708333333333		0.796875
6		0.722222222222		0.765625
7		0.666666666667		0.7609375
8		0.680555555556		0.7484375
9		0.680555555556		0.75625
10		0.680555555556		0.7421875
11		0.680555555556		0.740625
12		0.666666666667		0.721875
13		0.652777777778		0.7296875
14		0.652777777778		0.721875
15		0.666666666667		0.7265625
16		0.652777777778		0.7203125
17		0.666666666667		0.725
18		0.680555555556		0.7234375
19		0.666666666667		0.7203125
20		0.680555555556		0.7171875
21		0.666666666667		0.7234375
22		0.680555555556		0.7234375
23		0.666666666667		0.721875
24		0.666666666667		0.71875
25		0.666666666667		0.7234375
26		0.666666666667		0.725
27		0.666666666667		0.728125
28		0.666666666667		0.7203125
29		0.666666666667		0.721875

Maior valor de K é 6 com acurácia em teste igual a 0.722222222222