9.4 Export Oracle Machine Learning for Python Models
You can export an oml
model from Python and then score it in SQL.
Export a Model
With the export_sermodel
function of an OML4Py algorithm model, you can export the model in a serialized format. You can then score that model in SQL. To save a model to a permanent table, you must pass in a name for the new table. If the model is partitioned, then you can optionally select an individual partition to export; otherwise all partitions are exported.
Note:
Any data transformations you apply to the data for model building you must also apply to the data for scoring with the imported model.Example 9-2 Export a Trained oml.svm Model to a Database Table
This example creates the x
and y
variables using the iris data set. It then creates the persistent database table IRIS and the oml.DataFrame
object oml_iris
as a proxy for the table.
This example preprocesses the iris
data set and splits the data set into training data and test data. It then fits an oml.svm
model according to the training data of the data set, and saves the fitted model in a serialized format to a new table named svm_sermod in the database.
import oml
import pandas as pd
from sklearn import datasets
# Load the iris data set and create a pandas.DataFrame for it.
iris = datasets.load_iris()
x = pd.DataFrame(iris.data,
columns = ['Sepal_Length','Sepal_Width',
'Petal_Length','Petal_Width'])
y = pd.DataFrame(list(map(lambda x:
{0: 'setosa', 1: 'versicolor',
2:'virginica'}[x], iris.target)),
columns = ['Species'])
try:
oml.drop('IRIS')
oml.drop('IRIS_TEST_DATA')
except:
pass
# Create the IRIS database table and the proxy object for the table.
oml_iris = oml.create(pd.concat([x, y], axis=1), table = 'IRIS')
df = oml.sync(table = "IRIS").pull()
# Add a case identifier column.
df.insert(0, 'ID', range(0,len(df)))
# Create training data and test data.
IRIS_TMP = oml.push(df).split()
train_x = IRIS_TMP[0].drop('Species')
train_y = IRIS_TMP[0]['Species']
test_dat = IRIS_TMP[1]
# Create the iris_test_data database table.
oml_test_dat = oml.create(test_dat.pull(), table = "IRIS_TEST_DATA")
# Create an oml SVM model object.
svm_mod = oml.svm('classification',
svms_kernel_function =
'dbms_data_mining.svms_linear')
# Fit the SVM model with the training data.
svm_mod = svm_mod.fit(train_x, train_y, case_id = 'ID')
# Export the oml.svm model to a new table named 'svm_sermod'
# in the database.
svm_export = svm_mod.export_sermodel(table='svm_sermod')
type(svm_export)
# Show the first 10 characters of the BLOB content from the
# model export.
svm_export.pull()[0][1:10]
Listing for This Example
>>> import oml
>>> import pandas as pd
>>> from sklearn import datasets
>>>
>>> # Load the iris data set and create a pandas.DataFrame for it.
... iris = datasets.load_iris()
>>> x = pd.DataFrame(iris.data,
... columns = ['Sepal_Length','Sepal_Width',
... 'Petal_Length','Petal_Width'])
>>> y = pd.DataFrame(list(map(lambda x:
... {0: 'setosa', 1: 'versicolor',
... 2:'virginica'}[x], iris.target)),
... columns = ['Species'])
>>>
>>> try:
... oml.drop('IRIS')
... oml.drop('IRIS_TEST_DATA')
...except:
... pass
>>> # Create the IRIS database table.
... oml_iris = oml.create(pd.concat([x, y], axis=1), table = 'IRIS')
>>>
>>> df = oml.sync(table = "IRIS").pull()
>>>
>>> # Add a case identifier column.
... df.insert(0, 'ID', range(0,len(df)))
>>>
>>> # Create training data and test data.
... IRIS_TMP = oml.push(df).split()
>>> train_x = IRIS_TMP[0].drop('Species')
>>> train_y = IRIS_TMP[0]['Species']
>>> test_dat = IRIS_TMP[1]
>>>
>>> # Create the iris_test_data database table.
... oml_test_dat = oml.create(test_dat.pull(), table = "IRIS_TEST_DATA")
>>>
>>> # Create an oml SVM model object.
... svm_mod = oml.svm('classification',
... svms_kernel_function =
'dbms_data_mining.svms_linear')
>>>
>>> # Fit the SVM model with the training data.
... svm_mod = svm_mod.fit(train_x, train_y, case_id='ID')
>>>
>>> # Export the oml.svm model to a new table named 'svm_sermod'
... # in the database.
... svm_export = svm_mod.export_sermodel(table='svm_sermod')
>>> type(svm_export)
<class 'oml.core.bytes.Bytes'>
>>>
>>> # Show the first 10 characters of the BLOB content from the
... # model export.
... svm_export.pull()[0][1:10]
b'\xff\xfc|\x00\x00\x02\x9c\x00\x00'
Import a Model
In SQL, you can import the serialized format of an OML4Py model into an Oracle Machine Learning for SQL model with the DBMS_DATA_MINING.IMPORT_SERMODEL
procedure. To that procedure, you pass the BLOB content from the table to which the model was exported and the name of the model to be created. The import procedure provides the ability to score the model. It does not create model views or tables that are needed for querying model details. You can use the SQL function PREDICTION
to apply the imported model to the test data and get the prediction results.
Example 9-3 Import a Serialized SVM Model as an OML4SQL Model in SQL
This example retrieves the serialized content of the SVM classification model from the svm_sermod table. It uses the IMPORT_SERMODEL
procedure to create a model named my_iris_svm_classifier with the content from the table. It also predicts test data saved in the iris_test_data table with the newly imported model my_iris_svm_classifier, and compares the prediction results with the target classes.
-- After starting SQL*Plus as the OML4Py user.
-- Import the model from the serialized content.
DECLARE
v_blob blob;
BEGIN
SELECT SERVAL INTO v_blob FROM "svm_sermod";
dbms_data_mining.import_sermodel(v_blob, 'my_iris_svm_classifier');
END;
/
-- Set the output column format.
column TARGET_SPECIES format a15
column PREDICT_SPECIES format a15
-- Make predictions and display cases where mod(ID,3) equals 0.
SELECT ID, "Species" AS TARGET_SPECIES,
PREDICTION(my_iris_svm_classifier USING "Sepal_Length", "Sepal_Width",
"Petal_Length", "Petal_Width")
AS PREDICT_SPECIES
FROM "IRIS_TEST_DATA" WHERE MOD(ID,3) = 0;
-- Drop the imported model
BEGIN
DBMS_DATA_MINING.DROP_MODEL(model_name => 'my_iris_svm_classifier');
END;
/
The prediction produces the following results.
ID TARGET_SPECIES PREDICT_SPECIES
-- -------------- ---------------
0 setosa setosa
24 setosa setosa
27 setosa setosa
33 setosa setosa
36 setosa setosa
39 setosa setosa
48 setosa setosa
54 versicolor versicolor
57 versicolor versicolor
93 versicolor versicolor
114 virginica virginica
120 virginica virginica
132 virginica virginica
13 rows selected.