Outils pour utilisateurs

Outils du site


nsi:tds:ia:neurones

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
nsi:tds:ia:neurones [2022/04/21 14:32] – [Distance] goupillwikinsi:tds:ia:neurones [2022/04/22 11:37] (Version actuelle) – [Module sklearn] goupillwiki
Ligne 85: Ligne 85:
     color indique la couleur désirée     color indique la couleur désirée
     """     """
-    x = [item["petal_length"] for item in data if item["species"] = species] +    x = [item["petal_length"] for item in data if item["species"== species] 
-    y = [item["petal_width"] for item in data if item["species"] = species]+    y = [item["petal_width"] for item in data if item["species"== species]
     if len(x) > 0:     if len(x) > 0:
         plt.scatter(x, y, c=color, label=species)         plt.scatter(x, y, c=color, label=species)
  
-plot_sub_cloud('setosa'+plot_sub_cloud('setosa', 'b') 
-plot_sub_cloud('versicolor'+plot_sub_cloud('versicolor', 'g') 
-plot_sub_cloud('virginica')+plot_sub_cloud('virginica', 'r')
 plt.legend() plt.legend()
 plt.show() plt.show()
Ligne 182: Ligne 182:
 On choisit de faire varier $a$ de la quantité On choisit de faire varier $a$ de la quantité
  
-$$da = -\lambda \cdot \sum_{individus}(s-s_{attendu})\cdot f'(h) \cdot x$$+$$da = -\lambda \cdot \frac{d\mathcal{E}}{da} = -\lambda \cdot \sum_{individus}(s-s_{attendu})\cdot f'(h) \cdot x$$
  
 où $\lambda$ est un paramètre qu'il faut ajuster en bricolant un peu -- part de savoir faire... -- et on peut choisir $\lambda = 0,1$ -- l'expérience montre que ça fonctionne bien avec $\lambda = 0,1$. où $\lambda$ est un paramètre qu'il faut ajuster en bricolant un peu -- part de savoir faire... -- et on peut choisir $\lambda = 0,1$ -- l'expérience montre que ça fonctionne bien avec $\lambda = 0,1$.
Ligne 195: Ligne 195:
 ==== Exercice 2 ==== ==== Exercice 2 ====
  
-Dans le fichier ''main2.py''...+Vous pouvez reprendre le chargement de données du fichier précédentIl va falloir le modifier un peu.
  
-  * Écrivez une fonction ''calc_h(x, y, a, b, c)'' qui calcule $h = a\cdot x + b\cdot y + c$ +  - Modifiez le formatage de sorte que pour chaque fleur de ''iris.csv'' on obtienne un tuple ''(x, y, sa)'' où  
-  Écrivez une fonction ''f(h)'' qui calcule $f(h)$ +    ''x'' représente la longueur du pétale 
-  Écrivez une fonction ''fp(h)'' qui calcule $f'(h)$ (je vous laisse déterminer l'expression de $f'$) +    * ''y'' représente la largeur du pétale 
-  Écrivez une fonction ''g(data, a, b, c)''\\ ''data'' représente l'ensemble des données sous la forme ''%%[(x0, y0, sa0), (x1, y1, sa1), ...]%%''\\ J'ai noté ''sa'' pour $s$ attendu, c'est à dire $s_{attendu}$.\\ Cette fonction fait le calcul les trois valeurs et les renvoie :+    * ''sa'' représente le résultat attendu. 1 pour une //Setosa// et 0 sinon. 
 +  - Écrivez une fonction ''calc_h(x, y, a, b, c)'' qui calcule $h = a\cdot x + b\cdot y + c$ 
 +  Écrivez une fonction ''f(h)'' qui calcule $f(h)$ 
 +  Écrivez une fonction ''fp(h)'' qui calcule $f'(h)$ (je vous laisse déterminer l'expression de $f'$) 
 +  Écrivez une fonction ''g(data, a, b, c)''\\ ''data'' représente l'ensemble des données sous la forme ''%%[(x0, y0, sa0), (x1, y1, sa1), ...]%%''\\ Cette fonction fait le calcul les trois valeurs et les renvoie :
     * $g_a = \sum_{individus} (s-s_{attendu})\cdot f'(h) \cdot x$     * $g_a = \sum_{individus} (s-s_{attendu})\cdot f'(h) \cdot x$
     * $g_b = \sum_{individus} (s-s_{attendu})\cdot f'(h) \cdot y$     * $g_b = \sum_{individus} (s-s_{attendu})\cdot f'(h) \cdot y$
     * $g_c = \sum_{individus} (s-s_{attendu})\cdot f'(h)$     * $g_c = \sum_{individus} (s-s_{attendu})\cdot f'(h)$
-  Écrivez une une fonction ''apprentissage(data)'' qui initialise $(a,b,c)$ aléatoirement puis réalise une centaine de fois le calcul :+  Écrivez une une fonction ''apprentissage(data)'' qui initialise $(a,b,c)$ aléatoirement puis réalise une centaine de fois le calcul :
  
 $$(a,b,c) \leftarrow (a -\lambda\cdot g_a, b - \lambda \cdot g_b, c - \lambda\cdot g_c)$$ $$(a,b,c) \leftarrow (a -\lambda\cdot g_a, b - \lambda \cdot g_b, c - \lambda\cdot g_c)$$
Ligne 210: Ligne 214:
 On pourra utiliser une constante ''LAMBDA = 0.1'' On pourra utiliser une constante ''LAMBDA = 0.1''
  
-Le fichier ''main2.py'' contient le gabarit des fonctions à compléter et il contient une partie test qui se charge de produire ''data'' à partir du fichier ''data1.csv'', puis exécute la fonction ''apprentissage'' pour trouver les bonnes valeurs de $(a,b,c)$.+Exécutez le calcul et vérifiez que le triplet $(a, b, c)$ obtenu est valide. 
 + 
 +==== Base d'apprentissage, base de test ==== 
 + 
 +//On peut dire aussi entraînement pour apprentissage.// 
 + 
 +Comme vous l'avez vu, il nous faut un fichier de données pour entraîner notre neurone. 
 + 
 +On souhaite bien-sûr que notre neurone, une fois entraîné, ne fasse pas (ou très peu) d'erreurs sur les items de cette base. 
 + 
 +Mais ça ne suffit pas : nous voulons que le neurone réponde juste pour des items qui n'étaient pas dans la base (sinon quel intérêt ?) 
 + 
 +Pour vérifier que c'est bien le cas, on constitue une base de tests contenant d'autres individusabsents de la base d'apprentissage. On connaît $s_{attendu}pour ces individus et ainsi on peut vérifier que le neurone fait bien ce qu'il devrait.
  
 ===== Réseau ===== ===== Réseau =====
Ligne 258: Ligne 274:
 Ici ''rn'' est l'objet contenant notre réseau de neurones. Ici ''rn'' est l'objet contenant notre réseau de neurones.
  
-Le fichier ''perceptron.py'' vous donne un exemple d'utilisation pour notre exemple avec les iris. Vous pouvez l'ouvrir et l'exécuter.+Voici un exemple que vous pouvez tester. 
 + 
 +<code python> 
 +import csv 
 +from sklearn.linear_model import Perceptron 
 + 
 +with open('iris.csv', encoding='utf8') as file: 
 +    reader = csv.DictReader(file, delimiter=','
 +    X = [] # paires (petal_length, petal_width) 
 +    Y = [] # étiquettes : 1 pour setosa, 0 sinon 
 +    for row in reader: 
 +        l = float(row ["petal_length"]) 
 +        w = float(row ["petal_width"]) 
 +        X.append((l,w)) 
 +        if row['species'] == 'setosa': 
 +            Y.append(1) 
 +        else: 
 +            Y.append(0) 
 + 
 +# création du réseau 
 +rn = Perceptron(tol=1e-3) 
 + 
 +# apprentissage 
 +rn.fit(X, Y) 
 + 
 +# on peut voir ce que prédit notre réseau pour les fleurs du fichier 
 +# on obtient une liste de 0 et de 1 correspondant aux espèces 
 +vous pouvez voir qu'il ne se trompe pas ! 
 +print(rn.predict(X)) 
 +</code> 
 + 
 +Si on veut étendre la prédiction aux virginica et versicolor, le résultat n'est pas bon. Pour mieux faire, on ajoute la prise en compte des sépales. De plus, on n'est pas obligés d'imposer 1 et 0 en sortie. On peut directement indiquer les étiquettes désirées. 
 + 
 +<code python> 
 +import csv 
 +from sklearn.linear_model import Perceptron 
 + 
 +with open('iris.csv', encoding='utf8') as file: 
 +    reader = csv.DictReader(file, delimiter=','
 +    X = [] # paires (petal_length, petal_width) 
 +    Y = [] # étiquettes : 1 pour setosa, 0 sinon 
 +    for row in reader: 
 +        pl = float(row ["petal_length"]) 
 +        pw = float(row ["petal_width"]) 
 +        sl = float(row["sepal_length"]) 
 +        sw = float(row["sepal_width"]) 
 +        X.append((pl, pw, sl, sw)) 
 +        Y.append(row['species']) 
 + 
 +# création du réseau 
 +rn = Perceptron(tol=1e-3) 
 + 
 +# apprentissage 
 +rn.fit(X, Y) 
 + 
 +# on peut voir ce que prédit notre réseau pour les fleurs du fichier 
 +# on obtient une liste de 0 et de 1 correspondant aux espèces 
 +# vous pouvez voir qu'il ne se trompe pas ! 
 +print(rn.predict(X)) 
 + 
 +# et on peut faire un compte des succès : 
 +Yp = rn.predict(X) 
 +count = 0 
 +for i in range(len(Y)): 
 +    if Y[i] == Yp[i]: 
 +       count += 1 
 +print(count/len(Y)) 
 +</code> 
 + 
 +On obtient environ 95 % de succès ! 
 + 
 +Le travail de formatage est un peu fastidieux. On gagne beaucoup de temps en utilisant Pandas. 
 + 
 +<code python> 
 +import pandas 
 +from sklearn.linear_model import Perceptron 
 + 
 +train = pandas.read_csv("iris.csv"
 +rn = Perceptron(tol=1e-3) 
 +X = train[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']] 
 +Y = train['species'
 +rn.fit(X, Y) 
 +print(rn.predict(X)) 
 +</code> 
 + 
 +<WRAP important> 
 +Dans cet exemple, j'utilise ''predict'' sur les individus de la base d'apprentissage. C'est un peu absurde : le perceptron a appris avec ces données, ce n'est pas une prédiction mais une récitation de ce qu'il a appris ! Pour mieux faire, il faudrait proposer constituer un fichier de test avec des iris absentes de la base d'apprentissage. 
 +</WRAP> 
 + 
 +===== Exemples d'applications ===== 
 + 
 +Vous pouvez essayer d'appliquer cette méthode dans le problème du [[nsi:datasets:titanic|Titanic]].
nsi/tds/ia/neurones.1650544324.txt.gz · Dernière modification : de goupillwiki