Skip to content

Commit

Permalink
Modification naive_bayes (to include np array) and overfitting continued
Browse files Browse the repository at this point in the history
  • Loading branch information
Fitzwilliam Darcy authored and Fitzwilliam Darcy committed Jan 25, 2024
1 parent bb069a3 commit ebdb2df
Show file tree
Hide file tree
Showing 8 changed files with 308 additions and 44 deletions.
44 changes: 44 additions & 0 deletions report/over_training.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
## 3.1 Phénomène de sur-apprentissage

Dans cette partie, nous allons voir les problèmes de sur-apprentissage du modèle de régression logistique multinomial.

Le phénomène de sur-apprentissage est lorsque le modèle entraîné s'adapte trop bien aux données d'apprentissage, donnant ainsi de moins bons résultats sur des données de test.
En effet, en s'adaptant trop aux données d'apprentissage, le modèle va s'entrainer aux données d'apprentissage, mais également au bruit de ces données.
Ce qui fait que le modèle ne pourra pas donner de bons résultats pour des données de test, car il aura été entraîné au bruit des données d'apprentissage.

Afin d'observer ce phénomène, on a décidé de faire varier le volume de données d'entrainement, et ensuite de regarder les performances du modèle sur les données d'entrainement et de test.

Lorsqu'on a peu de données, les résultats peuvent varier beaucoup.
Cela doit être dû à la prise aléatoire du bon pourcentage de données parmi les données d'entrainement.
Une approximation des résultats est donc faite, permettant de mieux visualiser ce qui se passe.

On a fait une approximation logarithmique de cette façon:

```python

a, b = np.polyfit(x, np.log(y), 1)
plt.plot(x, a * np.log(y) + b)
```

Ainsi, on obtient les résultats suivants:

![](../res/over_training.png)

On peut observer sur ce graphique que pour un volume trop petit de données, le modèle est trop entrainé pour les données d'entrainement.
En effet, on peut constater que les performances sont plus grandes pour les données d'entrainement, plutôt que pour les données de test.

Si on entraîne un modèle avec seulement 10% des données d'entrainement, on obtient le graphique suivant:

![](../res/over_training_1.png)

On peut observer que les performances sur les données d'entrainement sont plus grandes que sur les données de test.

Cependant, si on entraîne le modèle avec 100% des données d'entrainement, on obtient le graphique suivant:

![](../res/over_training_2.png)

On peut alors remarquer que les performances du modèle sont moins bonnes sur les données d'entraînement, plutôt que sur les données de test.
Le modèle n'a donc pas entraîné le bruit des données d'entrainement.

Donc si on n'a pas assez de données d'entrainement, les performances du modèle entraîné seront mauvaises, car celui-ci sera entraîné juste pour les données d'entrainement.

Binary file added report/over_training.pdf
Binary file not shown.
Binary file added res/over_training.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added res/over_training_1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added res/over_training_2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 5 additions & 2 deletions src/naive_bayes.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,11 @@ def get_distrib_parameters(features: DataFrame, labels) -> dict[Any, list[tuple[
out_classv = [] # list of (mean, std) for each feature by class value
data_c = features[labels == classv] # data for current class
for feature in data_c:
feat = data_c[feature]
mean, std = feat.mean(), feat.std()
if isinstance(features, np.ndarray):
mean, std = feature.mean(), feature.std()
else:
feat = data_c[feature]
mean, std = feat.mean(), feat.std()
out_classv.append((f32(mean), f32(std)))
out[classv] = out_classv

Expand Down
300 changes: 258 additions & 42 deletions src/over_training.py

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions src/softmax.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ def f(labels: np.ndarray, y: np.ndarray) -> np.ndarray:
"""
if not isinstance(labels, np.ndarray):
labels = np.asarray(labels)
assert y.dtype == int, "Labels must be integer !"
result = np.zeros((len(y), len(labels)))
for i in range(len(y)):
result[i, y[i]] = 1
Expand Down

0 comments on commit ebdb2df

Please sign in to comment.