NSI , KNN et Pokemons

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