Bird
Raised Fist0
ML Pythonml~8 mins

Saving pipelines (joblib, pickle) in ML Python - Model Metrics & Evaluation

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Metrics & Evaluation - Saving pipelines (joblib, pickle)
Which metric matters for this concept and WHY

When saving machine learning pipelines using joblib or pickle, the key metric is model integrity. This means the saved pipeline should load back exactly as it was, preserving all steps and parameters so predictions remain the same. We check this by comparing predictions before saving and after loading. Accuracy or other performance metrics should not change. This ensures the pipeline is saved correctly and can be reused without errors.

Confusion matrix or equivalent visualization (ASCII)

Since saving pipelines is about preserving model behavior, we verify by comparing predictions before and after saving. For example, if the model predicts labels for 10 samples, the confusion matrix before saving and after loading should be identical.

    Before saving predictions: [1, 0, 1, 1, 0, 0, 1, 0, 1, 0]
    After loading predictions:  [1, 0, 1, 1, 0, 0, 1, 0, 1, 0]

    Confusion matrix (same for both):
    +-----+-----+
    | TP  | FP  |
    +-----+-----+
    | FN  | TN  |
    +-----+-----+

    TP = 5, FP = 0, FN = 0, TN = 5
    
Precision vs Recall tradeoff with concrete examples

Saving pipelines does not directly affect precision or recall. However, if the pipeline is corrupted during saving or loading, predictions may change, causing precision and recall to drop. For example, if a spam filter pipeline is saved incorrectly, it might mark good emails as spam (lower precision) or miss spam emails (lower recall). Thus, ensuring pipeline integrity preserves the original precision and recall.

What "good" vs "bad" metric values look like for this use case

Good: Predictions before saving and after loading are exactly the same. Accuracy, precision, recall, and F1 score remain unchanged. This means the pipeline was saved and loaded correctly.

Bad: Predictions differ after loading. Metrics drop significantly. This indicates the pipeline was corrupted or not saved properly, making it unreliable for future use.

Metrics pitfalls (accuracy paradox, data leakage, overfitting indicators)
  • Corrupted save/load: Using incompatible versions of joblib or pickle can corrupt the pipeline.
  • Data leakage: Saving pipelines that include data-dependent steps (like scaling on full data) without refitting on new data can cause misleading metrics.
  • Overfitting: Saving a pipeline that overfits training data will preserve that behavior; metrics may look good on training but fail on new data.
  • Accuracy paradox: High accuracy after loading does not guarantee pipeline integrity if the test set is unbalanced or small.
Self-check question

Your model pipeline was saved with joblib. After loading, the accuracy on the test set is 98%, but recall on the positive class dropped from 90% to 12%. Is the saved pipeline good for production? Why or why not?

Answer: No, the saved pipeline is not good. The large drop in recall means the model misses many positive cases after loading. This suggests the pipeline was corrupted or not saved properly. You must fix the saving/loading process to preserve model performance.

Key Result
Model integrity is key: predictions and metrics must remain unchanged before and after saving/loading pipelines.

Practice

(1/5)
1. What is the main purpose of saving a machine learning pipeline using joblib or pickle?
easy
A. To visualize the model architecture
B. To increase the training speed of the model
C. To reuse the trained model and preprocessing steps without retraining
D. To automatically tune hyperparameters

Solution

  1. Step 1: Understand what saving a pipeline means

    Saving a pipeline stores the trained model and preprocessing steps so you don't have to train again.
  2. Step 2: Identify the main benefit

    This allows you to reuse the pipeline later for predictions without retraining, saving time and effort.
  3. Final Answer:

    To reuse the trained model and preprocessing steps without retraining -> Option C
  4. Quick Check:

    Saving pipeline = reuse trained model [OK]
Hint: Saving pipelines means reusing models without retraining [OK]
Common Mistakes:
  • Thinking saving speeds up training
  • Confusing saving with visualization
  • Assuming saving tunes hyperparameters
2. Which of the following is the correct syntax to save a trained pipeline named pipe to a file called model.pkl using joblib?
easy
A. joblib.dump(pipe, 'model.pkl')
B. joblib.store(pipe, 'model.pkl')
C. joblib.write(pipe, 'model.pkl')
D. joblib.save(pipe, 'model.pkl')

Solution

  1. Step 1: Recall the correct joblib function for saving

    The function to save an object with joblib is dump(), not save, write, or store.
  2. Step 2: Match the syntax

    The correct syntax is joblib.dump(pipe, 'model.pkl') to save the pipeline to a file.
  3. Final Answer:

    joblib.dump(pipe, 'model.pkl') -> Option A
  4. Quick Check:

    Save with joblib.dump() [OK]
