Model registry in ML Python - ML Experiment: Train & Evaluate
import os import json import joblib from datetime import datetime class SimpleModelRegistry: def __init__(self, registry_dir='model_registry'): self.registry_dir = registry_dir os.makedirs(self.registry_dir, exist_ok=True) self.metadata_file = os.path.join(self.registry_dir, 'metadata.json') if not os.path.exists(self.metadata_file): with open(self.metadata_file, 'w') as f: json.dump([], f) def register_model(self, model, version, metrics): model_path = os.path.join(self.registry_dir, f'model_v{version}.joblib') joblib.dump(model, model_path) with open(self.metadata_file, 'r') as f: metadata = json.load(f) metadata.append({ 'version': version, 'model_path': model_path, 'metrics': metrics, 'registered_at': datetime.now().isoformat() }) with open(self.metadata_file, 'w') as f: json.dump(metadata, f, indent=2) print(f'Model version {version} registered successfully.') def load_model(self, version=None): with open(self.metadata_file, 'r') as f: metadata = json.load(f) if not metadata: print('No models registered yet.') return None if version is None: # Load latest version latest = max(metadata, key=lambda x: x['version']) version = latest['version'] else: latest = next((m for m in metadata if m['version'] == version), None) if latest is None: print(f'Model version {version} not found.') return None model = joblib.load(latest['model_path']) print(f'Model version {version} loaded.') return model # Example usage: if __name__ == '__main__': from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score data = load_iris() X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.3, random_state=42) model = DecisionTreeClassifier(random_state=42) model.fit(X_train, y_train) preds = model.predict(X_test) acc = accuracy_score(y_test, preds) registry = SimpleModelRegistry() registry.register_model(model, version=1, metrics={'accuracy': acc}) loaded_model = registry.load_model() # Loads latest loaded_preds = loaded_model.predict(X_test) loaded_acc = accuracy_score(y_test, loaded_preds) print(f'Loaded model accuracy: {loaded_acc:.2f}')
Before: No model tracking, no version control, confusion about best model.
After: Models saved with versions and metrics, easy to load specific or latest model reliably.
Practice
What is the main purpose of a model registry in machine learning?
Solution
Step 1: Understand the role of a model registry
A model registry is designed to keep track of machine learning models, their versions, and metadata.Step 2: Compare options with the definition
Only To store and organize machine learning models describes storing and organizing models, which matches the main purpose of a model registry.Final Answer:
To store and organize machine learning models -> Option AQuick Check:
Model registry = store and organize models [OK]
- Confusing model registry with data cleaning
- Thinking it speeds up training
- Mixing it with visualization tools
Which of the following is the correct way to add a model to a simple Python dictionary used as a model registry?
model_registry = {}
# Add model here
Solution
Step 1: Recall how to add key-value pairs to a dictionary
In Python, adding an item to a dictionary uses the syntax dict[key] = value.Step 2: Check each option for correct dictionary syntax
The incorrect options use methods like .add(), .append(), and .insert() which are not available for dictionaries. Only model_registry['model_v1'] = trained_model uses the correct assignment syntax.Final Answer:
model_registry['model_v1'] = trained_model -> Option AQuick Check:
Dictionary add = dict[key] = value [OK]
- Using list methods like append on dictionaries
- Trying to call add or insert on dict
- Confusing dictionary with list syntax
Given the following code, what will be the output?
model_registry = {}
model_registry['v1'] = {'accuracy': 0.8}
model_registry['v2'] = {'accuracy': 0.85}
print(model_registry['v2']['accuracy'])
Solution
Step 1: Understand the dictionary structure
model_registry has keys 'v1' and 'v2', each storing a dictionary with an 'accuracy' key.Step 2: Access the nested value
model_registry['v2']['accuracy'] accesses the accuracy value for version 'v2', which is 0.85.Final Answer:
0.85 -> Option BQuick Check:
Access nested dict value = 0.85 [OK]
- Confusing keys and values
- Expecting full dict instead of value
- Mistyping keys causing KeyError
Identify the error in this code snippet that tries to update a model's accuracy in a registry:
model_registry = {'v1': {'accuracy': 0.8}}
model_registry.update('v1', {'accuracy': 0.85})
Solution
Step 1: Check the usage of dictionary update method
The update() method takes a single dictionary or iterable of key-value pairs, not separate arguments.Step 2: Identify the correct way to update nested dictionary
To update nested dict, access it first: model_registry['v1'].update({'accuracy': 0.85}).Final Answer:
updatemethod expects a dictionary, not two arguments -> Option DQuick Check:
dict.update() needs one dict argument [OK]
- Passing multiple arguments to update()
- Trying to update nested dict without accessing it
- Assuming update() works like assignment
You want to keep track of multiple versions of a model with their accuracy and deployment status. Which data structure best suits a simple model registry in Python?
Solution
Step 1: Identify the need for storing multiple details per version
You need to store version keys, accuracy, and deployment status, which requires nested information.Step 2: Evaluate data structures for this need
A dictionary with version keys and nested dictionaries for details fits best. Lists or sets lack easy key-based access or nested info.Final Answer:
A dictionary with version keys and nested dictionaries for metrics and status -> Option CQuick Check:
Nested dicts store complex model info best [OK]
- Using lists or sets that lack keys
- Storing only one detail per model
- Using strings that can't hold structured data
Ready to prove it?
Pass the test and this pattern moves unknown
