diff --git a/project/README.md b/project/README.md
index 022cbf900711b651653563de9cd44a1641582918..de146aeb37534944e6a66df6e171cdabcf49eb24 100644
--- a/project/README.md
+++ b/project/README.md
@@ -164,6 +164,7 @@ Gray | Canny | HSV | Sobel |
 ![Gray](figures/examples_from_dataset/banana-gray.jpg)  |  ![Canny](figures/examples_from_dataset/banana-edges.jpg) |  ![HSV](figures/examples_from_dataset/banana-hsv.jpg) | ![Sobel](figures/examples_from_dataset/banana-sobel.jpg) |
 
 
+With each filter, the RGB values of the pixels are transformed into a new 1D vector of features. We can not only use one filter at a time but also concatenate the features of different filters to create a new feature vector.
 
 ## Metrics
 
@@ -299,30 +300,43 @@ The CNN model is expected to outperform the baseline models and the basic classi
 
 ### Overview
 
-We have conducted a series of experiments to evaluate the performance of different classifiers on our fruit image classification task. These experiments involve testing various feature combinations, hyperparameters, and picture sizes to identify the optimal model configuration. The results of these experiments are presented below, providing insights into the performance of each classifier and the impact of different configurations on the model's accuracy.
+We have conducted a series of experiments to evaluate the performance of different classifiers on our fruit image classification task. These experiments involve testing various **feature combinations**, **hyperparameters**, and **picture sizes** to identify the optimal model configurations. The results of these experiments are presented below, providing insights into the performance of each classifier and the impact of different configurations on the model's accuracy.
 
-To reproduce the results, please refer to the [README](src/README.md) in the src folder for instructions on how to run the experiments.
+🔍 For our basic classifiers (Naive Bayes, Decision Tree, Random Forest), we have utilized scikit-learn's `GridSearchCV` to optimize the hyperparameters. This approach allows us to systematically test different hyperparameter combinations and identify the best configuration for each classifier. In order to use the development set for hyperparameter tuning, we have used the `PredefinedSplit` function to create a fixed split between the training and development set instead of using a default cross-validation split.
 
-### Feature Engineering
+↪️ To reproduce the results, please refer to the [README](src/README.md) in the `src` folder for instructions on how to run the experiments.
 
-- we are experimenting with different feature combinations, which can be used as an input parameter for our `classify_images.py` script
+### Feature Engineering
 
-| Feature / Filter | Length | Description |
-| ---------------- | ------ | ----------- |
-| `standard` | 7500 | no filters applied, only the raw pixel values (RGB) are used as features |
-| `hsv` | the images are converted to HSV color space and the HSV values are used as features |
-| `sobel` | 7500 | the images are 
+- we have experimented with different filter combinations, which can be used as an input parameter for our [`classify_with_basic_classifiers.py`](src/classify_with_basic_classifiers.py) script
+- see section [Feature Engineering With Filters](#feature-engineering-with-filters) for more details on the filters
+    - `standard` = no filters
+    - `hsv` = HSV color space
+    - `sobel` = Sobel edge detection
+    - `canny` = Canny edge detection
+    - `gray` = Grayscaling
+- we have also experimented with different picture sizes (e.g. 50x50, 100x100, 125x125)
+  - given the high computational cost of training models on large images, we did first experiments to compare the performance of the classifiers on different picture sizes and found that **50x50 images** is a good compromise between the amount of data to be processed and the resulting performance of the models
 
-We have experimented with different sizes and found that 50x50 pixels is a good compromise between the amount of data to be processed and the quality of the images.
 
 ### Naive Bayes
 
+To find the best hyperparameters for the Naive Bayes classifier, we have used the following parameter grid for the grid search, which tests 20 different values for the `var_smoothing` parameter:
 
 ```json
-param_grid = { 'var_smoothing': np.logspace(0,-20, num=20)}
+{ 
+    'var_smoothing': np.logspace(0,-20, num=20)
+}
 ```
+The best accuracy we achieved on the development set was **0.178** with the **HSV + Sobel filters** on 50x50 images. The best parameter for the `var_smoothing` was `4.2 * 10^-8`.
+
+This is still better than our baseline, but the results are not very promising. The classifier is not overfitting, but it is also not learning much.
+
+
+![Naive Bayes Best Parameters](figures/naive_bayes/grid_search_results_50x50_hsv_sobel_var_smoothing_best_params.png)
 
-**Poor results** for all experiments with a Naive Bayes classifier :thumbsdown:. The best results are achieved using the HSV + Sobel filters. The accuracy (0.178) though is still better than our baseline.
+
+The following table shows an excerpt of the feature and size combination used.
 
 | Resized | Features | Accuracy (Dev) | Best Parameters | Comments |
 | ------- | -------- | -------- | --------------- | ---- |
@@ -331,16 +345,16 @@ param_grid = { 'var_smoothing': np.logspace(0,-20, num=20)}
 | 50x50   | HSV only | 0.162 | `{'var_smoothing': 7.0 * 10^-4}` | :arrow_right_hook: [GridSearch results](figures/naive_bayes/grid_search_results_50x50_hsv_var_smoothing.png) and [confusion matrix](figures/naive_bayes/GaussianNB_50x50_hsv_confusion_matrix_var_smoothing_0.0006951927961775605.png)  |
 | 100x100 | No filters | 0.113 | `{'var_smoothing': 5.5 * 10^-6}` | :arrow_right: no improvement with more features; :arrow_right_hook: [GridSearch results](figures/naive_bayes/grid_search_results_100x100_standard_var_smoothing.png) and [confusion matrix](figures/naive_bayes/GaussianNB_100x100_standard_confusion_matrix_var_smoothing_5.455594781168525e-06.png)  |
 
-**Further findings:**:
-- accuracy on the training set is also never higher than 0.20 :arrow_right: the classifier is not overfitting but also not learning anything
 
-![GridSearch](figures/naive_bayes/grid_search_results_50x50_hsv_sobel_var_smoothing.png)
 
-![Confusion Matrix](figures/naive_bayes/GaussianNB_50x50_hsv_sobel_confusion_matrix_var_smoothing_4.281332398719396e-08.png)
-- for some classes, the diagonal is quite bright (e.g. apricots and passion fruits) :arrow_right: the classifier is quite good at predicting these classes
+**Further findings:**
+- accuracy on the training set is also never higher than 0.20 :arrow_right: the classifier is not overfitting but also not learning anything
+- for some classes, the diagonal in the confusion matrix below is quite bright (e.g. apricots and passion fruits) :arrow_right: the classifier is quite good at predicting these classes
 - but we also see that the classifier has a **strong bias** towards some classes (e.g. apricots, jostaberries and passion fruits and figs)
 
-![Naive Bayes Best Parameters](figures/naive_bayes/grid_search_results_50x50_hsv_sobel_var_smoothing_best_params.png)
+<img  align="center" src="figures/naive_bayes/GaussianNB_50x50_hsv_sobel_confusion_matrix_var_smoothing_4.281332398719396e-08.png" alt= "Confusion Matrix" width="80%" height="auto">
+</figure>
+
 
 ### Decision Tree