in src/core/fraud_detector_train.py [0:0]
def run(self, model_name: str, model_variables: FeatureVariablesBase, model_description: str, model_type: str,
s3_training_file: str, role_arn: str,
event_type_name: str, wait=False):
"""
Run a model training job
@param model_name: Name of the model
@param model_variables: Type of FeatureVariablesBase , to create model variables an labels
@param model_description: A description of the model
@param model_type: The type of model, e.g. ONLINE_FRAUD_INSIGHTS
@param s3_training_file: The train data file
@param role_arn: ARN of the role
@param wait: If true , waits for the training job to complete , else exits after kicking off the training job
@param event_type_name: The type of event e.g. order, login etc
@return: a dict of model name and version, e.g. {"modelVersionNumber" : "1.0", "modelId" : "demo"}
"""
# Create model features
model_features = model_variables.create_or_retrieve_features()
model_label = model_variables.create_or_retrieve_label()
# Create / update initializes the model
self._logger.info("Initialise model - {} ".format(model_name))
try:
self.client.get_models(
modelId=model_name,
modelType=model_type
)
self._logger.info("Model {} already exists ".format(model_name))
except botocore.errorfactory.ClientError as error:
# If resource not found, it means that the model doesnt exist, so lets create it
if error.response['Error']['Code'] == 'ResourceNotFoundException':
self._logger.info("Creating model: {}".format(model_name))
self.client.create_model(
modelId=model_name,
modelType=model_type,
description=model_description,
eventTypeName=event_type_name,
)
else:
raise error
# Trigger training
self._logger.info("Triggering training {}".format(model_name))
response = self.client.create_model_version(
modelId=model_name,
modelType=model_type,
trainingDataSource='EXTERNAL_EVENTS',
trainingDataSchema={
# Model Variables
'modelVariables': model_features,
# Label
'labelSchema': {"labelMapper": model_label}
},
externalEventsDetail={
'dataLocation': s3_training_file,
'dataAccessRoleArn': role_arn
}
)
model_version = response["modelVersionNumber"]
self._logger.info("Training job kicked off for model {} version {}".format(model_name, model_version))
# Wait for training to complete
if wait:
self.fraud_detector_utils.wait_until_model_status(model_name, model_version, model_type,
fail_states="ERROR", success_states="TRAINING_COMPLETE")
response = self.client.get_model_version(modelId=model_name, modelType=model_type,
modelVersionNumber=model_version)
return response