From 3ee22c3f0eb6402bed270552dc9be6d4760f7b23 Mon Sep 17 00:00:00 2001 From: syropiatovvv Date: Wed, 29 Oct 2025 22:45:08 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B8=20=D0=B2=20=D0=B1=D0=BB=D0=BE=D0=BA?= =?UTF-8?q?=D0=BD=D0=BE=D1=82=20research=20(=D0=B4=D0=BE=20MLFlow)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- research/research.py | 58 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/research/research.py b/research/research.py index 14961c5..ce7f827 100644 --- a/research/research.py +++ b/research/research.py @@ -13,6 +13,12 @@ # name: python3 # --- +# %% [markdown] +# # Исследование и настройка предсказательной модели для цен подержанных автомобилях + +# %% [markdown] +# Блокнот использует файл аугментированных данных датасета о подержанных автомобилях, создаваемый блокнотом `eda/cars_eda.py`. См. ниже параметры блокнота для papermill. + # %% from typing import Optional @@ -23,7 +29,9 @@ data_aug_pickle_relpath: str = 'cars.aug.pickle' # Путь к файлу (pickle) для сохранения очищенного датасета относительно директории данных `data`. Игнорируется, если установлен data_aug_pickle_path. mlflow_tracking_server_uri: str = 'http://localhost:5000' +# URL tracking сервера MLFlow mlflow_registry_uri: Optional[str] = None +# URL сервера registry MLFlow (если не указан, используется `mlflow_tracking_server_uri`) mlflow_experiment_name: str = 'Current price predicion for used cars' mlflow_experiment_new: bool = False @@ -60,6 +68,9 @@ DATA_PATH = ( else (BASE_PATH / 'data') ) +# %% [markdown] +# ## Загрузка и обзор данных + # %% with open( ( @@ -71,15 +82,30 @@ with open( ) as input_file: df_orig = pickle.load(input_file) +# %% [markdown] +# Обзор строк датасета: + # %% df_orig.head(0x10) +# %% [markdown] +# Размер датасета: + # %% len(df_orig) +# %% [markdown] +# Количество непустых значений и тип каждого столбца: + # %% df_orig.info() +# %% [markdown] +# ## Разделение датасета на выборки + +# %% [markdown] +# Выделение признаков и целевых переменных: + # %% feature_columns = ( 'selling_price', @@ -106,7 +132,7 @@ assert all( for col in features_to_scale_to_standard_columns ) -features_to_encode_one_hot_columns = ( +features_to_encode_wrt_target_columns = ( 'fuel_type', 'selling_type', 'transmission', @@ -114,13 +140,16 @@ features_to_encode_one_hot_columns = ( ) assert all( (col in df_orig.select_dtypes(('category', 'object')).columns) - for col in features_to_encode_one_hot_columns + for col in features_to_encode_wrt_target_columns ) # %% df_orig_features = df_orig[list(feature_columns)] df_target = df_orig[list(target_columns)] +# %% [markdown] +# Разделение на обучающую и тестовую выборки: + # %% DF_TEST_PORTION = 0.25 @@ -131,9 +160,18 @@ df_orig_features_train, df_orig_features_test, df_target_train, df_target_test = ) ) +# %% [markdown] +# Размеры обучающей и тестовой выборки соответственно: + # %% tuple(map(len, (df_target_train, df_target_test))) +# %% [markdown] +# ## Создание пайплайнов обработки признаков и обучения модели + +# %% [markdown] +# Пайплайн предобработки признаков: + # %% preprocess_transformer = sklearn.compose.ColumnTransformer( [ @@ -143,19 +181,25 @@ preprocess_transformer = sklearn.compose.ColumnTransformer( 'encode_categoricals_wrt_target', #sklearn.preprocessing.OneHotEncoder(), sklearn.preprocessing.TargetEncoder( - target_type='continuous', smooth='auto', cv=3, shuffle=True, random_state=0x2ED6, + target_type='continuous', smooth='auto', shuffle=True, random_state=0x2ED6, ), - features_to_encode_one_hot_columns, + features_to_encode_wrt_target_columns, ), ], remainder='drop', ) +# %% [markdown] +# Регрессор — небольшой случайный лес, цель — минимизация квадрата ошибки предсказания: + # %% regressor = sklearn.ensemble.RandomForestRegressor( 10, criterion='squared_error', max_features='sqrt', random_state=0x016B, ) +# %% [markdown] +# Составной пайплайн: + # %% pipeline = sklearn.pipeline.Pipeline([ ('preprocess', preprocess_transformer), @@ -165,12 +209,18 @@ pipeline = sklearn.pipeline.Pipeline([ # %% pipeline +# %% [markdown] +# ## Baseline модель + # %% _ = pipeline.fit(df_orig_features_train, df_target_train.iloc[:, 0]) # %% target_test_predicted = pipeline.predict(df_orig_features_test) +# %% [markdown] +# Метрики качества (MAPE, а также MSE, MAE): + # %% metrics = { 'mse': sklearn.metrics.mean_squared_error(df_target_test, target_test_predicted),