nsi:tds:ia:neurones
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| nsi:tds:ia:neurones [2022/04/21 14:03] – goupillwiki | nsi:tds:ia:neurones [2022/04/22 11:37] (Version actuelle) – [Module sklearn] goupillwiki | ||
|---|---|---|---|
| Ligne 59: | Ligne 59: | ||
| Dans le fichier {{ : | Dans le fichier {{ : | ||
| - | - En représentant | + | - Exécutez le programme ci-dessous pour afficher |
| - | - Compléter | + | - Déterminez |
| + | - Complétez | ||
| + | - Exécutez la fonction sur l' | ||
| <code python> | <code python> | ||
| - | # code à faire | + | import csv |
| + | import matplotlib.pyplot as plt | ||
| + | |||
| + | # extraction des données du fichier | ||
| + | def formatage(row): | ||
| + | return { | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | } | ||
| + | |||
| + | with open(' | ||
| + | reader = csv.DictReader(file, | ||
| + | data = [formatage(row) for row in reader] | ||
| + | |||
| + | def plot_sub_cloud(species, | ||
| + | """ | ||
| + | Trace le nuage des point d'une certaine espèce | ||
| + | color indique la couleur désirée | ||
| + | """ | ||
| + | x = [item[" | ||
| + | y = [item[" | ||
| + | if len(x) > 0: | ||
| + | plt.scatter(x, | ||
| + | |||
| + | plot_sub_cloud(' | ||
| + | plot_sub_cloud(' | ||
| + | plot_sub_cloud(' | ||
| + | plt.legend() | ||
| + | plt.show() | ||
| </ | </ | ||
| Ligne 130: | Ligne 161: | ||
| La méthode proposée est encore vague : nous devons définir comment on compare $s$ et $s_{attendu}$ et comment cette comparaison modifie les paramètres $a$, $b$ et $c$. | La méthode proposée est encore vague : nous devons définir comment on compare $s$ et $s_{attendu}$ et comment cette comparaison modifie les paramètres $a$, $b$ et $c$. | ||
| - | On commence par choisir une formule pour évaluer l' | + | On commence par choisir une formule pour évaluer l' |
| - | On dira $\mathcal{E} = \frac{1}{2}\sum_{individus} (s-s_{attendu})^2$. | + | $$\mathcal{E} = \frac{1}{2}\sum_{individus} (s-s_{attendu})^2$$ |
| <WRAP tip> | <WRAP tip> | ||
| Ligne 151: | 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} |
| 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' | 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' | ||
| Ligne 164: | Ligne 195: | ||
| ==== Exercice 2 ==== | ==== Exercice 2 ==== | ||
| - | Dans le fichier | + | Vous pouvez reprendre |
| - | * Écrivez une fonction '' | + | |
| - | | + | |
| - | | + | * '' |
| - | | + | * '' |
| + | - Écrivez une fonction '' | ||
| + | | ||
| + | | ||
| + | | ||
| * $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)$ | ||
| - | | + | |
| $$(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 179: | Ligne 214: | ||
| On pourra utiliser une constante '' | On pourra utiliser une constante '' | ||
| - | Le fichier | + | Exécutez le calcul et vérifiez que le triplet $(a, b, c)$ obtenu est valide. |
| + | |||
| + | ==== Base d'apprentissage, | ||
| + | |||
| + | //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 individus, absents de la base d' | ||
| ===== Réseau ===== | ===== Réseau ===== | ||
| Ligne 227: | Ligne 274: | ||
| Ici '' | Ici '' | ||
| - | Le fichier | + | Voici un exemple que vous pouvez tester. |
| + | |||
| + | <code python> | ||
| + | import csv | ||
| + | from sklearn.linear_model import Perceptron | ||
| + | |||
| + | with open('iris.csv', encoding=' | ||
| + | reader = csv.DictReader(file, | ||
| + | X = [] # paires (petal_length, | ||
| + | Y = [] # étiquettes : 1 pour setosa, 0 sinon | ||
| + | for row in reader: | ||
| + | l = float(row [" | ||
| + | w = float(row [" | ||
| + | X.append((l, | ||
| + | if row[' | ||
| + | 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)) | ||
| + | </ | ||
| + | |||
| + | 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 | ||
| + | |||
| + | <code python> | ||
| + | import csv | ||
| + | from sklearn.linear_model import Perceptron | ||
| + | |||
| + | with open(' | ||
| + | reader = csv.DictReader(file, | ||
| + | X = [] # paires (petal_length, | ||
| + | Y = [] # étiquettes : 1 pour setosa, 0 sinon | ||
| + | for row in reader: | ||
| + | pl = float(row [" | ||
| + | pw = float(row [" | ||
| + | sl = float(row[" | ||
| + | sw = float(row[" | ||
| + | X.append((pl, | ||
| + | Y.append(row[' | ||
| + | |||
| + | # création du réseau | ||
| + | rn = Perceptron(tol=1e-3) | ||
| + | |||
| + | # apprentissage | ||
| + | rn.fit(X, Y) | ||
| + | |||
| + | # on peut voir ce que prédit | ||
| + | # 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/ | ||
| + | </ | ||
| + | |||
| + | 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(" | ||
| + | rn = Perceptron(tol=1e-3) | ||
| + | X = train[[' | ||
| + | Y = train[' | ||
| + | rn.fit(X, Y) | ||
| + | print(rn.predict(X)) | ||
| + | </ | ||
| + | |||
| + | <WRAP important> | ||
| + | Dans cet exemple, j' | ||
| + | </ | ||
| + | |||
| + | ===== Exemples d' | ||
| + | |||
| + | Vous pouvez | ||
nsi/tds/ia/neurones.1650542594.txt.gz · Dernière modification : de goupillwiki
