Example Prince PCA deployment
In this example we'll train a sklearn.linear_model.LogisticRegression
on the output
of a prince
Principal Component Analysis
that reduces the factors of the
Iris sample dataset from 4 to 2.
First, import and log in to Modelbit:
import modelbit
mb = modelbit.login()
We'll reduce the four primary features (Sepal length
, Sepal width
, Petal length
,
and Petal width
) of the Iris dataset to two latent features (n_components=2
) using PCA:
import pandas as pd
import prince
from sklearn import datasets, linear_model
X, y = datasets.load_iris(return_X_y=True)
X = pd.DataFrame(
data=X,
columns=['Sepal length', 'Sepal width', 'Petal length', 'Petal width'])
pca = prince.PCA(
n_components=2,
n_iter=3,
rescale_with_mean=True,
rescale_with_std=True,
copy=True,
check_input=True,
engine='auto',
random_state=42
)
pca = pca.fit(X)
Then we'll train a LogisticRegression
on the Iris dataset, after it's been transformed by Prince:
lr = linear_model.LogisticRegression()
lr.fit(pca.transform(X), y)
Finally, we'll make a deployment function with a couple unit tests that
returns the predicted name of the flower. Since we are defining label_dict
outside of the deployment
function Modelbit will automatically include it as a dependency in the deployment:
label_dict = {0: 'Setosa', 1: 'Versicolor', 2: 'Virginica'}
def predict_with_prince(flower_features) -> str:
"""
This deployment uses Prince PCA and a LogisticRegression to predict flower types
>>> predict_with_prince({"Sepal length": [5.1], "Sepal width": [3.5], "Petal length": [1.4], "Petal width": [0.2]})
"Setosa"
>>> predict_with_prince({"Sepal length": [6.7], "Sepal width": [3.0], "Petal length": [5.2], "Petal width": [2.3]})
"Virginica"
"""
input_df = pd.DataFrame.from_dict(flower_features)
input_pca = pca.transform(input_df)
return label_dict[lr.predict(input_pca)[0]]
mb.deploy(predict_with_prince, python_packages=["prince==0.6.3", "scikit-learn==0.23.2"], python_version="3.7")
The deployment can then be called from REST, Snowflake, and Redshift.