Outils pour utilisateurs

Outils du site


nsi:projets:knn

Algorithme KNN

Prérequis

Sujets

Certaines bases sont très grosses. Le fichier income d'entraînement à 32 000 lignes et le fichier de test en a 16 000 ! Il sera trop long de tester tout cela donc vous pouvez réduire. Il suffit par exemple d'écrire data[:1000] pour ne retenir que les 1000 premières lignes.

Un peu d'aide pour le calcul de distance

Le travail à faire consiste essentiellement à déterminer la fonction distance qui permettra de mesurer au mieux ce qui fait que deux individus sont proches ou éloignés.

Certains attributs sont des nombres : poids, classe, age…

D'autres attributs sont textuels. Comment calculer avec eux ?

Cas des attributs textuels à deux valeurs

C'est le cas par exemple de la colonne Sex dans Titanic. Le plus simple est d'attribuer 0 à 'male' et 1 à 'female'.

Ce ne serait pas compliqué avec des tableaux ordinaires mais nous avons choisi d'utiliser pandas. Les tableaux pandas ont un fonctionnement spécial.

Voici comment faire pour le cas présent :

data['F'] = (data['Sex'] == 'female').astype(int)

Voici ce que fait ce code :

  • data_train['Sex'] == 'female' crée une colonne à True pour les cas où la colonne 'Sex' vaut 'female' et False pour les autres,
  • (…).astype(int) permet de convertir la colonne en entier, de sorte que les True deviennent 1 et les False deviennent 0,
  • la colonne est ajoutée à data avec le nom F.il crée une nouvelle colonne 'F',

On pourra utiliser cette colonne pour les calculs.

Cas des attributs textuels à plusieurs valeurs

Dans ormeaux, la colonne 'Sex' a trois valeurs : 'M', 'F' et 'I'. Dans revenus, certaines colonnes peuvent avoir beaucoup de valeurs différentes comme 'workclass' ou 'occupation'. Dans Titanic, on a la colonne 'Embarked'. Que faire ?

Première option : attribuer un numéro pour chaque cas. On le fait avec une fonction.

def sex_to_int(value):
    if value == 'M':
        return 3
    if value == 'F':
        return 2
    return 1

data['Sex'] = data['Sex'].apply(sex_to_int)
  • .apply permet d'appliquer la fonction à tous les items de la colonne data['Sex'], ce qui crée une nouvelle colonne,
  • data['Sex'] = fait que la nouvelle colonne remplace l'ancienne.

Il est important de se poser la question : y a-t-il une distance plus grande entre M et et I qu'entre M et F ? En choisissant 3 pour M, 2 pour F et 1 pour I, on aura un écart de 2 entre M et I et seulement un écart de 1 entre M et F.

Est-ce pertinent ? Si vous pensez que oui, alors c'est bon. Sinon il faut faire autrement.

L'autre méthode consiste à créer une colonne pour chaque possibilité, cette colonne valant 1 ou 0.

data['M'] = (data['Sex'] == 'M').astype(int)
data['F'] = (data['Sex'] == 'F').astype(int)
data['I'] = (data['Sex'] == 'I').astype(int)

normalisation des colonnes

Comme expliquer sur cette page, les données brutes ne sont pas comparables : le plus souvent elles n'ont pas les mêmes unités (comparer des mètres et des kg ?!!??) et de plus elles n'ont pas le même ordre de grandeur (par ex, 10cm de différence n'a pas la même importance selon que l'on parle de taille d'un individu ou de sa largeur)

Je rappelle le calcul (le même que dans la page précédemment mentionnée) Par exemple dans ormeaux pour la colonne Diameter :

m = data['Diameter'].mean()
std = data['Diameter'].std()
data['Diameter'] = (data['Diameter'] - m)/std

Toutes les manipulations effectuées sur la base d'apprentissage devront être aussi effectuées sur la base de test !

nsi/projets/knn.txt · Dernière modification : de goupillwiki