| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
| nsi:projets:knn [2022/03/29 11:09] – ↷ Liens modifiés en raison d'un déplacement. goupillwiki | nsi:projets:knn [2023/04/08 21:41] (Version actuelle) – goupillwiki |
|---|
| * [[nsi:projets:data:start|Projet fichier de données]] | * [[nsi:projets:data:start|Projet fichier de données]] |
| * [[nsi:premiere:knn:start|algorithme knn]] | * [[nsi:premiere:knn:start|algorithme knn]] |
| | * [[nsi:premiere:knn:iris|Exemple des iris]] |
| |
| ===== Sujets ===== | ===== Sujets ===== |
| |
| * [[nsi:tds:knn_et_titanic|Survivants au naufrage du Titanic]] | * [[nsi:tds:ia:knn_et_titanic|Survivants au naufrage du Titanic]] |
| | * [[nsi:datasets:ormeaux|Prédiction d'age des ormeaux]] |
| | * [[nsi:datasets:income|Prédiction du revenu]] |
| | |
| | <WRAP important> |
| | Certaines bases sont très grosses. Le fichier [[nsi:datasets:income|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. |
| | </WRAP> |
| | |
| | ===== 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 [[nsi:tds:ia:knn_et_titanic|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 : |
| | |
| | <code python> |
| | data['F'] = (data['Sex'] == 'female').astype(int) |
| | </code> |
| | |
| | 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 [[nsi:datasets:ormeaux|ormeaux]], la colonne ''%%'Sex'%%'' a trois valeurs : ''%%'M'%%'', ''%%'F'%%'' et ''%%'I'%%''. Dans [[nsi:datasets:income|revenus]], certaines colonnes peuvent avoir beaucoup de valeurs différentes comme ''%%'workclass'%%'' ou ''%%'occupation'%%''. Dans [[nsi:tds:ia:knn_et_titanic|Titanic]], on a la colonne ''%%'Embarked'%%''. Que faire ? |
| | |
| | Première option : attribuer un numéro pour chaque cas. On le fait avec une fonction. |
| | |
| | <code python> |
| | 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) |
| | </code> |
| | |
| | * ''.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. |
| | |
| | <WRAP important> |
| | 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. |
| | </WRAP> |
| | |
| | L'autre méthode consiste à créer une colonne pour chaque possibilité, cette colonne valant ''1'' ou ''0''. |
| | |
| | <code python> |
| | data['M'] = (data['Sex'] == 'M').astype(int) |
| | data['F'] = (data['Sex'] == 'F').astype(int) |
| | data['I'] = (data['Sex'] == 'I').astype(int) |
| | </code> |
| | |
| | === normalisation des colonnes === |
| | |
| | Comme expliquer sur cette [[nsi:premiere:knn:probleme_distance|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 [[nsi:premiere:knn:probleme_distance|page]] précédemment mentionnée) Par exemple dans [[nsi:datasets:ormeaux|ormeaux]] pour la colonne ''Diameter'' : |
| | |
| | <code python> |
| | m = data['Diameter'].mean() |
| | std = data['Diameter'].std() |
| | data['Diameter'] = (data['Diameter'] - m)/std |
| | </code> |
| | |
| | <WRAP important> |
| | Toutes les manipulations effectuées sur la base d'apprentissage devront être aussi effectuées sur la base de test ! |
| | </WRAP> |
| | |
| | |
| | |
| | |
| | |