Проект по разработке ML-системы для классификации блюд, анализа пищевой ценности ингредиентов и рекомендации рецептов с возможностью генерации сбалансированного дневного меню через CLI-приложение.
В рамках проекта реализован модуль recipes.py, включающий классы для машинного обучения, анализа нутриентов, рекомендаций рецептов и генерации дневного меню, а также CLI-интерфейс nutritionist.py для пользовательского взаимодействия.
Цель проекта — построить прикладную систему, объединяющую:
- ML-классификацию блюда по списку ингредиентов
- Анализ пищевой ценности (в % Daily Value)
- Рекомендательную систему рецептов
- Генерацию сбалансированного дневного меню
- CLI-интерфейс для удобного использования
Проект демонстрирует навыки построения end-to-end ML-pipeline: от подготовки данных и обучения модели до продакшен-логики и пользовательского интерфейса.
Ядро проекта — модуль recipes.py, внутри которого реализованы классы:
ML-модель для классификации блюда по ингредиентам.
Реализовано:
- Загрузка stacking-модели (CatBoost + XGBoost)
- Масштабирование признаков (StandardScaler)
- Label encoding
- Бинарная векторизация ингредиентов
- Обработка ошибок ввода
Классы:
badso-sogreat
Модуль анализа пищевой ценности.
Реализовано:
- Загрузка таблицы %DV по ингредиентам
- Поиск совпадающих ингредиентов
- Вывод нутриентов в формате:
Nutrient — X% of Daily Value
- Обработка отсутствующих ингредиентов
Система рекомендаций рецептов.
Алгоритм:
- Подсчет score на основе совпадений ингредиентов в:
- названии
- поисковом запросе
- Дополнительная сортировка по рейтингу
- Удаление дубликатов
- Формирование Top-3 рекомендаций
Генерация сбалансированного меню на день.
Логика:
- Разделение рецептов на:
- breakfast
- lunch
- dinner
- Подсчет суммарного %DV по всем нутриентам
- Исключение рецептов с превышением 100% по любому нутриенту
- Сортировка по рейтингу и нутриентному покрытию
- Случайный выбор из top-N лучших
Результат — автоматически сформированное дневное меню с:
- ингредиентами
- нутриентами
- ссылкой на рецепт
Файл nutritionist.py реализует два режима работы.
Запуск:
python nutritionist.py chicken, rice, tomatoПример взаимодействия:
I. OUR FORECAST
Nice! That looks like a tasty and promising combination!
-------
II. NUTRITION FACTS
Chicken
Protein - 54% of Daily Value
Iron - 12% of Daily Value
-------
Rice
Carbohydrates - 28% of Daily Value
-------
Tomato
Vitamin C - 21% of Daily Value
------
III. TOP-3 SIMILAR RECIPES:
- Chicken Rice Bowl, rating: 4.6, URL:
https://example.com/recipe1
------
- Tomato Chicken Skillet, rating: 4.4, URL:
https://example.com/recipe2
------
- Healthy Rice & Chicken, rating: 4.2, URL:
https://example.com/recipe3
------
Запуск:
python nutritionist.pyПример взаимодействия:
No ingredients provided.
If you want to search by ingredients: ./nutritionist.py ingredient1, ingredient2, ...
IV. DAILY MENU SUGGESTION
Generating a balanced daily menu based on our full recipe database...
BREAKFAST
------------------------------
Oatmeal with banana (rating: 4.5)
Ingredients:
- oatmeal
- banana
Nutrients:
- fiber: 32.4%
- potassium: 18.1%
URL: https://example.com/breakfast
LUNCH
------------------------------
Grilled chicken salad (rating: 4.7)
Ingredients:
- chicken
- lettuce
- tomato
Nutrients:
- protein: 48.3%
- vitamin C: 22.7%
URL: https://example.com/lunch
DINNER
------------------------------
Baked salmon with vegetables (rating: 4.8)
Ingredients:
- salmon
- broccoli
- carrot
Nutrients:
- protein: 52.1%
- omega-3: 65.4%
URL: https://example.com/dinner
Проблема:
Пользователь вводит ингредиенты в произвольном формате (разный регистр, пробелы, короткие слова, отсутствующие в базе).
Как я решил:
- Привел все ингредиенты к lowercase
- Удалил лишние пробелы
- Сопоставил ввод с
feature_list - Добавил проверку на отсутствие совпадений
- Реализовал выброс
ValueErrorпри некорректном вводе
Это позволило сделать модель устойчивой к некорректным данным.
Проблема:
В названиях рецептов используются разные формулировки (например, "grilled chicken breast" вместо "chicken").
Как я решил:
- Объединил
titleиsearched_query - Разбил текст по запятым и пробелам
- Нормализовал слова
- Фильтровал только известные ингредиенты
Это позволило повысить точность рекомендаций.
Проблема:
Некоторые рецепты превышали 100% по отдельным нутриентам, что нарушало логику "сбалансированного меню".
Как я решил:
- Реализовал подсчет суммарного %DV
- Добавил проверку превышения 100% по каждому нутриенту
- Исключал такие рецепты из кандидатов
- Сортировал оставшиеся по рейтингу и покрытию
В результате меню стало более реалистичным.
Проблема:
Модель обучалась отдельно, но требовалась ее интеграция в прикладной интерфейс.
Как я решил:
- Сериализовал модель через
joblib - Инкапсулировал всю ML-логику в класс
NutritionPredictor - Разделил бизнес-логику и CLI
- Добавил обработку исключений
Это позволило создать полноценное прикладное ML-приложение.
Проблема:
Перебор всех рецептов мог замедлять выполнение.
Как я решил:
- Оптимизировал фильтрацию кандидатов
- Исключал рецепты без совпадений на раннем этапе
- Минимизировал лишние преобразования
- Python 3
- Pandas
- NumPy
- Scikit-learn
- CatBoost
- XGBoost
- Joblib
- CLI (sys.argv)
- Объектно-ориентированное программирование
- Реализована end-to-end ML-система
- Построен CLI-интерфейс
- Реализована рекомендательная логика
- Создан генератор сбалансированного меню
- Продемонстрированы навыки проектирования архитектуры, обработки данных, построения ML-моделей и интеграции их в прикладное приложение