diff --git a/controllers/controller.py b/controllers/controller.py index 3c70c33..2756fe7 100644 --- a/controllers/controller.py +++ b/controllers/controller.py @@ -62,8 +62,8 @@ def get_unique_laptops(): raise HTTPException(status_code=400, detail=str(e)) @router.get('/get_unique_data_tv', summary="Get unique data for tvs species") -def get_unique_laptops(): +def get_unique_tvs(): try: return tv_service.get_unique_data() except Exception as e: - raise HTTPException(status_code=400, detail=str(e)) \ No newline at end of file + raise HTTPException(status_code=400, detail=str(e)) diff --git a/requirements.txt b/requirements.txt index ded3bf3..675c782 100644 Binary files a/requirements.txt and b/requirements.txt differ diff --git a/services/ml/scripts/modelBuilders/modelBuilderLaptop.py b/services/ml/scripts/modelBuilders/modelBuilderLaptop.py index 562a03e..9a557d7 100644 --- a/services/ml/scripts/modelBuilders/modelBuilderLaptop.py +++ b/services/ml/scripts/modelBuilders/modelBuilderLaptop.py @@ -10,7 +10,7 @@ import json import os # Шаг 1: Загрузка данных -df = pd.read_csv('../../../../datasets/laptops.csv') +df = pd.read_csv('datasets/laptops.csv') # Шаг 2: Проверка и очистка имен столбцов df.columns = df.columns.str.strip().str.lower() @@ -95,7 +95,7 @@ unique_values = { } # Создание директории, если она не существует -output_dir = 'columns' +output_dir = 'services/ml/scripts/modelBuilders/columns' os.makedirs(output_dir, exist_ok=True) with open(os.path.join(output_dir, 'unique_values_laptop.json'), 'w', encoding='utf-8') as f: @@ -139,18 +139,13 @@ best_model = grid_search.best_estimator_ # Шаг 12: Предсказания и оценка y_pred = best_model.predict(X_test) -mae = mean_absolute_error(y_test, y_pred) -rmse = mean_squared_error(y_test, y_pred, squared=False) -r2 = r2_score(y_test, y_pred) -print(f"Лучшие параметры: {grid_search.best_params_}") -print(f"Random Forest - MAE: {mae}, RMSE: {rmse}, R²: {r2}") # Шаг 13: Сохранение модели feature_columns = X.columns.tolist() -joblib.dump(feature_columns, '../../laptopML/feature_columns.pkl') -joblib.dump(best_model, '../../laptopML/laptop_price_model.pkl') -joblib.dump(poly, '../../laptopML/poly_transformer.pkl') -joblib.dump(scaler, '../../laptopML/scaler.pkl') +joblib.dump(feature_columns, 'services/ml/laptopML/feature_columns.pkl') +joblib.dump(best_model, 'services/ml/laptopML/laptop_price_model.pkl') +joblib.dump(poly, 'services/ml/laptopML/poly_transformer.pkl') +joblib.dump(scaler, 'services/ml/laptopML/scaler.pkl') print("Модель, трансформер и скейлер сохранены.") # Шаг 15: Важность признаков diff --git a/services/service.py b/services/service.py index 2c37d83..852f47a 100644 --- a/services/service.py +++ b/services/service.py @@ -1,11 +1,21 @@ +import subprocess import pandas as pd import joblib import json +import os from typing import List, Dict from schemas.schemas import LaptopCreate, LaptopResponse, PredictPriceResponse class LaptopService: def __init__(self, model_path: str, feature_columns_path: str, poly_path: str, scaler_path: str): + self.script_path = "services/ml/scripts/modelBuilders/modelBuilderLaptop.py" + + # Проверка наличия модели, если её нет — создание + if not os.path.exists(model_path) or not os.path.exists(feature_columns_path) or not os.path.exists(poly_path) or not os.path.exists(scaler_path): + print("Необходимые файлы модели отсутствуют. Запускаем построение модели...") + self.run_model_builder() + + # Загрузка модели и связанных файлов try: self.model = joblib.load(model_path) except FileNotFoundError: @@ -28,6 +38,29 @@ class LaptopService: except Exception as e: raise Exception(f"Error loading polynomial transformer or scaler: {str(e)}") + def run_model_builder(self): + # Убедитесь, что путь к скрипту корректен + if not os.path.exists(self.script_path): + raise FileNotFoundError(f"Скрипт {self.script_path} не найден.") + + try: + print(f"Запускаем скрипт {self.script_path} для создания модели...") + result = subprocess.run( + ['python', self.script_path], + stdout=subprocess.PIPE, # Перенаправляем stdout + stderr=subprocess.PIPE, # Перенаправляем stderr + text=True # Декодируем вывод в текст + ) + + if result.returncode != 0: + raise Exception(f"Ошибка выполнения скрипта: {result.stderr}") + else: + print("Модель успешно создана.") + print(result.stdout) + + except Exception as e: + raise Exception(f"Не удалось выполнить скрипт: {str(e)}") + def predict_price(self, data: Dict[str, any]) -> PredictPriceResponse: # Преобразование данных в DataFrame input_df = pd.DataFrame([data])