комментарии в блокнот research (до MLFlow)

lab_2/master
syropiatovvv 7 дней назад
Родитель af9340eda2
Сommit 3ee22c3f0e
Подписано: syropiatovvv
Идентификатор GPG ключа: 297380B8143A31BD

@ -13,6 +13,12 @@
# name: python3 # name: python3
# --- # ---
# %% [markdown]
# # Исследование и настройка предсказательной модели для цен подержанных автомобилях
# %% [markdown]
# Блокнот использует файл аугментированных данных датасета о подержанных автомобилях, создаваемый блокнотом `eda/cars_eda.py`. См. ниже параметры блокнота для papermill.
# %% # %%
from typing import Optional from typing import Optional
@ -23,7 +29,9 @@ data_aug_pickle_relpath: str = 'cars.aug.pickle'
# Путь к файлу (pickle) для сохранения очищенного датасета относительно директории данных `data`. Игнорируется, если установлен data_aug_pickle_path. # Путь к файлу (pickle) для сохранения очищенного датасета относительно директории данных `data`. Игнорируется, если установлен data_aug_pickle_path.
mlflow_tracking_server_uri: str = 'http://localhost:5000' mlflow_tracking_server_uri: str = 'http://localhost:5000'
# URL tracking сервера MLFlow
mlflow_registry_uri: Optional[str] = None 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_name: str = 'Current price predicion for used cars'
mlflow_experiment_new: bool = False mlflow_experiment_new: bool = False
@ -60,6 +68,9 @@ DATA_PATH = (
else (BASE_PATH / 'data') else (BASE_PATH / 'data')
) )
# %% [markdown]
# ## Загрузка и обзор данных
# %% # %%
with open( with open(
( (
@ -71,15 +82,30 @@ with open(
) as input_file: ) as input_file:
df_orig = pickle.load(input_file) df_orig = pickle.load(input_file)
# %% [markdown]
# Обзор строк датасета:
# %% # %%
df_orig.head(0x10) df_orig.head(0x10)
# %% [markdown]
# Размер датасета:
# %% # %%
len(df_orig) len(df_orig)
# %% [markdown]
# Количество непустых значений и тип каждого столбца:
# %% # %%
df_orig.info() df_orig.info()
# %% [markdown]
# ## Разделение датасета на выборки
# %% [markdown]
# Выделение признаков и целевых переменных:
# %% # %%
feature_columns = ( feature_columns = (
'selling_price', 'selling_price',
@ -106,7 +132,7 @@ assert all(
for col in features_to_scale_to_standard_columns for col in features_to_scale_to_standard_columns
) )
features_to_encode_one_hot_columns = ( features_to_encode_wrt_target_columns = (
'fuel_type', 'fuel_type',
'selling_type', 'selling_type',
'transmission', 'transmission',
@ -114,13 +140,16 @@ features_to_encode_one_hot_columns = (
) )
assert all( assert all(
(col in df_orig.select_dtypes(('category', 'object')).columns) (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_orig_features = df_orig[list(feature_columns)]
df_target = df_orig[list(target_columns)] df_target = df_orig[list(target_columns)]
# %% [markdown]
# Разделение на обучающую и тестовую выборки:
# %% # %%
DF_TEST_PORTION = 0.25 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))) tuple(map(len, (df_target_train, df_target_test)))
# %% [markdown]
# ## Создание пайплайнов обработки признаков и обучения модели
# %% [markdown]
# Пайплайн предобработки признаков:
# %% # %%
preprocess_transformer = sklearn.compose.ColumnTransformer( preprocess_transformer = sklearn.compose.ColumnTransformer(
[ [
@ -143,19 +181,25 @@ preprocess_transformer = sklearn.compose.ColumnTransformer(
'encode_categoricals_wrt_target', 'encode_categoricals_wrt_target',
#sklearn.preprocessing.OneHotEncoder(), #sklearn.preprocessing.OneHotEncoder(),
sklearn.preprocessing.TargetEncoder( 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', remainder='drop',
) )
# %% [markdown]
# Регрессор — небольшой случайный лес, цель — минимизация квадрата ошибки предсказания:
# %% # %%
regressor = sklearn.ensemble.RandomForestRegressor( regressor = sklearn.ensemble.RandomForestRegressor(
10, criterion='squared_error', max_features='sqrt', random_state=0x016B, 10, criterion='squared_error', max_features='sqrt', random_state=0x016B,
) )
# %% [markdown]
# Составной пайплайн:
# %% # %%
pipeline = sklearn.pipeline.Pipeline([ pipeline = sklearn.pipeline.Pipeline([
('preprocess', preprocess_transformer), ('preprocess', preprocess_transformer),
@ -165,12 +209,18 @@ pipeline = sklearn.pipeline.Pipeline([
# %% # %%
pipeline pipeline
# %% [markdown]
# ## Baseline модель
# %% # %%
_ = pipeline.fit(df_orig_features_train, df_target_train.iloc[:, 0]) _ = pipeline.fit(df_orig_features_train, df_target_train.iloc[:, 0])
# %% # %%
target_test_predicted = pipeline.predict(df_orig_features_test) target_test_predicted = pipeline.predict(df_orig_features_test)
# %% [markdown]
# Метрики качества (MAPE, а также MSE, MAE):
# %% # %%
metrics = { metrics = {
'mse': sklearn.metrics.mean_squared_error(df_target_test, target_test_predicted), 'mse': sklearn.metrics.mean_squared_error(df_target_test, target_test_predicted),

Загрузка…
Отмена
Сохранить