Hint: Use joblib.dump() to save pipelines [OK]
Common Mistakes:
  • Using joblib.save() which does not exist
  • Confusing dump() with write() or store()
  • Incorrect argument order
3. Given the following code, what will be the output?
import joblib
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

pipe = Pipeline([
    ('scaler', StandardScaler()),
    ('clf', LogisticRegression())
])

pipe.fit([[0, 0], [1, 1]], [0, 1])
joblib.dump(pipe, 'pipe.pkl')
loaded_pipe = joblib.load('pipe.pkl')
pred = loaded_pipe.predict([[2, 2]])
print(pred)
medium
A. [0]
B. [1]
C. Error: File not found
D. [0 1]

Solution

  1. Step 1: Understand the pipeline training

    The pipeline is trained on two points: [0,0] labeled 0 and [1,1] labeled 1, so it learns to classify higher values as 1.
  2. Step 2: Predict using loaded pipeline

    After saving and loading, the pipeline predicts on [2,2], which is closer to class 1, so prediction is [1].
  3. Final Answer:

    [1] -> Option B
  4. Quick Check:

    Loaded pipeline predicts class 1 for [2,2] [OK]
Hint: Loaded pipeline predicts same as original model [OK]
Common Mistakes:
  • Expecting error due to file handling
  • Confusing prediction output format
  • Assuming prediction is [0]
4. You tried to load a saved pipeline using loaded_pipe = joblib.load('pipeline.pkl') but got a FileNotFoundError. What is the most likely cause?
medium
A. The file pipeline.pkl does not exist in the current directory
B. The pipeline was not trained before saving
C. The joblib.load function is used incorrectly
D. The pipeline file is corrupted and cannot be loaded

Solution

  1. Step 1: Understand FileNotFoundError meaning

    This error means the file specified does not exist at the given path.
  2. Step 2: Identify the most common cause

    Usually, the file is missing or the path is wrong, so the file pipeline.pkl is not found in the current directory.
  3. Final Answer:

    The file pipeline.pkl does not exist in the current directory -> Option A
  4. Quick Check:

    FileNotFoundError = missing file [OK]
Hint: FileNotFoundError means file path is wrong or missing [OK]
Common Mistakes:
  • Assuming pipeline not trained causes this error
  • Thinking joblib.load syntax is wrong
  • Assuming file corruption without checking file presence
5. You have a pipeline that includes a scaler and a classifier. You want to save it and later load it to predict on new data. Which of the following code snippets correctly saves and loads the pipeline, then predicts on new data [[5, 5]]?
hard
A. import pickle pickle.dump(pipeline, 'model.pkl') loaded = pickle.load('model.pkl') pred = loaded.predict([[5, 5]]) print(pred)
B. import pickle pickle.load(pipeline, 'model.pkl') loaded = pickle.load('model.pkl') pred = loaded.predict([[5, 5]]) print(pred)
C. import joblib joblib.save(pipeline, 'model.pkl') loaded = joblib.load('model.pkl') pred = loaded.predict([[5, 5]]) print(pred)
D. import joblib joblib.dump(pipeline, 'model.joblib') loaded = joblib.load('model.joblib') pred = loaded.predict([[5, 5]]) print(pred)

Solution

  1. Step 1: Check saving syntax correctness

    import joblib joblib.dump(pipeline, 'model.joblib') loaded = joblib.load('model.joblib') pred = loaded.predict([[5, 5]]) print(pred) uses joblib.dump() correctly to save the pipeline, and joblib.load() to load it.
  2. Step 2: Verify prediction step

    After loading, it calls predict on new data correctly and prints the result.
  3. Step 3: Identify errors in other options

    import pickle pickle.load(pipeline, 'model.pkl') loaded = pickle.load('model.pkl') pred = loaded.predict([[5, 5]]) print(pred) wrongly uses pickle.load to save; import joblib joblib.save(pipeline, 'model.pkl') loaded = joblib.load('model.pkl') pred = loaded.predict([[5, 5]]) print(pred) uses non-existent joblib.save; import pickle pickle.dump(pipeline, 'model.pkl') loaded = pickle.load('model.pkl') pred = loaded.predict([[5, 5]]) print(pred) incorrectly uses pickle.dump and pickle.load (both require file objects from open() with 'wb'/'rb' modes).
  4. Final Answer:

    import joblib joblib.dump(pipeline, 'model.joblib') loaded = joblib.load('model.joblib') pred = loaded.predict([[5, 5]]) print(pred) -> Option D
  5. Quick Check:

    Use joblib.dump/load with correct syntax [OK]
Hint: Use joblib.dump() and joblib.load() with correct syntax [OK]
Common Mistakes:
  • Using joblib.save() which does not exist
  • Confusing pickle.load() for saving
  • Not opening file when using pickle.load()