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:
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)
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()
Out[1]:
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()
Out[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']
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:
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)
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)
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)