mirror of
https://github.com/Hestia-Homes/ML.git
synced 2026-06-30 13:10:43 +00:00
Merge branch 'master' of github.com:Hestia-Homes/ML into heat-dev-model
This commit is contained in:
commit
f4f8dc2bf2
17 changed files with 73 additions and 126 deletions
2
.github/workflows/Deploy.yml
vendored
2
.github/workflows/Deploy.yml
vendored
|
|
@ -2,7 +2,7 @@ name: Sap Change Model Deploy
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ sap-dev, sap-prod ]
|
branches: [ sap-dev, sap-prod, heat-dev, heat-prod, carbon-dev, carbon-prod]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
|
|
|
||||||
31
.github/workflows/MLPipelinePostMerge.yml
vendored
31
.github/workflows/MLPipelinePostMerge.yml
vendored
|
|
@ -42,7 +42,14 @@ jobs:
|
||||||
if [ -z "${latest_version}" ]; then
|
if [ -z "${latest_version}" ]; then
|
||||||
increment_version="1.0.0"
|
increment_version="1.0.0"
|
||||||
else
|
else
|
||||||
increment_version=$(echo ${latest_version} | awk -F'.' '{OFS="."; $1+=1; print}')
|
increment_version=$(echo ${latest_version} | awk 'BEGIN {
|
||||||
|
FS="\\." # Set the field separator to a period
|
||||||
|
OFS="." # Set the output field separator to a period
|
||||||
|
}
|
||||||
|
{
|
||||||
|
major = $1 + 1 # Increment the major version
|
||||||
|
print major, "0", "0" # Print the new version
|
||||||
|
}')
|
||||||
fi
|
fi
|
||||||
|
|
||||||
new_tag=${REGISTER_MODEL_NAME}@v${increment_version}
|
new_tag=${REGISTER_MODEL_NAME}@v${increment_version}
|
||||||
|
|
@ -80,7 +87,14 @@ jobs:
|
||||||
if [ -z "${latest_version}" ]; then
|
if [ -z "${latest_version}" ]; then
|
||||||
increment_version="0.1.0"
|
increment_version="0.1.0"
|
||||||
else
|
else
|
||||||
increment_version=$(echo ${latest_version} | awk 'BEGIN{FS=OFS="."} {$2++; print}')
|
increment_version=$(echo ${latest_version} | awk 'BEGIN {
|
||||||
|
FS="\\." # Set the field separator to a period
|
||||||
|
OFS="." # Set the output field separator to a period
|
||||||
|
}
|
||||||
|
{
|
||||||
|
minor = $2 + 1 # Increment the minor version
|
||||||
|
print $1, minor, "0" # Print the new version
|
||||||
|
}')
|
||||||
fi
|
fi
|
||||||
|
|
||||||
new_tag=${REGISTER_MODEL_NAME}@v${increment_version}
|
new_tag=${REGISTER_MODEL_NAME}@v${increment_version}
|
||||||
|
|
@ -118,7 +132,14 @@ jobs:
|
||||||
if [ -z "${latest_version}" ]; then
|
if [ -z "${latest_version}" ]; then
|
||||||
increment_version="0.0.1"
|
increment_version="0.0.1"
|
||||||
else
|
else
|
||||||
increment_version=$(echo ${latest_version} | awk 'BEGIN{FS=OFS="."} {$3++; print}')
|
increment_version=$(echo ${latest_version} | awk 'BEGIN {
|
||||||
|
FS="\\." # Set the field separator to a period
|
||||||
|
OFS="." # Set the output field separator to a period
|
||||||
|
}
|
||||||
|
{
|
||||||
|
patch = $3 + 1 # Increment the patch version
|
||||||
|
print $1, $2, patch # Print the new version
|
||||||
|
}')
|
||||||
fi
|
fi
|
||||||
|
|
||||||
new_tag=${REGISTER_MODEL_NAME}@v${increment_version}
|
new_tag=${REGISTER_MODEL_NAME}@v${increment_version}
|
||||||
|
|
@ -188,7 +209,7 @@ jobs:
|
||||||
git config user.name "Github-Bot"
|
git config user.name "Github-Bot"
|
||||||
git config user.email "Github-Bot@no-reply.com"
|
git config user.email "Github-Bot@no-reply.com"
|
||||||
|
|
||||||
latest_dev_version=$(gto history ${REGISTER_MODEL_NAME} --asc --plain | awk '{print $NF}' | awk '/dev/')
|
latest_dev_version=$(gto history ${REGISTER_MODEL_NAME} --asc --plain | awk '{print $NF}' | awk '/dev/' | awk 'END {print}')
|
||||||
if [ -z "${latest_dev_version}" ]; then
|
if [ -z "${latest_dev_version}" ]; then
|
||||||
increment_version="1"
|
increment_version="1"
|
||||||
else
|
else
|
||||||
|
|
@ -196,7 +217,7 @@ jobs:
|
||||||
fi
|
fi
|
||||||
|
|
||||||
new_tag=${REGISTER_MODEL_NAME}#dev#${increment_version}
|
new_tag=${REGISTER_MODEL_NAME}#dev#${increment_version}
|
||||||
latest_version=$(gto show model@latest --ref | awk -F"@" '{print $2}')
|
latest_version=$(gto show ${REGISTER_MODEL_NAME}@latest --ref | awk -F"@" '{print $2}')
|
||||||
|
|
||||||
echo ${new_tag}
|
echo ${new_tag}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,17 @@
|
||||||
"active": true
|
"active": true
|
||||||
},
|
},
|
||||||
"sap": {
|
"sap": {
|
||||||
"version": "v0.0.3",
|
"version": "v0.1.0",
|
||||||
"stage": {
|
"stage": {
|
||||||
"dev": "v0.0.3"
|
"dev": "v0.1.0"
|
||||||
|
},
|
||||||
|
"registered": true,
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"heat": {
|
||||||
|
"version": "v0.0.1",
|
||||||
|
"stage": {
|
||||||
|
"dev": "v0.0.1"
|
||||||
},
|
},
|
||||||
"registered": true,
|
"registered": true,
|
||||||
"active": true
|
"active": true
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,9 @@ tracking and a model registry
|
||||||
- A bolt-on service that can implement model monitoring
|
- A bolt-on service that can implement model monitoring
|
||||||
|
|
||||||
There are multiple protected branches which adapt the generic pipeline to produce different models:
|
There are multiple protected branches which adapt the generic pipeline to produce different models:
|
||||||
- sap_change-**
|
- sap-{dev/staging/prod}-**
|
||||||
- heat_change-**
|
- heat-{dev/staging/prod}-**
|
||||||
- carbon_change-**
|
- carbon-{dev/staging/prod}-**
|
||||||
|
|
||||||
These branches will differ by the configuration files that define the data used and the outputs of the ML-pipeline
|
These branches will differ by the configuration files that define the data used and the outputs of the ML-pipeline
|
||||||
- There can be different additional logic for each branch but the pipeline will be the same.
|
- There can be different additional logic for each branch but the pipeline will be the same.
|
||||||
|
|
|
||||||
|
|
@ -69,9 +69,7 @@ def handler(event, context):
|
||||||
|
|
||||||
storage_filepath = f"s3://{PREDICTIONS_BUCKET}/{portfolio_id}/{property_id}/{created_at}.parquet"
|
storage_filepath = f"s3://{PREDICTIONS_BUCKET}/{portfolio_id}/{property_id}/{created_at}.parquet"
|
||||||
|
|
||||||
logger.info("-------------------------")
|
|
||||||
logger.info(f"--- Initiate MLModel ---")
|
logger.info(f"--- Initiate MLModel ---")
|
||||||
logger.info("-------------------------")
|
|
||||||
|
|
||||||
build_model_params = settings.build_model
|
build_model_params = settings.build_model
|
||||||
client_params = settings.client
|
client_params = settings.client
|
||||||
|
|
@ -80,17 +78,13 @@ def handler(event, context):
|
||||||
|
|
||||||
model = model_factory(build_model_params["model_type"])
|
model = model_factory(build_model_params["model_type"])
|
||||||
|
|
||||||
logger.info("----------------------------")
|
|
||||||
logger.info(f"--- Initiate Input DataClient ---")
|
logger.info(f"--- Initiate Input DataClient ---")
|
||||||
logger.info("----------------------------")
|
|
||||||
input_dataclient = dataclient_factory(
|
input_dataclient = dataclient_factory(
|
||||||
dataclient_type="aws-s3",
|
dataclient_type="aws-s3",
|
||||||
dataclient_config=client_params["aws-s3"],
|
dataclient_config=client_params["aws-s3"],
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("----------------------------")
|
|
||||||
logger.info(f"--- Initiate Output DataClient ---")
|
logger.info(f"--- Initiate Output DataClient ---")
|
||||||
logger.info("----------------------------")
|
|
||||||
output_dataclient = dataclient_factory(
|
output_dataclient = dataclient_factory(
|
||||||
dataclient_type="aws-s3",
|
dataclient_type="aws-s3",
|
||||||
dataclient_config=client_params["aws-s3"],
|
dataclient_config=client_params["aws-s3"],
|
||||||
|
|
@ -107,6 +101,7 @@ def handler(event, context):
|
||||||
predictions_column_name=generate_predictions_params[
|
predictions_column_name=generate_predictions_params[
|
||||||
"predictions_column_name"
|
"predictions_column_name"
|
||||||
],
|
],
|
||||||
|
identifier_column=generate_predictions_params["identifier_column"],
|
||||||
)
|
)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
|
|
@ -9,16 +9,16 @@ init: dev-conda
|
||||||
.PHONY: dev-conda
|
.PHONY: dev-conda
|
||||||
dev-conda:
|
dev-conda:
|
||||||
# conda deactivate || echo "Not in conda environment"
|
# conda deactivate || echo "Not in conda environment"
|
||||||
# conda remove --name $CONDA_ENV --all -y || echo "No environment created previously"
|
# conda remove --name ${CONDA_ENV} --all -y || echo "No environment created previously"
|
||||||
conda create --name $CONDA_ENV python=$(PYTHON_VERSION) -y
|
conda create --name ${CONDA_ENV} python=$(PYTHON_VERSION) -y
|
||||||
conda init bash
|
conda init bash
|
||||||
conda run -vvvv -n $CONDA_ENV pip install --upgrade pip
|
conda run -v -n ${CONDA_ENV} pip install --upgrade pip
|
||||||
conda run -vvvv -n $CONDA_ENV pip install -r src/pipeline/requirements/training/requirements-dev.txt
|
conda run -v -n ${CONDA_ENV} pip install -r src/pipeline/requirements/training/requirements-dev.txt
|
||||||
conda run -vvvv -n $CONDA_ENV pip install -r src/pipeline/requirements/version_control/requirements.txt
|
conda run -v -n ${CONDA_ENV} pip install -r src/pipeline/requirements/version_control/requirements.txt
|
||||||
conda run -vvvv -n $CONDA_ENV pre-commit install
|
conda run -v -n ${CONDA_ENV} pre-commit install
|
||||||
conda run -vvvv -n $CONDA_ENV pip install ipykernel
|
conda run -v -n ${CONDA_ENV} pip install ipykernel
|
||||||
echo "TO ACTIVATE ENVIRONMENT, USE THE FOLLOWING COMMAND"
|
echo "TO ACTIVATE ENVIRONMENT, USE THE FOLLOWING COMMAND"
|
||||||
echo "conda activate $CONDA_ENV"
|
echo "conda activate ${CONDA_ENV}"
|
||||||
|
|
||||||
|
|
||||||
.PHONY: dev-pyenv
|
.PHONY: dev-pyenv
|
||||||
|
|
|
||||||
|
|
@ -16,13 +16,9 @@ def run_cleanup(artefacts_directory: str, metrics_directory: str) -> None:
|
||||||
Remove the directory where artefacts are stored
|
Remove the directory where artefacts are stored
|
||||||
"""
|
"""
|
||||||
|
|
||||||
logger.info("---------------------")
|
|
||||||
logger.info(f"--- Run Clean up ---")
|
logger.info(f"--- Run Clean up ---")
|
||||||
logger.info("---------------------")
|
|
||||||
|
|
||||||
logger.info("-------------------------")
|
|
||||||
logger.info(f"--- Delete artefacts ---")
|
logger.info(f"--- Delete artefacts ---")
|
||||||
logger.info("-------------------------")
|
|
||||||
|
|
||||||
artefact_directory_path = Path(artefacts_directory)
|
artefact_directory_path = Path(artefacts_directory)
|
||||||
|
|
||||||
|
|
@ -31,9 +27,7 @@ def run_cleanup(artefacts_directory: str, metrics_directory: str) -> None:
|
||||||
logger.info(f"Removing the directory: {artefacts_directory}")
|
logger.info(f"Removing the directory: {artefacts_directory}")
|
||||||
shutil.rmtree(artefact_directory_path)
|
shutil.rmtree(artefact_directory_path)
|
||||||
|
|
||||||
logger.info("-----------------------")
|
|
||||||
logger.info(f"--- Delete metrics ---")
|
logger.info(f"--- Delete metrics ---")
|
||||||
logger.info("-----------------------")
|
|
||||||
|
|
||||||
metrics_directory_path = Path(metrics_directory)
|
metrics_directory_path = Path(metrics_directory)
|
||||||
|
|
||||||
|
|
@ -45,15 +39,11 @@ def run_cleanup(artefacts_directory: str, metrics_directory: str) -> None:
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
||||||
logger.info("----------------------------")
|
|
||||||
logger.info(f"--- {__file__} - Start! ---")
|
logger.info(f"--- {__file__} - Start! ---")
|
||||||
logger.info("----------------------------")
|
|
||||||
|
|
||||||
run_cleanup(
|
run_cleanup(
|
||||||
artefacts_directory=startup_cleanup_params["artefacts"],
|
artefacts_directory=startup_cleanup_params["artefacts"],
|
||||||
metrics_directory=startup_cleanup_params["metrics"],
|
metrics_directory=startup_cleanup_params["metrics"],
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("-------------------------------")
|
|
||||||
logger.info(f"--- {__file__} - Complete! ---")
|
logger.info(f"--- {__file__} - Complete! ---")
|
||||||
logger.info("-------------------------------")
|
|
||||||
|
|
|
||||||
|
|
@ -17,9 +17,7 @@ from core.DataClient import dataclient_factory
|
||||||
from core.FeatureProcessor import feature_processor_factory
|
from core.FeatureProcessor import feature_processor_factory
|
||||||
from config import settings
|
from config import settings
|
||||||
|
|
||||||
logger.info("----------------------------")
|
|
||||||
logger.info(f"--- Initiate Parameters ---")
|
logger.info(f"--- Initiate Parameters ---")
|
||||||
logger.info("----------------------------")
|
|
||||||
|
|
||||||
RUNTIME_ENVIRONMENT = os.environ.get("RUNTIME_ENVIRONMENT", "local")
|
RUNTIME_ENVIRONMENT = os.environ.get("RUNTIME_ENVIRONMENT", "local")
|
||||||
|
|
||||||
|
|
@ -33,9 +31,7 @@ output_train_filepath = prepare_data_params["output_train_filepath"]
|
||||||
output_test_filepath = prepare_data_params["output_test_filepath"]
|
output_test_filepath = prepare_data_params["output_test_filepath"]
|
||||||
feature_processor_config = feature_process_params["feature_processor_config"]
|
feature_processor_config = feature_process_params["feature_processor_config"]
|
||||||
|
|
||||||
logger.info("----------------------------")
|
|
||||||
logger.info(f"--- Initiate DataClient ---")
|
logger.info(f"--- Initiate DataClient ---")
|
||||||
logger.info("----------------------------")
|
|
||||||
|
|
||||||
input_dataclient_type = prepare_data_params["input_dataclient_type"]
|
input_dataclient_type = prepare_data_params["input_dataclient_type"]
|
||||||
output_dataclient_type = prepare_data_params["output_dataclient_type"]
|
output_dataclient_type = prepare_data_params["output_dataclient_type"]
|
||||||
|
|
@ -49,9 +45,7 @@ output_dataclient = dataclient_factory(
|
||||||
dataclient_config=client_params[output_dataclient_type],
|
dataclient_config=client_params[output_dataclient_type],
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("----------------------------------")
|
|
||||||
logger.info(f"--- Initiate FeatureProcessor ---")
|
logger.info(f"--- Initiate FeatureProcessor ---")
|
||||||
logger.info("----------------------------------")
|
|
||||||
|
|
||||||
feature_processor = feature_processor_factory(
|
feature_processor = feature_processor_factory(
|
||||||
feature_process_params["feature_processor_type"]
|
feature_process_params["feature_processor_type"]
|
||||||
|
|
@ -76,15 +70,11 @@ def prepare_data(
|
||||||
:param pipeline_mode: bool, Default False, this caches out the file for experimentation, objects returned in pipeline mode
|
:param pipeline_mode: bool, Default False, this caches out the file for experimentation, objects returned in pipeline mode
|
||||||
"""
|
"""
|
||||||
|
|
||||||
logger.info("--------------------")
|
|
||||||
logger.info("--- Loading data ---")
|
logger.info("--- Loading data ---")
|
||||||
logger.info("--------------------")
|
|
||||||
|
|
||||||
data = input_dataclient.load_data(location=data_filepath, load_config={})
|
data = input_dataclient.load_data(location=data_filepath, load_config={})
|
||||||
|
|
||||||
logger.info("--------------------------")
|
|
||||||
logger.info("--- Feature Processing ---")
|
logger.info("--- Feature Processing ---")
|
||||||
logger.info("--------------------------")
|
|
||||||
|
|
||||||
data = feature_processor.feature_process(
|
data = feature_processor.feature_process(
|
||||||
data,
|
data,
|
||||||
|
|
@ -93,9 +83,7 @@ def prepare_data(
|
||||||
new_feature_funcs=new_feature_funcs,
|
new_feature_funcs=new_feature_funcs,
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("----------------------")
|
|
||||||
logger.info("--- Splitting data ---")
|
logger.info("--- Splitting data ---")
|
||||||
logger.info("----------------------")
|
|
||||||
|
|
||||||
if train_proportion == 1:
|
if train_proportion == 1:
|
||||||
train = data
|
train = data
|
||||||
|
|
@ -108,9 +96,7 @@ def prepare_data(
|
||||||
|
|
||||||
train = train.reset_index(drop=True)
|
train = train.reset_index(drop=True)
|
||||||
|
|
||||||
logger.info("-----------------------")
|
|
||||||
logger.info("--- Outputting data ---")
|
logger.info("--- Outputting data ---")
|
||||||
logger.info("-----------------------")
|
|
||||||
|
|
||||||
output_dataclient.save_data(
|
output_dataclient.save_data(
|
||||||
obj=train, location=output_train_filepath, save_config=None
|
obj=train, location=output_train_filepath, save_config=None
|
||||||
|
|
@ -126,13 +112,9 @@ def prepare_data(
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
||||||
logger.info("----------------------------")
|
|
||||||
logger.info(f"--- {__file__} - Start! ---")
|
logger.info(f"--- {__file__} - Start! ---")
|
||||||
logger.info("----------------------------")
|
|
||||||
|
|
||||||
logger.info("---------------------------")
|
|
||||||
logger.info(f"--- Prepare Data Stage ---")
|
logger.info(f"--- Prepare Data Stage ---")
|
||||||
logger.info("---------------------------")
|
|
||||||
|
|
||||||
prepare_data(
|
prepare_data(
|
||||||
input_dataclient=input_dataclient,
|
input_dataclient=input_dataclient,
|
||||||
|
|
@ -147,6 +129,4 @@ if __name__ == "__main__":
|
||||||
new_feature_funcs=new_feature_funcs,
|
new_feature_funcs=new_feature_funcs,
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("-------------------------------")
|
|
||||||
logger.info(f"--- {__file__} - Complete! ---")
|
logger.info(f"--- {__file__} - Complete! ---")
|
||||||
logger.info("-------------------------------")
|
|
||||||
|
|
|
||||||
|
|
@ -18,9 +18,7 @@ from core.MLMetrics import metrics_factory
|
||||||
from configs.post_prediction_logic import post_prediction_logic
|
from configs.post_prediction_logic import post_prediction_logic
|
||||||
from config import settings
|
from config import settings
|
||||||
|
|
||||||
logger.info("----------------------------")
|
|
||||||
logger.info(f"--- Initiate Parameters ---")
|
logger.info(f"--- Initiate Parameters ---")
|
||||||
logger.info("----------------------------")
|
|
||||||
|
|
||||||
RUNTIME_ENVIRONMENT = os.environ.get("RUNTIME_ENVIRONMENT", "local")
|
RUNTIME_ENVIRONMENT = os.environ.get("RUNTIME_ENVIRONMENT", "local")
|
||||||
|
|
||||||
|
|
@ -40,22 +38,16 @@ train_filepath = prepare_data_params["output_train_filepath"]
|
||||||
test_filepath = prepare_data_params["output_test_filepath"]
|
test_filepath = prepare_data_params["output_test_filepath"]
|
||||||
fit_metrics_filepath = build_model_params["fit_metrics_filepath"]
|
fit_metrics_filepath = build_model_params["fit_metrics_filepath"]
|
||||||
|
|
||||||
logger.info("----------------------------")
|
|
||||||
logger.info(f"--- Initiate DataClient ---")
|
logger.info(f"--- Initiate DataClient ---")
|
||||||
logger.info("----------------------------")
|
|
||||||
|
|
||||||
# Output of previous prepare data step, will be where the data is
|
# Output of previous prepare data step, will be where the data is
|
||||||
dataclient = dataclient_factory(prepare_data_params["output_dataclient_type"])
|
dataclient = dataclient_factory(prepare_data_params["output_dataclient_type"])
|
||||||
|
|
||||||
logger.info("-------------------------")
|
|
||||||
logger.info(f"--- Initiate MLModel ---")
|
logger.info(f"--- Initiate MLModel ---")
|
||||||
logger.info("-------------------------")
|
|
||||||
|
|
||||||
model = model_factory(model_type)
|
model = model_factory(model_type)
|
||||||
|
|
||||||
logger.info("-------------------------")
|
|
||||||
logger.info(f"--- Initiate Metrics ---")
|
logger.info(f"--- Initiate Metrics ---")
|
||||||
logger.info("-------------------------")
|
|
||||||
|
|
||||||
metrics = metrics_factory(generate_metrics_params["metrics_type"])
|
metrics = metrics_factory(generate_metrics_params["metrics_type"])
|
||||||
|
|
||||||
|
|
@ -75,9 +67,7 @@ def build_model(
|
||||||
test_data: Union[pd.DataFrame, None] = None,
|
test_data: Union[pd.DataFrame, None] = None,
|
||||||
pipeline_mode: bool = False,
|
pipeline_mode: bool = False,
|
||||||
):
|
):
|
||||||
logger.info("--------------------------------------")
|
|
||||||
logger.info("--- Loading Data for build process ---")
|
logger.info("--- Loading Data for build process ---")
|
||||||
logger.info("--------------------------------------")
|
|
||||||
|
|
||||||
if train_data is None:
|
if train_data is None:
|
||||||
if train_filepath is None:
|
if train_filepath is None:
|
||||||
|
|
@ -89,9 +79,7 @@ def build_model(
|
||||||
raise ValueError(f"Need {test_filepath} if no data supplied")
|
raise ValueError(f"Need {test_filepath} if no data supplied")
|
||||||
test_data = dataclient.load_data(location=test_filepath, load_config=None)
|
test_data = dataclient.load_data(location=test_filepath, load_config=None)
|
||||||
|
|
||||||
logger.info("----------------------")
|
|
||||||
logger.info("--- Training model ---")
|
logger.info("--- Training model ---")
|
||||||
logger.info("----------------------")
|
|
||||||
|
|
||||||
model.train_model(
|
model.train_model(
|
||||||
data=train_data.drop(columns=identifier_columns),
|
data=train_data.drop(columns=identifier_columns),
|
||||||
|
|
@ -99,32 +87,24 @@ def build_model(
|
||||||
model_hyperparameters=model_hyperparameters,
|
model_hyperparameters=model_hyperparameters,
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("----------------------------------")
|
|
||||||
logger.info("--- Generating fit predictions ---")
|
logger.info("--- Generating fit predictions ---")
|
||||||
logger.info("----------------------------------")
|
|
||||||
|
|
||||||
fit_predictions = model.predict(
|
fit_predictions = model.predict(
|
||||||
data=train_data, post_prediction_logic=post_prediction_logic
|
data=train_data, post_prediction_logic=post_prediction_logic
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("------------------------------")
|
|
||||||
logger.info("--- Generating fit metrics ---")
|
logger.info("--- Generating fit metrics ---")
|
||||||
logger.info("------------------------------")
|
|
||||||
|
|
||||||
metrics_output = metrics.generate_metrics(
|
metrics_output = metrics.generate_metrics(
|
||||||
target=train_data[target],
|
target=train_data[target],
|
||||||
predictions=pd.Series(fit_predictions),
|
predictions=pd.Series(fit_predictions),
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("--------------------")
|
|
||||||
logger.info("--- Saving model ---")
|
logger.info("--- Saving model ---")
|
||||||
logger.info("--------------------")
|
|
||||||
|
|
||||||
model.save_model(path=Path(model_save_location))
|
model.save_model(path=Path(model_save_location))
|
||||||
|
|
||||||
logger.info("--------------------------")
|
|
||||||
logger.info("--- Saving fit metrics ---")
|
logger.info("--- Saving fit metrics ---")
|
||||||
logger.info("--------------------------")
|
|
||||||
|
|
||||||
dataclient.save_data(
|
dataclient.save_data(
|
||||||
obj=metrics_output, location=fit_metrics_filepath, save_config=None
|
obj=metrics_output, location=fit_metrics_filepath, save_config=None
|
||||||
|
|
@ -133,13 +113,9 @@ def build_model(
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
||||||
logger.info("----------------------------")
|
|
||||||
logger.info(f"--- {__file__} - Start! ---")
|
logger.info(f"--- {__file__} - Start! ---")
|
||||||
logger.info("----------------------------")
|
|
||||||
|
|
||||||
logger.info("--------------------------")
|
|
||||||
logger.info(f"--- Build Model Stage ---")
|
logger.info(f"--- Build Model Stage ---")
|
||||||
logger.info("--------------------------")
|
|
||||||
|
|
||||||
build_model(
|
build_model(
|
||||||
dataclient=dataclient,
|
dataclient=dataclient,
|
||||||
|
|
@ -154,6 +130,4 @@ if __name__ == "__main__":
|
||||||
fit_metrics_filepath=fit_metrics_filepath,
|
fit_metrics_filepath=fit_metrics_filepath,
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("-------------------------------")
|
|
||||||
logger.info(f"--- {__file__} - Complete! ---")
|
logger.info(f"--- {__file__} - Complete! ---")
|
||||||
logger.info("-------------------------------")
|
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,7 @@ from core.Logger import logger
|
||||||
from config import settings
|
from config import settings
|
||||||
from generate_predictions import generate_predictions
|
from generate_predictions import generate_predictions
|
||||||
|
|
||||||
logger.info("----------------------------")
|
|
||||||
logger.info(f"--- Initiate Parameters ---")
|
logger.info(f"--- Initiate Parameters ---")
|
||||||
logger.info("----------------------------")
|
|
||||||
|
|
||||||
RUNTIME_ENVIRONMENT = os.environ.get("RUNTIME_ENVIRONMENT", "local")
|
RUNTIME_ENVIRONMENT = os.environ.get("RUNTIME_ENVIRONMENT", "local")
|
||||||
|
|
||||||
|
|
@ -33,15 +31,11 @@ model_filepath = build_model_params["model_save_filepath"]
|
||||||
predictions_output_filepath = generate_predictions_params["predictions_output_filepath"]
|
predictions_output_filepath = generate_predictions_params["predictions_output_filepath"]
|
||||||
predictions_column_name = generate_predictions_params["predictions_column_name"]
|
predictions_column_name = generate_predictions_params["predictions_column_name"]
|
||||||
|
|
||||||
logger.info("-------------------------")
|
|
||||||
logger.info(f"--- Initiate MLModel ---")
|
logger.info(f"--- Initiate MLModel ---")
|
||||||
logger.info("-------------------------")
|
|
||||||
|
|
||||||
model = model_factory(build_model_params["model_type"])
|
model = model_factory(build_model_params["model_type"])
|
||||||
|
|
||||||
logger.info("----------------------------")
|
|
||||||
logger.info(f"--- Initiate DataClient ---")
|
logger.info(f"--- Initiate DataClient ---")
|
||||||
logger.info("----------------------------")
|
|
||||||
|
|
||||||
# We may have different locations of loading hence why we use one specified in generate_predictions.yaml
|
# We may have different locations of loading hence why we use one specified in generate_predictions.yaml
|
||||||
# I.e. for metric runs, this will be a local data client
|
# I.e. for metric runs, this will be a local data client
|
||||||
|
|
@ -59,13 +53,9 @@ output_dataclient = dataclient_factory(
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
||||||
logger.info("----------------------------")
|
|
||||||
logger.info(f"--- {__file__} - Start! ---")
|
logger.info(f"--- {__file__} - Start! ---")
|
||||||
logger.info("----------------------------")
|
|
||||||
|
|
||||||
logger.info("----------------------------------")
|
|
||||||
logger.info(f"--- Generate Predictions Stage---")
|
logger.info(f"--- Generate Predictions Stage---")
|
||||||
logger.info("----------------------------------")
|
|
||||||
|
|
||||||
generate_predictions(
|
generate_predictions(
|
||||||
input_dataclient=input_dataclient,
|
input_dataclient=input_dataclient,
|
||||||
|
|
@ -78,6 +68,4 @@ if __name__ == "__main__":
|
||||||
predictions_column_name=predictions_column_name,
|
predictions_column_name=predictions_column_name,
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("-------------------------------")
|
|
||||||
logger.info(f"--- {__file__} - Complete! ---")
|
logger.info(f"--- {__file__} - Complete! ---")
|
||||||
logger.info("-------------------------------")
|
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,7 @@ from core.MLMetrics import metrics_factory
|
||||||
from core.Logger import logger
|
from core.Logger import logger
|
||||||
from config import settings
|
from config import settings
|
||||||
|
|
||||||
logger.info("----------------------------")
|
|
||||||
logger.info(f"--- Initiate Parameters ---")
|
logger.info(f"--- Initiate Parameters ---")
|
||||||
logger.info("----------------------------")
|
|
||||||
|
|
||||||
RUNTIME_ENVIRONMENT = os.environ.get("RUNTIME_ENVIRONMENT", "local")
|
RUNTIME_ENVIRONMENT = os.environ.get("RUNTIME_ENVIRONMENT", "local")
|
||||||
|
|
||||||
|
|
@ -34,15 +32,11 @@ predictions_column_name = generate_predictions_params["predictions_column_name"]
|
||||||
metrics_output_filepath = generate_metrics_params["metrics_output_filepath"]
|
metrics_output_filepath = generate_metrics_params["metrics_output_filepath"]
|
||||||
|
|
||||||
|
|
||||||
logger.info("-------------------------")
|
|
||||||
logger.info(f"--- Initiate MLModel ---")
|
logger.info(f"--- Initiate MLModel ---")
|
||||||
logger.info("-------------------------")
|
|
||||||
|
|
||||||
model = model_factory(build_model_params["model_type"])
|
model = model_factory(build_model_params["model_type"])
|
||||||
|
|
||||||
logger.info("----------------------------")
|
|
||||||
logger.info(f"--- Initiate DataClient ---")
|
logger.info(f"--- Initiate DataClient ---")
|
||||||
logger.info("----------------------------")
|
|
||||||
|
|
||||||
# Use data client for input and output, as we use dvc to cache later to the cloud
|
# Use data client for input and output, as we use dvc to cache later to the cloud
|
||||||
dataclient_type = generate_metrics_params["dataclient_type"]
|
dataclient_type = generate_metrics_params["dataclient_type"]
|
||||||
|
|
@ -51,9 +45,7 @@ dataclient = dataclient_factory(
|
||||||
dataclient_config=client_params[dataclient_type],
|
dataclient_config=client_params[dataclient_type],
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("---------------------------")
|
|
||||||
logger.info(f"--- Initiate MLMetrics ---")
|
logger.info(f"--- Initiate MLMetrics ---")
|
||||||
logger.info("---------------------------")
|
|
||||||
|
|
||||||
metrics = metrics_factory(generate_metrics_params["metrics_type"])
|
metrics = metrics_factory(generate_metrics_params["metrics_type"])
|
||||||
|
|
||||||
|
|
@ -73,34 +65,26 @@ def generate_metrics(
|
||||||
For a given model, we generate prediction and evaluate this against the true target
|
For a given model, we generate prediction and evaluate this against the true target
|
||||||
"""
|
"""
|
||||||
|
|
||||||
logger.info("-------------------------")
|
|
||||||
logger.info("--- Loading test data ---")
|
logger.info("--- Loading test data ---")
|
||||||
logger.info("-------------------------")
|
|
||||||
|
|
||||||
test_data = input_dataclient.load_data(
|
test_data = input_dataclient.load_data(
|
||||||
location=test_data_filepath, load_config=None
|
location=test_data_filepath, load_config=None
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("---------------------------")
|
|
||||||
logger.info("--- Loading predictions ---")
|
logger.info("--- Loading predictions ---")
|
||||||
logger.info("---------------------------")
|
|
||||||
|
|
||||||
predictions = input_dataclient.load_data(
|
predictions = input_dataclient.load_data(
|
||||||
location=predictions_output_filepath, load_config=None
|
location=predictions_output_filepath, load_config=None
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("--------------------------")
|
|
||||||
logger.info("--- Generating metrics ---")
|
logger.info("--- Generating metrics ---")
|
||||||
logger.info("--------------------------")
|
|
||||||
|
|
||||||
metrics_output = metrics.generate_metrics(
|
metrics_output = metrics.generate_metrics(
|
||||||
target=test_data[target],
|
target=test_data[target],
|
||||||
predictions=pd.Series(predictions[predictions_column_name]),
|
predictions=pd.Series(predictions[predictions_column_name]),
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("----------------------")
|
|
||||||
logger.info("--- Saving metrics ---")
|
logger.info("--- Saving metrics ---")
|
||||||
logger.info("----------------------")
|
|
||||||
|
|
||||||
output_dataclient.save_data(
|
output_dataclient.save_data(
|
||||||
obj=metrics_output, location=metrics_output_filepath, save_config=None
|
obj=metrics_output, location=metrics_output_filepath, save_config=None
|
||||||
|
|
@ -109,13 +93,9 @@ def generate_metrics(
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
||||||
logger.info("----------------------------")
|
|
||||||
logger.info(f"--- {__file__} - Start! ---")
|
logger.info(f"--- {__file__} - Start! ---")
|
||||||
logger.info("----------------------------")
|
|
||||||
|
|
||||||
logger.info("------------------------------")
|
|
||||||
logger.info(f"--- Generate Metrics Stage---")
|
logger.info(f"--- Generate Metrics Stage---")
|
||||||
logger.info("------------------------------")
|
|
||||||
|
|
||||||
generate_metrics(
|
generate_metrics(
|
||||||
input_dataclient=dataclient,
|
input_dataclient=dataclient,
|
||||||
|
|
@ -129,6 +109,4 @@ if __name__ == "__main__":
|
||||||
metrics_output_filepath=metrics_output_filepath,
|
metrics_output_filepath=metrics_output_filepath,
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("-------------------------------")
|
|
||||||
logger.info(f"--- {__file__} - Complete! ---")
|
logger.info(f"--- {__file__} - Complete! ---")
|
||||||
logger.info("-------------------------------")
|
|
||||||
|
|
|
||||||
|
|
@ -16,3 +16,5 @@ default:
|
||||||
time_limit: 4000
|
time_limit: 4000
|
||||||
presets: medium_quality
|
presets: medium_quality
|
||||||
excluded_model_types: ['KNN', 'RF']
|
excluded_model_types: ['KNN', 'RF']
|
||||||
|
infer_limit: 0.05
|
||||||
|
infer_limit_batch_size: 10000
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ default:
|
||||||
# data_filepath: s3://retrofit-data-dev/sap_change_model/dataset_with_differencing.parquet
|
# data_filepath: s3://retrofit-data-dev/sap_change_model/dataset_with_differencing.parquet
|
||||||
# data_filepath: s3://retrofit-data-dev/sap_change_model/floor_area_clean_test.parquet
|
# data_filepath: s3://retrofit-data-dev/sap_change_model/floor_area_clean_test.parquet
|
||||||
# data_filepath: s3://retrofit-data-dev/sap_change_model/dataset_without_differencing.parquet
|
# data_filepath: s3://retrofit-data-dev/sap_change_model/dataset_without_differencing.parquet
|
||||||
data_filepath: s3://retrofit-data-dev/sap_change_model/dataset.parquet
|
data_filepath: s3://retrofit-data-dev/sap_change_model/dataset_test.parquet
|
||||||
train_proportion: 0.9
|
train_proportion: 0.9
|
||||||
output_train_filepath: ./data/prepared_data/train.parquet
|
output_train_filepath: ./data/prepared_data/train.parquet
|
||||||
output_test_filepath: ./data/prepared_data/test.parquet
|
output_test_filepath: ./data/prepared_data/test.parquet
|
||||||
|
|
@ -43,6 +43,7 @@ default:
|
||||||
test_data_filepath: ./data/prepared_data/test.parquet
|
test_data_filepath: ./data/prepared_data/test.parquet
|
||||||
predictions_output_filepath: ./data/predictions/predictions.parquet
|
predictions_output_filepath: ./data/predictions/predictions.parquet
|
||||||
predictions_column_name: predictions
|
predictions_column_name: predictions
|
||||||
|
identifier_column: id
|
||||||
|
|
||||||
generate_metrics:
|
generate_metrics:
|
||||||
dataclient_type: local
|
dataclient_type: local
|
||||||
|
|
|
||||||
|
|
@ -142,9 +142,15 @@ class AWSS3Client:
|
||||||
buffer = BytesIO()
|
buffer = BytesIO()
|
||||||
obj.to_parquet(buffer, index=False)
|
obj.to_parquet(buffer, index=False)
|
||||||
|
|
||||||
|
# Reset the buffer position to the beginning
|
||||||
|
buffer.seek(0)
|
||||||
|
|
||||||
bucket, key = location.strip("s3://").split("/", 1)
|
bucket, key = location.strip("s3://").split("/", 1)
|
||||||
self.client.upload_fileobj(buffer, bucket, key)
|
self.client.upload_fileobj(buffer, bucket, key)
|
||||||
|
|
||||||
|
# Close the buffer
|
||||||
|
buffer.close()
|
||||||
|
|
||||||
def _load_parquet(self, location: str, load_config: dict) -> pd.DataFrame:
|
def _load_parquet(self, location: str, load_config: dict) -> pd.DataFrame:
|
||||||
"""
|
"""
|
||||||
Load a parquet file
|
Load a parquet file
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ def setup_logger():
|
||||||
|
|
||||||
# Add the stream handler to the logger
|
# Add the stream handler to the logger
|
||||||
logger.addHandler(stream_handler)
|
logger.addHandler(stream_handler)
|
||||||
|
logger.propagate = False
|
||||||
|
|
||||||
return logger
|
return logger
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -149,6 +149,8 @@ class AutogluonAutoML:
|
||||||
"time_limit",
|
"time_limit",
|
||||||
"presets",
|
"presets",
|
||||||
"excluded_model_types",
|
"excluded_model_types",
|
||||||
|
"infer_limit",
|
||||||
|
"infer_limit_batch_size",
|
||||||
]
|
]
|
||||||
|
|
||||||
def load_model(self, path: Union[Path, str]) -> None:
|
def load_model(self, path: Union[Path, str]) -> None:
|
||||||
|
|
@ -203,6 +205,8 @@ class AutogluonAutoML:
|
||||||
time_limit=model_hyperparameters["time_limit"],
|
time_limit=model_hyperparameters["time_limit"],
|
||||||
presets=model_hyperparameters["presets"],
|
presets=model_hyperparameters["presets"],
|
||||||
excluded_model_types=model_hyperparameters["excluded_model_types"],
|
excluded_model_types=model_hyperparameters["excluded_model_types"],
|
||||||
|
infer_limit=model_hyperparameters["infer_limit"],
|
||||||
|
infer_limit_batch_size=model_hyperparameters["infer_limit_batch_size"],
|
||||||
)
|
)
|
||||||
|
|
||||||
def predict(
|
def predict(
|
||||||
|
|
|
||||||
|
|
@ -14,28 +14,23 @@ def generate_predictions(
|
||||||
test_data_filepath: str,
|
test_data_filepath: str,
|
||||||
predictions_output_filepath: str,
|
predictions_output_filepath: str,
|
||||||
predictions_column_name: str,
|
predictions_column_name: str,
|
||||||
|
identifier_column: str = "id",
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
For a given model, we generate prediction and evaluate this against the true target
|
For a given model, we generate prediction and evaluate this against the true target
|
||||||
"""
|
"""
|
||||||
|
|
||||||
logger.info("-------------------------")
|
|
||||||
logger.info("--- Loading test data ---")
|
logger.info("--- Loading test data ---")
|
||||||
logger.info("-------------------------")
|
|
||||||
|
|
||||||
test_data = input_dataclient.load_data(
|
test_data = input_dataclient.load_data(
|
||||||
location=test_data_filepath, load_config=None
|
location=test_data_filepath, load_config=None
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("---------------------")
|
|
||||||
logger.info("--- Loading model ---")
|
logger.info("--- Loading model ---")
|
||||||
logger.info("---------------------")
|
|
||||||
|
|
||||||
model.load_model(model_filepath)
|
model.load_model(model_filepath)
|
||||||
|
|
||||||
logger.info("------------------------------")
|
|
||||||
logger.info("--- Generating predictions ---")
|
logger.info("--- Generating predictions ---")
|
||||||
logger.info("------------------------------")
|
|
||||||
|
|
||||||
prediction_data = (
|
prediction_data = (
|
||||||
test_data.drop(columns=target) if target in test_data.columns else test_data
|
test_data.drop(columns=target) if target in test_data.columns else test_data
|
||||||
|
|
@ -45,13 +40,17 @@ def generate_predictions(
|
||||||
data=prediction_data, post_prediction_logic=post_prediction_logic
|
data=prediction_data, post_prediction_logic=post_prediction_logic
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("--------------------------")
|
|
||||||
logger.info("--- Saving predictions ---")
|
logger.info("--- Saving predictions ---")
|
||||||
logger.info("--------------------------")
|
|
||||||
|
|
||||||
predictions_df = pd.DataFrame(predictions)
|
predictions_df = pd.DataFrame(predictions)
|
||||||
predictions_df.columns = [predictions_column_name]
|
predictions_df.columns = [predictions_column_name]
|
||||||
|
|
||||||
output_dataclient.save_data(
|
output_df = (
|
||||||
obj=predictions_df, location=predictions_output_filepath, save_config=None
|
pd.concat([test_data[identifier_column], predictions_df], axis=1)
|
||||||
|
if identifier_column in test_data.columns
|
||||||
|
else predictions_df
|
||||||
|
)
|
||||||
|
|
||||||
|
output_dataclient.save_data(
|
||||||
|
obj=output_df, location=predictions_output_filepath, save_config=None
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue