@ -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_ho t_columns = (
features_to_encode_ wrt_targe t_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_ho t_columns
for col in features_to_encode_ wrt_targe t_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_ho t_columns,
features_to_encode_ wrt_targe t_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 ) ,