1. Légendaires ou pas ?
Télécharger le fichier csv ci-dessous.
https://github.com/qkzk/data_colab/blob/master/nsi/algo/knn/pokemon/pokemon_small.csv
L’ouvrir avec un tableur et étudier les données pour déterminer quelles caractéristiques permettent de différencier les pokémons des pokémons légendaires.
2. Mise en place d’un KNN
Mettre le fichier pokemon_small dans un répertoire knn_pokemons
Ajouter un fichier python avec le code suivant
import csv
pokemons=[]
with open('pokemon_small.csv', newline='') as csvfile:
spamreader = csv.reader(csvfile)
for row in spamreader:
pokemons.append(row)
def transformation_liste(pokemons):
'''
transforme la liste des pokemons
en une liste de dictionnaires
>>>transformation_liste(pokemons)[0]
{'name': 'Magmar', 'attack': '95', 'base_egg_steps': '6400',
'base_happiness': '70', 'capture_rate': '45',
'classfication': 'Spitfire Pokémon', 'defense': '57',
'experience_growth': '1000000', 'height_m': '1.3', 'hp': '65',
'pokedex_number': '126', 'sp_attack': '100', 'sp_defense': '85',
'speed': '93', 'type1': 'fire', 'type2': '', 'weight_kg': '44.5',
'generation': '1', 'is_legendary': '0'}
'''
def distance(poke1,poke2):
pass
Compléter la fonction transformation pour qu’elle réponde à sa docstring.
Mettre en place votre fonction distance()
Reprendre la fonction plus_proches_voisins(fleur,liste_fleurs): du tp précédent et l’adapter.à votre tp pokemon
Tester votre tp avec davantage de pokémons :
https://github.com/qkzk/data_colab/blob/master/nsi/algo/knn/pokemon/pokemon_suspect2.csv
proposition de correction
import csv
pokemons=[]
with open('pokemon_small.csv', newline='') as csvfile:
spamreader = csv.reader(csvfile)
for row in spamreader:
pokemons.append(row)
def transformation_liste(pokemons):
'''
transforme la liste des pokemons
en une liste de dictionnaires
>>>transformation_liste(pokemons)[0]
{'name': 'Magmar', 'attack': '95', 'base_egg_steps': '6400',
'base_happiness': '70', 'capture_rate': '45',
'classfication': 'Spitfire Pokémon', 'defense': '57',
'experience_growth': '1000000', 'height_m': '1.3', 'hp': '65',
'pokedex_number': '126', 'sp_attack': '100', 'sp_defense': '85',
'speed': '93', 'type1': 'fire', 'type2': '', 'weight_kg': '44.5',
'generation': '1', 'is_legendary': '0'}
'''
retour =[]
for i in range(1,len(pokemons)):
mon_poke=pokemons[i]
dico_poke={}
for j in range(len(mon_poke)):
cle=pokemons[0][j]
val=mon_poke[j]
dico_poke[cle]=val
retour.append(dico_poke)
return retour
pokemons=transformation_liste(pokemons)
poke1=pokemons[18]
poke2=pokemons[19]
def distance(poke1,poke2):
'''
Renvoie la distance euclidienne entre deux
pokemons en considérant la
base_egg_steps et la base_happiness
'''
x1=int(poke1['base_egg_steps'])
y1=int(poke1['base_happiness'])
x2=int(poke2['base_egg_steps'])
y2=int(poke2['base_happiness'])
d=((x1-x2)**2+(y1-y2)**2)**0.5
return d
def plus_proches_voisins(poke,pokemons):
'''
renvoie la liste des plus proches
voisins par distance croissante
'''
liste=pokemons.copy()
retour=[]
# tant que retour n'a pas la taille voulue
while len(retour)!=len(pokemons):
# on cherche le poke le plus proche
d_min=distance(poke,liste[0])
poke_min=liste[0]
for f in liste:
if distance(poke,f)<d_min:
d_min=distance(poke,f)
poke_min=f
# on l'ajoute au retour
retour.append(poke_min)
# on l'enleve de la liste
liste.remove(poke_min)
# on renvoie ce qu'il faut
return retour
def k_plus_proches_voisins(k,poke,pokemons):
'''
renvoie la liste des k plus proches
voisins
'''
liste_plus_proches_voisins=plus_proches_voisins(poke,pokemons)
return liste_plus_proches_voisins[:k]
def pourcentages_legendaires_k_plus_proches_voisins(k,poke1,pokemons):
'''
>>>pourcentages_legendaires_k_plus_proches_voisins(1,poke1,pokemons)
1
>>>pourcentages_legendaires_k_plus_proches_voisins(4,poke1,pokemons)
0.5
>>>pourcentages_legendaires_k_plus_proches_voisins(5,poke1,pokemons)
0.4
'''
pass