Bird
Raised Fist0
ML Pythonml~20 mins

Saving pipelines (joblib, pickle) in ML Python - ML Experiment: Train & Evaluate

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
Experiment - Saving pipelines (joblib, pickle)
Problem:You have trained a machine learning pipeline that preprocesses data and fits a model. You want to save this pipeline to disk so you can reuse it later without retraining.
Current Metrics:Training accuracy: 92%, Validation accuracy: 89%
Issue:Currently, the pipeline is only in memory. If you close your program, you lose the trained pipeline and must retrain it every time.
Your Task
Save the trained pipeline to disk using joblib or pickle, then load it back and verify it produces the same predictions on test data.
Use either joblib or pickle for saving and loading.
Do not retrain the model after loading.
Ensure the loaded pipeline gives identical predictions to the original.
Hint 1
Hint 2
Hint 3
Solution
ML Python
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
import joblib

# Load data
iris = load_iris()
X, y = iris.data, iris.target

# Split data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Create pipeline
pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('clf', LogisticRegression(random_state=42))
])

# Train pipeline
pipeline.fit(X_train, y_train)

# Save pipeline to disk
joblib.dump(pipeline, 'iris_pipeline.joblib')

# Load pipeline from disk
loaded_pipeline = joblib.load('iris_pipeline.joblib')

# Predict with original and loaded pipeline
original_preds = pipeline.predict(X_test)
loaded_preds = loaded_pipeline.predict(X_test)

# Check if predictions are the same
predictions_match = np.array_equal(original_preds, loaded_preds)

print(f'Predictions match after loading: {predictions_match}')
Added code to save the trained pipeline using joblib.dump() to a file named 'iris_pipeline.joblib'.
Added code to load the pipeline back using joblib.load() from the saved file.
Compared predictions from the original and loaded pipeline to verify they match.
Results Interpretation

Before saving: The pipeline existed only in memory and would be lost after program ends.

After saving and loading: The pipeline is stored on disk and can be reloaded to make predictions without retraining.

This is confirmed by identical predictions on test data before and after loading.

Saving and loading pipelines with joblib or pickle allows you to reuse trained models easily, saving time and ensuring consistent results.
Bonus Experiment
Try saving and loading the pipeline using pickle instead of joblib. Compare file sizes and loading speed.
💡 Hint
Use pickle.dump() and pickle.load() with open files in binary mode. Joblib is often faster and produces smaller files for large numpy arrays.

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()