Added automizing for laptops

This commit is contained in:
Артём Алейкин 2024-12-11 00:28:32 +04:00
parent d5184e4419
commit 920c3d4831
4 changed files with 41 additions and 13 deletions

View File

@ -62,7 +62,7 @@ def get_unique_laptops():
raise HTTPException(status_code=400, detail=str(e)) raise HTTPException(status_code=400, detail=str(e))
@router.get('/get_unique_data_tv', summary="Get unique data for tvs species") @router.get('/get_unique_data_tv', summary="Get unique data for tvs species")
def get_unique_laptops(): def get_unique_tvs():
try: try:
return tv_service.get_unique_data() return tv_service.get_unique_data()
except Exception as e: except Exception as e:

Binary file not shown.

View File

@ -10,7 +10,7 @@ import json
import os import os
# Шаг 1: Загрузка данных # Шаг 1: Загрузка данных
df = pd.read_csv('../../../../datasets/laptops.csv') df = pd.read_csv('datasets/laptops.csv')
# Шаг 2: Проверка и очистка имен столбцов # Шаг 2: Проверка и очистка имен столбцов
df.columns = df.columns.str.strip().str.lower() 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) os.makedirs(output_dir, exist_ok=True)
with open(os.path.join(output_dir, 'unique_values_laptop.json'), 'w', encoding='utf-8') as f: 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: Предсказания и оценка # Шаг 12: Предсказания и оценка
y_pred = best_model.predict(X_test) 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: Сохранение модели # Шаг 13: Сохранение модели
feature_columns = X.columns.tolist() feature_columns = X.columns.tolist()
joblib.dump(feature_columns, '../../laptopML/feature_columns.pkl') joblib.dump(feature_columns, 'services/ml/laptopML/feature_columns.pkl')
joblib.dump(best_model, '../../laptopML/laptop_price_model.pkl') joblib.dump(best_model, 'services/ml/laptopML/laptop_price_model.pkl')
joblib.dump(poly, '../../laptopML/poly_transformer.pkl') joblib.dump(poly, 'services/ml/laptopML/poly_transformer.pkl')
joblib.dump(scaler, '../../laptopML/scaler.pkl') joblib.dump(scaler, 'services/ml/laptopML/scaler.pkl')
print("Модель, трансформер и скейлер сохранены.") print("Модель, трансформер и скейлер сохранены.")
# Шаг 15: Важность признаков # Шаг 15: Важность признаков

View File

@ -1,11 +1,21 @@
import subprocess
import pandas as pd import pandas as pd
import joblib import joblib
import json import json
import os
from typing import List, Dict from typing import List, Dict
from schemas.schemas import LaptopCreate, LaptopResponse, PredictPriceResponse from schemas.schemas import LaptopCreate, LaptopResponse, PredictPriceResponse
class LaptopService: class LaptopService:
def __init__(self, model_path: str, feature_columns_path: str, poly_path: str, scaler_path: str): 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: try:
self.model = joblib.load(model_path) self.model = joblib.load(model_path)
except FileNotFoundError: except FileNotFoundError:
@ -28,6 +38,29 @@ class LaptopService:
except Exception as e: except Exception as e:
raise Exception(f"Error loading polynomial transformer or scaler: {str(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: def predict_price(self, data: Dict[str, any]) -> PredictPriceResponse:
# Преобразование данных в DataFrame # Преобразование данных в DataFrame
input_df = pd.DataFrame([data]) input_df = pd.DataFrame([data])